JavaScript 원시값의 비밀: undefined와 null은 메모리를 차지할까?

    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를 잠깐 가리켰다가 다른 값으로 바뀐 것뿐입니다.

     

     

    정리

    1. undefined, null, true, false는 엔진이 시작할 때 하나만 생성하고 공유한다
    2. 변수에 undefined가 할당되는 건 새로운 메모리 할당이 아니라, 기존 undefined를 가리키는 것
    3. 이 원시값들은 GC 대상이 아니며, 엔진이 종료될 때까지 메모리에 존재한다
    4. 객체는 생성할 때마다 새로운 메모리를 차지하고, 참조가 끊기면 GC 대상이 된다

    이런 최적화 덕분에 undefined나 null을 아무리 많이 사용해도 메모리 걱정을 할 필요가 없습니다.

    728x90
    반응형
    LIST

    댓글