JS/[책] 모던 자바스크립트 Deep Dive

4. 변수

배워도끝이없네 2021. 8. 16. 14:59

1. 변수란 무엇인가? 왜 필요한가?

- 변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체, 또는 그 메모리 공간을 식별하기 위해 붙인 이름이다.

- 메모리공간에 저장된 값을 식별 할 수 있는 고유한 이름을 변수이름/변수명 이라고 한다.

- 변수에 저장된 값은 변수 값이라고 한다.

- 변수에 값을 저장하는 것을 할당(대입,저장) 이라고 한다.

- 변수에 저장된 값을 읽어 들이는 것을 참조라고 한다.

 

2. 식별자

- 변수 이름은 식별자(identifier) 라고도 한다.

- 식별자는 어떤 값을 구별해 식별할 수 있는 고유한 이름을 말한다.

- 식별자는 값이 저장되어 있는 메모리 주소와 매핑 관계를 맺으며, 이 매핑 정보도 메모리에 저장되어야 한다.

- 식별자는 값이 아니라 메모리 주소를 기억하고 있다.

- 식별자라는 용어는 변수 이름에만 국한하지 않는다. (etc. 변수,함수,클래스)

- 변수, 함수, 클래스 등의 이름과 같은 식별자는 네이밍 규칙을 준수해야 하며, 선언에 의해 자바스크립트 엔진에 식별자의 존재를 알린다.

 

3. 변수 선언(variable declaration)

- 변수 선언이란 변수를 생성하는 것이다.

- 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해 값을 저장할 수 있게 준비하는 것이다.

- 변수 선언에 의해 확보된 메모리 공간은 확보가 해제되기 전까지는 누구도 확보된 메모리 공간을 사용할수 없도록 보호된다.

- 변수를 사용하려면 반드시 선언이 필요하다.

- 선언시에는 var, let, const 키워드를 사용한다.

  * ES6에서 let과 const를 도입한 이유

  => var이 block-level-scope가 아니라 function-level-scope라 생기는 문제점들 때문이다.

- 변수를 선언하고 아무것도 할당하지 않으면 메모리공간에는 undefined라는 값이 암묵적으로 할당되어 초기화된다.

- 자바스크립트 엔진은 변수선언을 2단계에 거쳐 수행한다.

 1) 선언 단계 : 변수 이름을 등록해 자바스크립트 엔진에 변수의 존재를 알린다.

 2) 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화 한다.

 *변수 이름이 등록되는 곳

 => 변수 이름을 비롯한 모든 식별자는 실행 컨텍스트(excution context)에 등록된다.

 => 실행컨텍스트는 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고, 코드의 실행결과를 실제로 관리하는 영역이다.

 => 자바스크립트 엔진은 실행컨텍스트를 통해 식별자와 스코프를 관리한다.

 => 변수 이름과 변수 값은 실행 컨텍스트 내에 키/값 형식인 객체로 등록되어 관리된다.

- 초기화란, 변수가 선언된 후 최초로 값을 할당하는 것을 의미한다.

 

4. 변수 선언의 실행 시점과 변수 호이스팅

- 선언전에 참조해도 undefined가 출력되는 이유는 변수 선언이 런타임이 아니라 그 이전단계에서 먼저 실행되기 때문이다.

- JS엔진은 소스코드를 한줄씩 실행하기 전에 소스코드의 평가 과정을 거치면서 소스코드 실행을 위한 준비를 한다.

- 이 평가 과정에서 변수선언을 포함한 모든 선언문들을 소스코드에서 찾아내 먼저 실행시킨다.

- 평가과정이 끝나면 그때 모든 선언문을 제외한 소스코드를 한줄씩 실행시킨다.

- 따라서 자바스크립트 엔진은 변수선언이 소스코드의 위치와 관계없이 다른 코드보다 먼저 실행되기 때문에, 어디서든지 변수를 참조할 수 있게 된다.

- 이처럼 변수 선언문이 선두로 끌어올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅이라 한다.

 

5. 값의 할당

- 변수에 값을 할당할 때는 할당 연산자 = 을 사용한다.

- 할당 연산자는 우변의 값을 좌변의 변수에 할당한다.

- 변수 선언은 런타임 이전에 실행되지만, 값의 할당은 런타임에 실행된다.

 

6. 값의 재할당

- 재할당이란 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것이다.

- 값을 재할당 할 수 없어서 변수에 저장된 값을 변경할 수 없다면 그것은 상수라고 한다.

- 재할당하면 기존에있던 메모리공간을 지우고 새로 쓰는것이 아니라, 새로운 메모리공간을 확보하고 그곳에 할당을 다시 한다.

- 어떠한 식별자와도 연결되어 있지 않은 값들은 가비지콜렉터에 의해 메모리에서 자동 해제된다.

 

* 언매니지드 언어와 매니지드 언어

 =>프로그래밍 언어는 메모리 관리 방식에 따라 언매니지드 언어와 매니지드 언어로 분류할 수 있다.

 =>C언어 같은 언매니지드 언어는 개발자가 명시적으로 메모리를 할당하고 해제하기위한 저수준 메모리 제어 기능을 제공한다.

 

'JS > [책] 모던 자바스크립트 Deep Dive' 카테고리의 다른 글

6. 데이터 타입  (0) 2021.08.17
5. 표현식과 문  (0) 2021.08.17
3. 자바스크립트 개발 환경과 실행 방법  (0) 2021.08.16
2. 자바스크립트란?  (0) 2021.08.16
1. 프로그래밍  (0) 2021.08.16