4장 변수
변수란 무엇인가?
변수란 값을 저장하기 위한 메모리 주소에 이름을 지정한 것(실제로 그 주소를 알게 하는 건 위험하다)
컴파일러 또는 인터프리터에 의해 메모리 공간의 주소로 치환된다.
var result = 10 + 20; // 할당(assignment)
result; // 참조(reference)
- result는 식별자(변수의 이름)
- 30은 변수 값
- 사실 result는 30이 아니라 30이 저장되어 있는 메모리 주소를 기억하는 것. = 메모리 주소의 이름
변수 선언
var score;
변수 선언 = Allocate(값을 저장하기 위한 메모리 공간 확보) + Name Binding(변수 이름과 메모리 주소를 연결)
변수 선언 키워드 - let, const, var
let, const
는 ES6에서 처음 등장 (var
의 한계 때문에 )var
의 한계 : 블록 레벨 스코프를 지원하지 않고 함수레벨 스코프를 지원하기 때문에 의도치 않은 전역 변수 선언으로 인한 부작용 발생 ? (15.1절 참고)
- 키워드 = 예약어 (자바스크립트 엔진이 수행할 동작을 규정한 예약어)
score에 메모리 공간 확보
score에는 null이 아니라 undefined가 할당되어 있다.(암묵적 초기화 자동수행) 자바스크립트의 독특한 특징
- undefined는 자바스크립트의 primitive type value
- 초기화하지 않으면 이전의 쓰레기값이 참조될 수 있다.
자바스크립트 엔진의 변수 선언은 2단계(선언, 초기화)
- 선언 : 변수 이름 score를 등록하여 자바스크립트 엔진에 변수의 존재를 알림
- 실행 컨텍스트 내에 등록
- Key/value 형식의 객체로 등록됨
- 초기화 : 메모리 공간을 확보하고 score 주소의 메모리에 undefined 할당하여 초기화.
ReferenceError : 선언하지 않은 식별자를 참조할 때(score가 아닌 다른 것들)
변수 선언의 실행 시점과 변수 호이스팅
console.log(score); // undefined
var score;
결과 : 참조에러 발생하지 않고 undefined 출력
변수 선언이 한꺼번에 먼저 되고 나서 (Runtime 이전)
-> Runtime에 소스코드가 sequential하게 실행하기 때문에 by 인터프리터
변수 호이스팅 : 변수 선언문이 코드의 선두로 끌어올려진 것처럼 동작하는 자바스크립트 고유의 특징
모든 선언문은 런타임 이전에 실행된다.
값의 할당
// 할당 방법 1
var score = 30;
// 할당 방법 2
var score; // 변수 선언 - 런타임 이전에 실행
score = 30; // 값의 할당 - 런타임에 실행
1과 2는 정확히 동일하게 작동(1이 2의 단축표현일 뿐)
- 변수 선언은 런타임 이전에 실행
- 값의 할당은 런타임에 실행됨
console.log(score); // undefined
score = 30; // (1)
var score; // (2)
console.log(score); // 30
(2)가 먼저 실행되어 score 변수 주소(ex. 0xF2)에 undefined로 초기화
-> (1)에서 score에 새로운 주소를 확보하고 그 주소에 30을 할당(기존 주소 0xF2에 덮어쓰는게 아님) ?
-> 기존의 0xF2는 더 이상 사용되지 않는 메모리(어떤 식별자도 참조하지 않음)
-> Garbage Collector에 의해 메모리 free (자바스크립트는 managed language)
- Unmanaged language : 개발자가 명시적으로 메모리 할당, 해제 ex) C
- Managed language : 개발자의 직접적인 메모리 제어를 불허
값을 재할당할 때도 덮어쓰는게 아니라 새로운 주소를 확보하고 확보한 주소에 새로운 값을 저장
const
키워드로 선언된 변수는 단 한 번만 값을 할당할 수 있음.
식별자 네이밍
문자, 숫자, _, $ 포함 가능. 단 첫 문자는 숫자 제외 / 예약어 제외
var person, _name, $elem, val1; // 가능
var first-name, 1st, this; // 불가능
Reference
본 포스트는 이웅모, 모던자바스크립트 Deep Dive의 4장 내용을 요약 및 재구성한 것입니다.
Leave a comment