- [4.1] 변수란 무엇인가? 왜 필요한가?
- 컴퓨터는 연산과 기억을 수행하는 부품이 나뉘어져 있다.컴퓨터는 CPU를 사용해 연산하고, 메모리를 사용해 데이터를 기억한다.
- 메모리 주소를 통해 값에 직접 접근하는 것은 치명적 오류를 발생시킬 가능성이 높다.
- 운영체제가 사용하는 값을 변경하면 시스템을 멈추게 하는 치명적인 오류가 발생가능.
- 자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는다.
- 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다.
- 즉, 변수는 값의 위치를 가리키는 상징적인 이름이다.
- 변수는 프로그램이 언어의 컴파일러 또는 인터프리터에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행한다.
- 따라서 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조할 필요가 없고 변수를 통해 안전하게 값에 접근할 수 있다.
- [4.2] 식별자
- 식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다(변수 이름을 식별자라고도 한다).
- 식별자는 값이 아니라 메모리 주소를 기억하고 있다.
- 식별자로 값을 구별해서 식별한다는 것은 식별자가 기억하고 있는 메모리 주소를 통해 메모라 공간에 저장된 값에 접근할 수 있다는 의미다.
- 즉, 식별자는 메모리 주소에 붙인 이름이다.
- [4.3] 변수 선언
- 변수 선언이란 변수를 생성하는 것이다.
- 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 잇게 준비하는 것이다.
- 변수를 사용하려면 반드시 선언이 필요하다.
- 변수에 값을 할당하지 않아도 확보된 메모리 공간에는 자바스크립트 엔진에 의해 undefined라는 값이 암묵적으로 할당되어 초기화된다(쓰레기 값으로 초기화 되는것을 방지).
- 자바스크립트 엔진은 변수 선언을 2단계에 거쳐 수행한다.
- 선언단계: 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.
- 초기화단계: 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화한다.
- ReferenceError: 식별자를 통해 값을 참조하려 했지만 자바스크립트 엔진이 등록된 식별자를 찾을 수 없을 때 발생하는 에러.
- [4.4] 변수 선언의 실행 시점과 변수 호이스팅
- 자바스크립트 코드는 인터프리터에 의해 한 줄씩 순차적으로 실행된다.
- 자바스크립트 엔진은 변수 선언이 소스코드의 어디에 있든 상관없이 다른 코드보다 먼저 실행한다.
- 변수 선언이 소스코드의 어디에 위치하는지와 상관없이 어디서든지 변수를 참조할 수 있다.
- 모든 선언문은 런타임 이전 단계에서 먼저 실행된다.
- 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라고 한다.
- [4.5] 값의 할당
- 변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.
- 변수에 값을 할당할 때는 초기 값 undefined가 저장되어 있던 메모리 공간을 지우고 그 메모리 공간에 값을 새롭게 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그곳에 할당 값을 저장하는 것이다.
- [4.6] 값의 재할당
- 재할당: 이미 값이 할당되어 있는 변수에 새로운 값을 다시 할당하는 것.
- 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수라 한다.
- const 키워드를 사용하면 상수를 표현할 수 있다.
- 어떠한 식별자와도 연결이 되지 않은 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제된다.
- 메모리에서 언제 해제될지는 예측할 수 없다.
'[자바스크립트]' 카테고리의 다른 글
[JavaScript/DeepDive]09.타입 변환과 단축 평가 (0) | 2021.05.10 |
---|---|
[JavaScript/DeepDive]08.제어문 (0) | 2021.05.09 |
[JavaScript/DeepDive]07.연산자 (0) | 2021.05.08 |
[JavaScript/DeepDive]06.데이터 타입 (0) | 2021.05.08 |
[JavaScript/DeepDive]05.표현식과 문 (1) | 2021.05.05 |