source: yes24
책 Modern Javascript Deep Dive 4, 5장 내용 정리
변수란 무엇인가?
변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체, 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다. 컴퓨터는 사람의 뇌처럼 연산에 필요한 데이터를 메모리 공간에 저장해놓고 연산할 때마다 메모리 주소에 있는 값을 참조하여 사용한다. 그렇게 하려면 메모리 공간의 주소를 알고 있어야 하는데, 변수는 메모리 주소를 가리킨다. 변수는 즉 값의 위치를 가리키는 이름이다.
변수 이름
식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다. 나라는 사람을 '홍두깨'라고 불러서 구분하는 것처럼 메모리에 저장된 값을 식별할 수 있는 이름을 '변수 이름'이라 한다. 그리고 변수에 저장된 값을 '변수 값'이라 한다. 식별자와 메모리 주소는 매핑되어 있으며, 이 매핑 정보 또한 메모리에 저장된다. 따라서 식별자가 가리키는 것은 변수가 아니라 메모리의 주소다. 만약 C언어를 해봤다면 포인터를 떠올려 보면 이해하기 쉬울 것 같다.
변수 이름을 비롯한 함수, class명 등은 모두 *실행 컨텍스트에 key-value 형태로 등록된다.
*실행 컨텍스트: 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고, 코드 실행 결과를 관리하는 영역이다. 자바스크립트 엔진은 실행 콘텍스트를 통해 식별자, 스코프를 관리한다.
선언과 할당
선언은 변수를 생성하는 것이다. 메모리 공간을 확보하고, 변수 이름과 메모리 주소를 연결해서 값을 저장할 수 있게 준비한다. 만약 값을 할당하지 않는다면 자바스크립트 엔진이 암묵적으로 undefined로 초기화한다. 할당은 변수에 값을 저장하는 것을 말하며, 변수에 저장된 값을 읽는 것을 참조라고 한다.
변수 호이스팅
변수 선언은 런타임 이전 단계인 평가 과정에 실행된다. 자바스크립트 엔진이 소스코드를 한 줄씩 순차 실행하기 전 소스코드 평가 과정을 통해 소스 코드 실행을 준비한다. 자바스크립트 엔진은 변수, 함수 등 모든 선언문을 찾아내 먼저 실행한다. 그래서 변수 선언이 할당보다 더 뒤에 있어도 ReferenceError가 나지 않고 undefined로 평가된다. 변수 선언이 다른 코드보다 더 앞서 실행되기 때문에 뒤에 있는 변수 선언문이 위로 끌어올려진 것 같은 느낌을 주어 끌어올리는 장치인 호이스트의 이름을 따 변수의 호이스팅이라고 한다.
변수 할당
할당의 특이한 점은 할당할 때마다 기존의 메모리 주소를 그대로 사용해 덮어씌우지 않고 새로운 메모리 주소에 값을 저장한다는 것이다. 예전에 저장한 값들은 자바스크립트 내의 가비지 콜렉터(Garbage Collector)에 의해 자동으로 해제된다.
*가비지 콜렉터: 메모리 공간을 주기적으로 검사해서 더 이상 사용하지 않는 메모리를 해제하는 기능
표현식과 문
•
값: 표현식이 평가되어 생성된 결과
•
리터럴: 사람이 이해할 수 있는 문자나 약속된 기호로 값을 생성하는 표기법. 정수, 문자열 말고도 boolean, null, undefined, 객체, 배열, 함수, 정규 표현식 등 다양한 리터럴이 있다.
•
표현식: 값으로 평가될 수 있는 문. 표현식이 평가되면 새로운 값을 생성하거나 기존 값 참조.
•
명령문(statement): 실행할 수 있는 최소 단위.