각 셀은 고유의 메모리 주소를 가지며, 메모리 주소는 메모리 공간 위치를 나타낸다.
0부터 시작하여 메모리의 크기만큼 정수로 표현된다.
EX) 4GB(0 ~ 4,294,967,295 === 0x00000000 ~ 0xFFFFFFFF)
위 그림에서 10과 20은 메모리 주소에 저장되고 CPU가 이 값을 읽어 연산을 수행
재사용은 연산 결과 값이 저장된 메모리 공간에 직접 접근하는 방법밖에 없지만, 직접 접근하는 것은 오류를 발생시킬 위험이 있을 뿐더러, JS에선 개발자의 직접적인 메모리 제어를 허용하지 않는다. 따라서 재사용을 위해 사용하는 것이 변수이다.
let name = 'Kangsick';
변수를 선언하고 아무것도 할당하지 않으면 Undefined값이 암묵적으로 할당되어 초기화 되는데, 이것이 자바 스크립트의 독특한 특징이다.
변수의 이름과 모든 식별자는 실행컨텍스트에 등록됨
- 실행 컨텍스트 : 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
- 자바스크립트는 실행컨텍스트를 통해 식별자와 스코프 관리
- 변수 이름과 변수 값은 실행 컨텍스트 내에서 키/값 형식은 객체로 등록되어 관리
console.log(level); // undefined ---첫번째 실행
var level; // 변수 선언문 ---두번째 실행
undefined가 출력되는 이유는 변수 선언이 소스코드가 한 줄 씩 순차적으로 실행되는 시점(런타임)이 아니라, 그 이전 단계에서 먼저 실행되기 때문이다.
자바스크립트 엔진은 변수 선언이 다른 코드보다 먼저 실행하기 때문에 변수 선언 코드의 위치와 상관없이 어디서든 변수 참조 가능
var level; //변수 선언
level = 25; //값의 할당
var levels = 25; // 변수 선언과 값의 할당
변수 언언은 런타임 이전에 먼저 실행되지만, 값의 할당은 런타임에 실행됨
console.log(level); //undefined
var level; // 변수 선언 ---런타임 이전 실행
level = 25; // 값의 할당 ---런타임에 실행
console.log(level); // 25
주의) 변수에 값을 할당 할 때 이전 undefined 값이 저장되어 있던 메모리 공간을 지우고 25를 할당 하는 것이 아니고, 새로운 메모리 공간을 확보하여 그곳에 할당 값 25를 저장함
var level = 24; //선언과 할당
level = 25; //재할당
값을 재할당후, 불필요한 값들은 가비지 콜렉터에 의해 메모리에서 자동해제되는데 언제 해제될지는 예측할 수 없다
- 가비지 콜렉터
- 가비지 콜렉터는 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않은 메모리를 해제하는 기능
- 메모리 누수를 방지
- 자바스크립트는 매니지드 언어로, 개발자가 명시적으로 메모리를 할당하고 해제할 수 없으며, 가비지 콜렉터가 메모리 해제를 수행한다
JS에선 일반적으로 변수나 함수 이름에서는 카멜 케이스를 사용, 사용자 함수와 클래스 이름에는 파스칼 케이스 사용