변수(variable)란 값을 저장하기 위해 확보한 메모리 공간이며, 이를 식별하기 위해 붙인 이름을 의미합니다. 변수는 값이 저장된 메모리 공간에 붙여진 상징적인 이름으로, 메모리 주소(0xFFFFFFFF 등)에 변수명이 매칭됩니다. 변수에 값을 저장하는 것을 할당(assignment), 변수에 저장된 값을 읽어 들이는 것을 참조(reference)라고 합니다. 식별자는 메모리 주소에 붙인 이름으로 값이 아니라 메모리 주소를 기억하고 있으며, 선언 시 네이밍 규칙을 준수해야 합니다.
변수 선언
변수는 var, let, const 키워드 사용하여 선언할 수 있으며, let과 const 는 ES6에서 도입되었습니다. 변수 선언은 다음 두 가지 단계를 거칩니다.
- 선언 단계: 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알립니다.
- 초기화 단계: 값을 저장하기 위한 메모리 공간을 확보합니다. var키워드는 undefined로 초기화되지만, let과 const는 선언 후 즉시 초기화되지 않기 때문에 초기화 전에 접근하면 TDZ(Temporal Dead Zone)에 의해 참조 에러가 발생합니다.
실행 컨텍스트: 변수 이름이 등록되는 곳
실행 컨텍스트는 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고, 코드의 실행 결과를 실제로 관리하는 영역입니다. 실행 컨텍스트를 통해 식별자와 스코프를 관리하며, 이때 키벨류 형식의 객체로 등록되어 관리합니다.
호이스팅
호이스팅은 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 것입니다. 변수 선언은 소스 코드가 순차대로 실행되는 런타임 시점이 아니라, 그 이전 단계에서 먼저 실행됩니다. 변수 선언을 포함한 모든 선언문이 호이스팅의 대상이며, var, let, const, function, function*, class 키워드가 있습니다. 키워드 중 var, function, function*은 선언과 동시에 초기화가 되기 때문에 TDZ 없이 선언문 이전에 참조가 가능합니다.
이를 통해, 자바스크립트에서는 선언과 할당은 따로 진행된다는 것을 알 수 있습니다. 선언과 할당을 동시에 표현해도 선언은 런타임 이전에, 할당은 런타임에 실행됩니다. var키워드 처럼 undefined로 초기화가 되고 값이 할당될 때, 변수에 undefined 값이 있던 메모리와 연결이 끊기고 할당된 값이 저장된 메모리 주소와 새로 연결됩니다.
가비지 콜렉터
변수에 값을 할당한다는 것은 새로운 값이 저장된 메모리 주소를 새롭게 연결한다는 뜻입니다. 이렇게 되면 사용되지 않는 메모리 공간들이 많아질텐데요, 가비지 콜렉터는 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제하는 기능을 말합니다. 사용되지 않는다는 것은 어떤 식별자도 참조하지 않는다는 의미하며, 이렇게 언어 차원에서 메모리를 관리해주는 언어를 매니지드 언어라고 합니다.
식별자 네이닝 규칙
식별자를 사용할 때 지켜야 하는 규칙을 네이밍 규칙이라고 하며, 규칙들은 다음과 같습니다.
- 특수문자를 제외한 문자, 숫자, 언더스코어, 달러기호 포함 가능
- 숫자로 시작하는 것은 허용되지 않음
- 예약어는 사용 불가능
네이밍 컨벤션
가독성 좋게 단어를 구분하기 위해 규정한 명명 규칙으로 4가지 종류가 있습니다.
- 카멜케이스 firstName
- 스네이크케이스 first_name
- 파스칼케이스 FirstName
- 헝가리언 케이스 strFirstName (type + identifier)