-
Delete와 Undefined, 그리고 garbage collectorJava Script 2022. 2. 12. 21:34
멘티 님이 궁금해하던 질문에 대답하려고 하다보니 엄청 깊게 들어와 버려서 정리한다!
의도적으로 값이 비어있음을 나타낼 때 사용하는 null은 'null' 이라는 글자의 사이즈만큼만 메모리를 사용한다.
하지만 선언한 후 값을 할당하지 않았음을 뜻하는 undefined는 실제 메모리를 차지한다. (여기부터 흥미롭다)delete 는 피연산자로 지정된 객체의 프로퍼티를 삭제해준다. 그러니까 객체를 통째로 삭제할 수는 없고 해당 프로퍼티만 삭제해주는 것이다. delete가 삭제해준 프로퍼티는 undefined를 값으로 가지며, var 로 정의한 (명시적으로 선언한) 프로퍼티들은 삭제할 수 없다.
var hello = { name: 'sj', age: '20', } delete hello.age; // age라는 프로퍼티를 삭제하니 true가 반환된다. typeof hello.age; // delete의 성공으로 존재하지 않는 프로퍼티이기 때문에 undefined가 반환된다. delete hello; // var로 선언된 변수는 삭제할 수 없다. var fruits = new Array('apple', 'banana', 'orange', 'mango'); delete fruits[2]; // index가 2일 때의 프로퍼티를 삭제하니 true가 반환된다. 2 in fruits; // false. 2라는 property는 제거됨. fruits.hasOwnProperty('3'); // 13줄과 같음.
하지만 여기서 함정은 undefined는 null과는 다르게 실제로 메모리를 필요로 한다는 것이다.
자바스크립트는 C, C++ 과는 다르게 자기가 알아서 사용하지 않는 (= 해제된) 메모리를 찾아다니면서 청소해준다.
이를 garbage collector라고 하는데, 가비지 컬렉터를 궁극의 청소방법!!! 이라고 하긴 어렵다. 왜냐하면 가비지 콜렉터는 자신이 도달 불가능한 값(unreachable, root에 없거나 root가 참조할 수 없는 값)을 사용하지 않는 메모리라고 판단하는 표시 & 쓸기 (mark & sweep) 알고리즘으로 돌아가기 때문이다. 그리고 현재 사용하지 않는 메모리가 언제 다시 사용될지 결정할 수 없는 것(undecidable)도 가비지컬렉터가 내가 필요로 하는 메모리를 100% 해제해주리라고 기대할 수 없는 이유이다.참고자료:
1. 모던 javascript 튜토리얼: 가비지 컬렉션2. stack overflow: Does null occupy memory in javascript?
3. mdn: in 연산자
4. mdn: 자바스크립트의 메모리 관리
5. mdn: delete 연산자
6. 데꾸벅의 정리되지 못한 생각들: 자바스크립트 delete 연산자에 대한 고찰
7. Toast UI: 당신이 모르는 자바스크립트의 메모리 누수의 비밀
'Java Script' 카테고리의 다른 글
string 의 길이 제한, 근데 언어별로 길이가 다르다면..? (0) 2022.10.12 [string] slice() vs substring() (0) 2022.05.23 커링_ Currying (0) 2021.05.06 Toy project - 카드맞추기 게임 (0) 2021.04.14 Toy Project - 계산기 (0) 2021.04.14