변수

김기한·2022년 4월 29일
0

javascript

목록 보기
2/3
post-thumbnail

변수란?


하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위한 이름이다. 값을 가지고 있는 메모리 공간에 대한 별명이라고 생각할 수 있다.

const sum = 30;

위의 예시로 30이라는 값은 0x000000F2 주소에 저장되어 있는 값이고, sum이라는 변수는 0x000000F2라는 메모리 주소의 별명으로 볼 수 있다. 변수에 값을 저장하는 것을 할당 이라고 하고, 변수에 저장된 값을 읽어 들이는 행위를 참조라고 한다.

식별자


식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다. 그림 1에서 sum이라는 식별자는 30이라는 값을 식별할 수 있었다. 변수가 값을 식별하기 위해서는 변수와 메모리 주소 간 매핑이 필요하다. 그렇기 때문에, 매핑 정보 역시 메모리에 저장되어 기억하고 있어야 한다.

자바스크립트 엔진은 선언 단계에서 식별자의 존재를 저장한다.

변수 선언


변수를 사용하기 위해선 반드시 선언 단계를 거쳐야 한다. 자바스크립트에서 변수를 선언하기 위해선 var const let 키워드를 이용하여 선언한다.

또한, 변수를 사용하기 이전에 메모리를 할당하고 undefined 값을 채워주는 초기화 단계와 실제 값을 저장하는 할당 단계가 존재한다. 할당 단계를 거치지 않고 초기화 과정만 거쳤을 경우에 값 참조 시 undefined 라는 값을 얻을 수 있다. 이것은 자바스크립트가 초기화 단계에서 메모리 공간을 확보하고 해당 주소에 undefined 라는 값을 채워넣기 때문이다.

만약 초기화 단계를 거치지 않은 변수를 참조할 경우, Reference Error 가 발생한다. 초기화 단계에서 메모리 공간을 확보하는 데, 식별자만 등록된 상태에서 식별자와 매핑되는 메모리 주소가 없을 경우 참조 시 쓰레기 값을 참조할 수 있기 때문이다.

호이스팅


런타임 이전에 미리 변수의 선언이 일어나는 것이다. 다음 예시를 보자.

console.log(score);
var score;

변수 선언문 이전에 score라는 변수를 참조하고 있는 코드이다. 결과는 참조 에러가 발생하지 않고 undefined를 출력한다. score라는 변수의 선언이 2번째 라인에 있는 변수 선언문을 실행하기 이전에 미리 호이스팅을 통해 선언이 일어나기 때문이다.

사실 선언만 일어나서는 참조 에러를 피할 수 없다. 식별자만 저장되었을 뿐, 그와 매핑되는 메모리 공간이 확보되지 않았기 때문이다. var 키워드를 통해 선언된 변수는 호이스팅 시 선언과 초기화 단계가 동시에 일어난다. 그렇기 때문에 undefined가 출력될 수 있는 것이다.

만약, score 변수가 var이 아닌 let, const로 선언된 변수일 경우, Reference Error가 발생한다.

값의 할당


할당 단계는 실제 코드가 순차적으로 실행되는 런타임에 일어난다. 식별자와 매핑되는 메모리 공간을 확보하고 undefined 라는 값을 채워 넣은 초기화 단계 이후에, 값을 할당할 경우 해당 공간과 다른 메모리 공간을 다시 확보한 후 그곳에 새로운 값을 할당한다. 식별자 역시 새로 확보된 공간과 매핑되고 재할당 역시 이와 동일한 과정을 거친다.

재할당 이전의 값을 갖고 있는 메모리 공간의 경우, 재할당 이후에는 메모리 공간을 가리키고 있는 포인터가 존재하지 않으므로 GC된다.

profile
vgihan's velog

0개의 댓글