자바스크립트 엔진의 변수 선언과 메모리 관리
자바스크립트를 사용하며 기본적인 변수 선언, 메모리 관리, 실행컨텍스트가 변수를 관리하는 방법과 가비지 컬렉터의 역할에 대해 알아보겠습니다.
자바스크립트에서 변수를 선언하는 방법은 var
, let
, const
가 있다. 자바스크립트의 개발자의 직접적인 메모리 제어를 허용하지 않으므로 우리가 변수를 선언할 때, 내부적으로 어떻게 동작하는지 이해하고 활용할 필요가 있다.
변수선언이란?
값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것을 지칭한다.
- 선언 단계 : 변수 이름을 실행 컨텍스트(key, value의 객체 형태로)에 등록한다.
- 초기화 단계 : 변수 이름과 메모리 공간을 연결하고, undefined로 할당해 초기화한다.
console.log(a); // undefined
var a = 10;
위 예제에서 console.log의 결과값은 undefined이다. 왜 일까? 이유는 변수 선언 시점이 런타입이 아니라 그 이전 단계에 실행되기 때문이다.
- 소스코드 평가 : 모든 선언문을 실행 컨텍스트에 등록한다.
- 소스코드 실행(런타임) : 등록된 변수를 참조하고 값을 할당한다.
우리는 이처럼 변수 선언문이 코드의 선두로 끌어 올려져 동작하는 자바스크립트의 고유한 특징을 호이스팅이라고 부른다.
let a = 10;
a =30;
위와 같이 변수를 선언하고 값을 할당하면, 변수 a는 메모리 공간을 차지하게 된다. 이때, 변수 a가 차지하던 메모리 공간을 더 이상 사용하지 않게 되면, 가비지 콜렉터가 이를 감지하고 메모리 공간을 해제한다.
- 가비지 콜렉터는 더 이상 사용되지 않는 메모리 공간을 탐지하고 해제하는 역할을 한다.
- 자바스크립트 엔진은 가비지 콜렉터를 통해 메모리 누수를 방지한다.