- 변수가 필요한 이유는 무엇이며, 값이 재할당 될 경우 자바스크립트 엔진은 어떤 일을 수행하나요?
컴퓨터는 메모리를 사용해 데이터를 기억한다. 하지만 저장된 데이터를 사용하기 위해 메모리 주소를 통해 데이터에 직접 접근하는 것은 치명적인 오류를 발생시킬 수 있어서 자바스크립트는 개발자가 직접적인 메모리 제어를 하지 못하도록 되어 있다.
- 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름이다. 변수는 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행된다. 따라서 개발자는 변수를 통해 직접 메모리 주소를 제어하지 않고 안전하게 값을 저장하고 참조할 수 있다.
- 재할당이란 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것이다. 자바스크립트에서 변수를 재할당하게 되면 저장되어 있던 메모리 공간을 지우고 그 공간에 재할당 값을 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그 공간에 재할당 값을 저장한다. 이 때 재할당 되기 이전의 값들은 가비지 콜렉터에 의해서 메모리에서 자동 해제된다.
- var, let, const 키워드로 선언한 변수들의 특징은 무엇인가요?
var
Es5까지 변수를 선언할 수 있는 유일한 키워드였지만 오류를 일으킬 특징이 있어서 ES6에서 let, const 키워드가 새롭게 등장했다.
- var 키워드는 중복 선언을 허용한다. 초기화문이 있는 경우 var 키워드가 없는 것처럼 동작하고 초기화문이 없으면 선언문 자체를 무시한다.
- var 키워드는 함수 레벨 스코프로 오로지 함수의 코드 블록만을 지역 스코프로 인정한다. 따라서 함수 외부에서 var 키워드로 선언한 변수는 코드 블록 내에서 선언해도 모두 전역 변수가 된다.
- var 키워드는 변수 호이스팅에 의해 변수 선언문이 스코프의 선두로 끌어 올려진 것처럼 동작한다. 즉, 변수 호이스팅에 의해 var 키워드로 선언한 변수는 변수 선언문 이전에 참조할 수 있다.
let
- var 키워드가 변수를 중복 선언할 수 있어서 의도치 않은 오류를 만들어내는 문제를 해결하고자 let 키워드는 같은 변수를 중복 선언하면 문법 에러(SyntaxError)가 발생하게 했다. 즉, let 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용하지 않는다.
- let 키워드는 var 키워드와 달리 블록 레벨 스코프를 따른다. 즉 let 키워드로 선언된 변수는 모든 코드 블록(함수, if 문, for 문, while문 등)을 지역 스코프로 인정한다.
- var 키워드는 선언 단계와 초기화 단계가 한번에 진행되어 변수 호이스팅이 발생하지만 let 키워드는 초기화 단계가 변수 선언문에 도달했을 때 실행된다. 따라서 초기화 단계가 실행되기 이전에 변수에 접근을 시도하면 참조 에러가 발생한다. 이는 let 키워드로 선언한 변수는 변수 호이스팅이 발생하지 않는 것처럼 보이게 한다.
const
const 키워드는 상수(constant)를 선언하기 위해 사용한다. let과 마찬가지로 중복 선언을 허용하지 않고 블록 레벨 스코프를 따르며 변수 호이스팅이 발생하지 않는다.
- const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화해야한다. 변수 이름은 대문자로 선언해 상수임을 나타낸다.
- 상수는 재할당이 금지된 변수를 말한다. 즉, const 키워드는 재할당이 금지된다.
- const로 선언된 변수에 객체를 할당한 경우에는 값을 바꿀수 있다. 객체는 변경 가능한 값이므로 재할당 없이도 직접 변경이 가능하기 때문이다.