728x90
반응형
SMALL

JavaScript 원시값의 비밀: undefined와 null은 메모리를 차지할까?
의문의 시작
변수에 null을 재할당하면 이전 객체는 GC(Garbage Collection) 대상이 된다고 알고 있습니다. 그렇다면 var 변수의 초기값인 undefined도 GC가 수거하는 걸까요?
var x = { name: 'kim' };
x = null; // { name: 'kim' }은 GC 대상
// 그럼 처음의 undefined는?
결론부터 말하면, undefined는 GC 대상이 아닙니다.
자바스크립트 엔진의 원시값 관리
자바스크립트 엔진은 시작할 때 특별한 원시값들을 딱 하나만 만들어두고 전역에서 공유합니다.
공유되는 원시값들
- undefined
- null
- true
- false
var a;
var b;
var c;
// 이 세 변수의 undefined는 전부 같은 하나의 undefined를 가리킴
console.log(a === b); // true
console.log(b === c); // true
매번 새로운 undefined를 생성하는 게 아니라, 엔진에 이미 존재하는 하나의 undefined를 가리키는 것입니다.
객체와의 차이
객체는 다릅니다. 생성할 때마다 새로운 메모리 공간을 차지합니다.
const obj1 = { value: 1 };
const obj2 = { value: 1 };
console.log(obj1 === obj2); // false (서로 다른 메모리)
타입 생성 방식 메모리
| 타입 | 생성 방식 | 메모리 |
| undefined, null, true, false | 엔진 시작 시 1개 생성 | 공유 |
| 객체, 배열, 함수 | 생성할 때마다 새로 | 각각 차지 |
null 재할당 시 실제로 일어나는 일
var x = { name: 'kim' }; // 1. 객체 생성, x가 참조
x = null; // 2. x가 전역 null을 가리킴
| 대상 | 결과 |
| { name: 'kim' } | 참조 끊김 → GC 수거 대상 |
| null | 새로 생성된 게 아님, 원래 있던 null을 가리킴 |
var의 초기 undefined는?
var x; // undefined를 "가리킴" (새로 생성 X)
x = { a: 1 }; // 객체 생성, x가 참조
x = null; // 객체 참조 끊김
처음의 undefined는 "메모리에서 사라진다"는 개념이 아닙니다.
엔진에 항상 존재하는 undefined를 잠깐 가리켰다가 다른 값으로 바뀐 것뿐입니다.
정리
- undefined, null, true, false는 엔진이 시작할 때 하나만 생성하고 공유한다
- 변수에 undefined가 할당되는 건 새로운 메모리 할당이 아니라, 기존 undefined를 가리키는 것
- 이 원시값들은 GC 대상이 아니며, 엔진이 종료될 때까지 메모리에 존재한다
- 객체는 생성할 때마다 새로운 메모리를 차지하고, 참조가 끊기면 GC 대상이 된다
이런 최적화 덕분에 undefined나 null을 아무리 많이 사용해도 메모리 걱정을 할 필요가 없습니다.
728x90
반응형
LIST
'javascript' 카테고리의 다른 글
| 클로저 vs 클래스 private: 메모리 효율 차이 (0) | 2026.01.24 |
|---|---|
| JavaScript 클래스: 생성자 함수 vs 클래스(static,public,private) 문법 (0) | 2026.01.24 |
| 이벤트 캡처링, 버블링 그리고 disabled vs readonly (1) | 2026.01.22 |
| 브라우저 vs Node.js: JavaScript 실행 환경의 차이 (1) | 2026.01.21 |
| JavaScript 실행 방식: 컴파일러 vs 인터프리터 vs JIT (0) | 2026.01.21 |
댓글