Frontend/JS.info 정리

객체 : 기본 - 가비지 컬렉션

Creative_Lee 2021. 12. 16. 22:47

자바스크립트에서 우리가 만든 모든 것 ( 원시값, 객체 , 함수 등 ) 들은 메모리를 차지합니다.

자바스크립트 엔진 안에서는 우리가 만든 것중

더 이상 쓸모 없어진 것 들을 처리하는 가비지 컬렉터 ( garbage collector ) 가 끊임없이 동작합니다 !

 

가비지 컬렉션 기준

자바스크립트는 도달 가능성 이라는 개념을 통해 메모리 관리를 합니다.

 

도달 가능한 값은 어떻게든 접근,사용이 가능한 값을 의미하는데,

도달 가능한 값이라면 메모리에서 삭제되지 않습니다. 

 

root( 루트 )

root라고 불리는 값들은 태생부터 도달 가능한 값 이기 때문에 명백한 이유 없이 삭제되지 않습니다.

 

root 의 예시

1. 현재 함수의 지역 변수와 매개변수

2. 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수

3. 전역 변수

 

그 외

root가 참조하는 값이나 root에서 참조할 수 있는 값도달 가능한 값이 됩니다.

ex. 전역 변수에 객체가 저장되어 있다고 가정 했을 때, 이 객체의 프로퍼티가 또 다른 객체를 참조 한다면,

     프로퍼티가 참조하는 객체는 도달 가능한 값입니다.

     이 객체가 참조하는 다른 모든 것도 도달 가능한 값입니다.

 

 

가비지 컬랙터 데이터 삭제 예시

 

참조가 2개라면?

let user = {
  name : 'Lee'
}

let clone = user

user = null

console.log(clone.name) // Lee

user.name으로 Lee에 접근하는 방법은 사라졌지만,
clone.name으로 Lee에 접근하는 방법은 가능하기 때문에
객체는 메모리에서 삭제되지 않습니다.

 

 

복잡한 관계라면?

function relation(teacher, student) {
	teacher.student = student;
	student.teacher = teacher;

	return {
		sky: teacher,
		ground : student
	}
}
let teacherAndStudent = relation({name: 'An'},{name: 'Lee'})

console.log(teacherAndStudent.sky)	//{name: 'An', student: {…}}
console.log(teacherAndStudent.ground)	//{name: 'Lee', teacher: {…}}

매개 변수로 받은 두 객체를 서로 참조시켜 프로퍼티로 추가하고

두 객체를 포함하는 새로운 객체를 리턴하는 함수입니다.

결과와 같이 서로 스승과 제자의 관계로 이어져 있습니다.

 

현재 상태에서 제자인 Lee 에게 접근하는 방법은 이렇게 2가지가 있습니다

   1. teacherAndStudent.ground 

   2. teacherAndStudent.sky.student

 

만약 여기서 Lee의 참조 2개를 삭제하면 어떻게 될까요?

delete teacherAndStudent.ground
delete teacherAndStudent.sky.student

console.log(teacherAndStudent)		// {sky: {name: 'An'}}
console.log(teacherAndStudent.sky)	// {name: 'An'}
console.log(teacherAndStudent.ground)	// undefined

참조 2개를 삭제하는 순간 Lee로 접근할 수 있는 방법이 모두 사라져 
도달 가능한 상태가 아니게 됩니다.

 

 

기본이 중요하다.

'Frontend > JS.info 정리' 카테고리의 다른 글

객체: 기본 - new , constructor  (0) 2021.12.21
객체: 기본 - method 와 this  (0) 2021.12.19
객체: 기본 - 참조에 의한 객체 복사  (0) 2021.12.13
객체: 기본 - 객체  (0) 2021.12.09
코드 품질 - 바벨( Babel )  (0) 2021.12.09