꾸준히 합시다
모던 자바스크립트 Deep Dive 내용 정리 - 04장 변수 본문
4.1 변수란 무엇인가? 왜 필요한가?
- 메모리 주소를 통해 값에 직접 접근하는 것은 치명적 오류를 발생시킬 가능성이 높음. (예: 운영체제가 사용하고 있는 값을 실수로 변경하는 경우)
- 그렇기에 자바스크립트에서는 개발자의 직접적인 메모리 제어를 허용하지 않는다.
- 변수: 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름.
- 변수를 통한다면 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조할 필요가 없이 안전하게 값에 접근 가능.
- 할당(assignment, 대입, 저장): 변수에 값을 저장하는 것.
- 참조(reference): 변수에 저장된 값을 읽어 들이는 것.
4.2 식별자
- 식별자(identifier): 어떤 값을 구별해서 식별할 수 있는 고유한 이름.
- 자바스크립트에서 변수, 함수, 클래스 등의 이름은 모두 식별자이다.
- 식별자는 값이 아니라 메모리 주소를 기억하고 있다. (식별자=변수 이름=메모리 주소에 붙인 이름)
- 식별자는 값이 저장되어 있는 메모리 주소와 매핑 관계를 맺으며, 이 매핑 정보도 메모리에 저장되어야 한다.
4.3 변수 선언
- 변수 선언(variable declaration): 변수를 생성하는 것.
- 변수 선언은 값을 저장하기 위한 메모리 공간을 확보(allocate)하고 변수 이름과 확보된 메모리 공간의 주소를 연결(name binding)해서 값을 저장할 수 있게 준비하는 과정
- 변수를 사용하기 위해서는 반드시 선언이 필요하다.
- 만약 선언하지 않은 식별자에 접근하면 ReferenceError(참조 에러)가 발생한다.
- 이는 식별자를 통해 값을 참조하려 했지만 자바스크립트 엔진이 등록된 식별자를 찾을 수 없을 때 발생하는 에러이다.
- 선언 단계: 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.
- 초기화 단계: 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화한다.
- 변수 이름을 비롯한 모든 식별자는 실행 컨텍스트(execution context)에 등록된다.
- 자바스크립트 엔진은 실행 컨텍스트를 통해 식별자와 스코프를 관리한다.
4.4 변수 선언의 실행 시점과 변수 호이스팅
- 변수 선언은 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임(runtime)이 아니라 그 이전 단계에서 먼저 실행된다.
- 자바스크립트 엔진은 소스코드를 순차적으로 실행하기에 앞서 먼저 소스코드의 평가 과정을 거친다. (변수 선언을 포함한 모든 선언문을 소스코드에서 찾아내어 먼저 실행함)
- 평가 과정이 끝나면 비로소 변수 선언을 포함한 모든 선언문을 제외하고 소스코드를 한 줄씩 순차적으로 실행한다.
- 그렇기 때문에 변수 선언이 소스코드의 어디에 위치하는지와 상관없이 어디서든지 변수를 참조할 수 있다.
- 이처럼 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라 한다.
- 변수의 선언뿐 아니라 var, let, const, function, function*, class 키워드를 사용해서 선언하는 모든 식별자(변수, 함수, 클래스 등)는 호이스팅된다.
4.5 값의 할당
- 변수에 값을 할당할 때는 할당 연산자 =를 사용한다.
- 변수 선언과 값의 할당의 실행 시점이 다르기 때문에 주의하여야 한다.
- 변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.
4.6 값의 재할당
- var 키워드로 선언한 변수는 값을 재할당할 수 있다.
- var 키워드로 선언한 변수는 선언과 동시에 undefined로 초기화되기 때문에 사실상 변수에 처음으로 값을 할당하는 것도 재할당이다.
- 만약 값을 재할당할 수 없다면 변수가 아니라 상수(constant)이다.
- 자바스크립트에서는 const 키워드를 통해 상수를 표현할 수 있다.
- 변수에 값을 재할당하면 이전 값이 저장되어 있던 메모리 공간을 비우고 그 메모리 공간에 재할당 값을 저장하는 것이 아니라 새로운 메모리 공간에 새로운 값을 저장하게 된다.
- 식별자와 연결되어 있지 않은 값(참조카운트 0인 값)들은 가비지 콜렉터에 의해 메모리에서 자동 해제되지만 언제 해제될지는 예측할 수 없다.
- 자바스크립트는 매니지드 언어(managed language)로 메모리의 할당 및 해제를 위한 메모리 관리 기능을 언어 차원에서 담당하고 있다.
- 매니지드 언어는 개발자의 역량에 의존하는 부분이 상대적으로 작아져 어느 정도 일정한 생산성을 확보할 수 있지만 성능 면에서 어느 정도의 손실은 있을 수 있다.
References
- 이웅모. (2022). 모던 자바스크립트 Deep Dive. 위키북스.
'자바스크립트 기초' 카테고리의 다른 글
Array.prototype.sort() 특정 기준으로 정렬하기 + Sequelize ORM (0) | 2022.07.21 |
---|---|
var, let, const의 차이점 (0) | 2022.06.06 |
변수: 선언, 초기화, 할당 (0) | 2022.06.01 |
call by value, call by reference in JS (0) | 2021.12.21 |
스코프와 호이스팅 Scope and Hoisting (0) | 2021.12.03 |
Comments