이번에는 자바스크립트에서의 변수에 대해서 알아보려고 한다.
먼저 변수란 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 혹은 그 메모리 공간을ㄹ 식별하기 위해 붙인 이름이다. 즉, 값의 위치를 가르키는 상징적인 이름이다.
변수에서 값을 저장하는 것을 할당
이라고 하며 값을 읽는것은 참조
라고 한다.
식별자는 어떤값을 구별해서 식별할수 있는 고유한 이름을 말한다.즉, 변수의 이름을 뜻한다.
식별자는 그값을 가지고있는게 아니라 그 값의 메모리 주소를 기억하고 있는것이다.
변수,함수,클래스같은 식별자는 네이밍 규칙을 준수하여야 하고 선언
에 의해 자바스크립트 엔진에 식별자의 존재를 알린다.
변수 선언은 변수를 생성하는것을 말한다.
자세히 말하면 값을 저장하기 위한 메모리 공간을 확보하고 변수이름과 확보된 메모리의 주소를 연결해서 값을 저장할수 있게 준비한는 것이다.
변수를 사용하려면 반드시 선언을 해야하고, var,let,const 키워드를 통해 선언할수 있다.
변수 선언문은 변수이름을 등록
하며 저장할 메모리 공간을 확보한다. 이때 확보된 공간에는 자바스크립트 엔진에 의해 undefined값을 할당되며 초기화 된다.
변수선언시 자바스크립트 엔진의 동작
선언단계: 변수 이름을 등록하여 자바스크립트 엔진에 변수의 존재를 알린다.
초기화 단계 : 값을 저장하기위해 메모리공간을 확보한뒤 암묵적으로 undefined로 초기화
변수이름은 어디에 등록되는가??
변수이름을 비롯한 모든 식별자는 실행컨텍스트 에 등록된다. 실행 컨텍스트란 자바스크립트 엔진이 소스코드를 평가하고 실행하기위한 환경을 제공하고 코드의 실행결과를 관리하는 영역이다.
변수 선언이 실행되는 시점은 런타임때가 아니라 그 이전 평가과정에서 모든 선언문(변수,함수)들을 소스코드에서 찾아 먼저 실행한다.즉 변수선언이 소스코드의 어디에 있나 다른코드보다 먼저 실행 되는 것이다.
이러한 변수선언문이 코드의 선두로 끌어올려진것처럼 동작하는 자바스크립트의 특징을 변수 호이스팅
이라고 한다.
var
은 블록 레벨 스코프를 지원하지않기때문에 변수를 선언한다는것은 무조건 전역변수처럼 이용된다는 단점이 있어서 잘 사용하지않는다.
값의 할당을 할때는 할당 연산자인 =
을 이용한다.
여기서 주의해야할점은 값의 선언과 할당의 실행시점이 다르다는 것이다.
변수선언은 런타임 이전에 실행되지만 할당은 런타임때 실행된다.
var num = 10;
이런 코드가 한줄에 선언과 할당이 적혀 같아보이지만 실제로 자바스크립트 엔진은 2개로 쪼개어서 코드를 실행한다. 그래서 선언시 undefined로 되있는곳에 10이라는 값을 넣는것이 아니라
새로운 메모리 공간을 확보하여 그곳에 10을 할당하는 것이다.
위의 코드에서 num = 20
으로 값을 전달하면 어떻게 될까? 위의 선언에서와 동일하게 새로운 메모리 공간을 확보하여 그곳에 20을 할당한다. 그럼 초기화때 사용된 undefined메모리와 10이 저장된 메모리는 계속 실행컨텍스트에 남아있는걸까??
"아니다" 자바스크립트에는 메모리공간을 주기적으로 검사하여 더이상 사용되지않는 메모리를 해제시키는 가비지 콜렉터 라는것이 있기에 undefined,10의 메모리는 자동을 해제가 된다.