모던자바스크립트 책을 여러 번 읽으면서, 각 챕터마다 간단히 정리할 수 있으면 좋겠다는 생각을 했다. 본 4장은 기본적인 내용이지만 다시 한 번 상기해보고자 한다.
4.1 변수가 필요한 이유
아무 프로그래밍 언어라도 처음 배울 때에는 변수를 빼 놓고 배우지는 않을 것이다. 그럴 만큼 변수는 프로그래밍 언어를 이용하여 개발을 하는 데 있어 정말 기초적이고 필수적인 부분이 되었다. 그런데 이 변수가 왜 필요할까에 대한 근본적인 의문을 가지게 된다면 답하기 쉽지 않다. 변수 없이는 개발이 불가능할까?
파이썬을 처음 배울 때 print() 함수만 사용하여 코딩한 적이 있을 것이다.
1
print("Hello Python!")
이런 코드 말이다. 그런데 이런 코드로는 사칙연산을 할 수도 없고 사용자가 입력받은 값에 대한 기억을 할 수도 없다.
그래서 우리는 다음과 같은 코드를 사용하곤 한다.
1
2
3
4
a = 3
b = 4
c = a + b
print(c)
- 변수에 값을 저장하는 것을 할당(assignment), 대입, 저장이라고 한다.
- 변수에 저장된 값을 읽어 들이는 것을 참조(reference)라고 한다.
4.2 식별자(identifier)
- 어떤 값을 구별해서 식별할 수 있는 고유한 이름이다.
- 식별자는 값이 아니라 메모리 주소를 기억하고 있다. 그래서 메모리 주소에 붙인 이름이라고 할 수 있다.
- 변수 이름을 식별자라고도 하지만, 식별자라는 용어는 변수 이름에만 국한해서 사용하지 않는다. 변수, 함수, 클래스 등의 이름은 모두 식별자이다. 메모리 상에 존재하는 어떤 값을 식별할 수 있기 때문이다.
4.3 변수 선언(variable declaration)
값을 저장하기 위한 메모리 공간을 확보(allocate)하고, 변수 이름과 확보된 메모리 공간의 주소를 연결(name binding) 해서, 값을 저장할 수 있게 준비하는 것이다.
자바스크립트 엔진은 변수 선언을 다음과 같은 두 단계에 걸쳐 수행한다.
1) 선언 단계 : 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.
2) 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고, 암묵적으로 undefined를 할당해 초기화한다.
4.4 변수 호이스팅(variable hoisting)
자바스크립트 엔진은 변수 선언이 소스코드의 어디에 있든 상관없이, 다른 코드보다 먼저 실행한다.
1 2
console.log(score); // undefined var score; // 변수 선언문
위 코드는 참조 에러(ReferenceError)가 발생하지 않고, undefined가 출력된다.
변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 말한다.
변수 선언뿐 아니라, var, let, const, function, function*, class 키워드를 사용해서 선언하는 모든 식별자(변수, 함수, 클래스, …)는 호이스팅된다. (모든 선언문은 런타임 이전 단계에서 먼저 실행되기 때문)