
10 + 20;
위 식을 계산할 때 사람은 10, 20, +라는 기호의 의미를 알고 있어야 하고, A+B라는 식의 의미도 해석할 수 있어야 한다. 사람이 10 + 20이라는 식의 의미를 해석하면 + 기호의 의미대로 덧셈을 하기 위해 피연산자인 10, 20을 기억하고 덧셈의 결과인 30도 두뇌에 기억한다.
컴퓨터 역시 비슷하다. 먼저 10, 20, +라는 기호 (리터럴(literal)과 연산자(operator))의 의미를 알고 있어야 하며, A+B라는 식(표현식(expression))의 의미도 해석(파싱(parsing))할 수 있어야 한다.
사람은 계산과 기억을 모두 두뇌에서 하지만, 컴퓨터는 사람과 달리 연산과 기억을 수행하는 부품이 나눠져 있다. CPU를 사용해 연산하고, 메모리를 사용해 기억한다.
메모리는 컴퓨터가 데이터를 저장할 수 있는 메모리 셀(memory cell)의 집합체이다. 메모리 셀 하나의 크기는 1바이트(8비트)이며, 컴퓨터는 메모리 셀의 크기, 즉 1바이트 단위로 데이터를 저장하거나 읽어들인다.
각 셀은 고유의 메모리 주소를 갖고 이는 0부터 시작해 메모리 크기만큼 정수로 표현된다.
만약 연산 결과 30을 재사용하고 싶다면 메모리 주소를 통해 연산 결과 30이 저장된 메모리셀에 접근하는 것 외에 방법이 없다. 하지만 메모리 주소를 통해 값에 직접 접근하는 것은 치명적 오류를 발생시킬 수 있다. 따라서 자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는다.
따라서 프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어들여 재사용하기 위해 변수라는 메커니즘을 제공한다.
변수(variable) 는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다. 간단히 말해 값의 위치를 가리키는 상징적인 이름이다. 이를 식별하기 위한 고유한 이름을 변수명이라고 하고, 메모리 공간에 저장된 값을 변수 값이라고 한다. 변수에 값을 저장하는 것은 할당, 값을 읽어 들이는 것을 참조라 한다.
변수에 저장된 값의 의미를 파악할 수 있는 변수 이름은 가독성을 높이는 부수적인 효과도 있으므로 개발자의 의도를 잘 나타내도록 지어야한다.
변수 이름을 식별자(identifier)라고도 한다. 즉, 식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다.
변수 값은 메모리 공간에 저장되어 있고, 식별자는 이를 구별해서 식별해낼 수 있어야 한다. 이를 위해 식별자는 해당 값이 저장되어 있는 메모리 주소를 기억한다. 즉, 식별자는 값이 저장되어 있는 메모리 주소와 매핑관계를 맺으며, 이 매핑 정보 또한 메모리에 저장된다.
식별자라는 용어는 변수 뿐만 아니라 함수, 클래스 등의 이름 즉, 메모리 상에 존재하는 어떤 값을 식별할 수 있는 이름은 모두 식별자라고 부른다.
변수 선언은 변수를 생성하는 것을 말한다. 값을 저장하기 위한 메모리 공간을 확보하고, 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것이다.
변수를 사용하려면 반드시 선언이 필요하며 var, let, const 키워드를 사용해 선언한다.
var score; // 변수 선언
위처럼 변수를 선언하면 변수 이름을 등록하고 값을 저장할 메모리 공간을 확보한다. (이 때 변수 이름은 실행 컨텍스트라는 영역에 저장되고 이는 자바스크립트 엔진의 코드 실행을 돕기 위한 존재이다.) 변수를 선언한 이후 값을 할당하지 않으면 메모리 공간에는 undefined라는 값이 암묵적으로 할당되어 초기화한다.
즉, 자바스크립트 엔진의 변수 선언은 다음과 같은 2단계를 거친다
초기화는 변수 선언 이후 최초로 값을 할당하는 것을 말한다. var 키워드로 선언한 변수에는 값을 할당하지 않아도 암묵적으로 undefined가 할당되며 초기화되는데 이는 확보된 메모리 공간에 이전에 다른 애플리케이션이 사용한 값이 남아 있을 수 있기 때문이다. 이러한 값을 쓰레기 값이라 한다.