---
description: 모던 자바스크립트 딥다이브 04장 변수
---

# 04장 변수

## 변수란 무엇인가?

프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어들여 재사용하기 위해 변수라는 메커니즘을 제공한다.

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

값의 위치를 가리키는 상징적인 이름

## 변수는 왜 필요한가?

개발자로 하여금 값을 저장하고 참조할때 메모리 주소에 직접 접근하지 않고 안전하게 변수를 통해 값에 접근할 수 있게 한다.

## 식별자

변수명 =  식별자, 식별자는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 뜻한다.

식별자는 변수값 자체를 기억하는 것이 아니라 변수값이 저장되어 있는 메모리 주소를 기억한다.

자바스크립트에서 '식별자'는 변수명에만 국한해서 사용하지 않는다. 변수, 함수, 클래스 등 이름은 모두 식별자다.

## 변수 선언

변수 선언이란 변수를 생성하는 것을 말한다. 변수를 사용하기 위해서는 반드시 선언이 필요하다.

자바스크립트에서 변수 선언 키워드는 var가 있으며 var키워드의 단점을 보완하기 위해서 ES6에서 let, const가 추가되어 var, let, const 키워드로 변수를 선언할 수 있다.

### var, let, const

#### var

1. 선언+초기화
2. 할당

#### let

1. 선언
2. 초기화
3. 할당

#### const

1. 선언 + 초기화 + 할당

### 변수 선언의 2단계

* 선언 : 변수 이름을 등록
* 초기화 : 변수 값을 저장하기 위한 메모리 공간 확보, 일반적으로 변수가 선언된 이후 최최의 값을 할당하는 것을 말한다.
  * 초기화 단계를 거치지 않으면 확보된 메모리 공간에는 이전의 쓰레기 값이 남아 있을 수 있다. var 키워드는 암묵적으로 선언과 초기화를 함께 수행하므로 이런 위험으로부터 안전한다.

## 변수 선언의 실행시점 및 값의 할당

자바스크립트는 변수 선언의 시점과 값의 할당 시점이 다르다. 변수 선언은 소스코드 평가 단계에서 시행되며 변수 값의 할당은 한줄 한줄 실행되는 시점, 즉 런타임 시점에 시행된다. 따라서 런타임 전에도 이미 선언이 되어있으므로 선언문들이 모두 코드 최상단으로 끌어올려진 것 같은 호이스팅 현상이 나타난다.

변수의 초기화 (undefined로 할당하는 것) 이후 실질적인 값을 할당할 때는 이전 값(=undefiend)가 저장 되어있던 메모리 공간을 지우고 실질적인 값을 할당하는 것이 아니라, 새로운 메모리 공간을 확보하고 그곳에 실질적인 값을 할당한 다음 변수의 주소값을 변경하는 것.

### 가비지 컬레터

이렇게 주소값이 변경되면 이전 주소값의 메모리 공간은 사용하지 않는 데이터가 존재하고 이 주소값은 참조되지 않는다. 이렇게 참조되지 않는 메모리 공간은 자바스크립트 엔진의 가비지 컬렉터가 해제 하게 된다. 이렇게 개발자가 메모리를 관리 하는 것이 아니라 언어 차원에서 메모리 관리를 담당하는 것을 매니지드 언어라고 한다. (개발자가 메모리 누수와 메모리 할당, 해제 등을 관리하는 것을 언매니지드 언어라고 한다. 대표적으로 C)

## 식별자 네이밍 규칙

* 문자, 숫자, 언더스코어(\_), 달러($) 포함 가능
* 대소문자 구분
* 숫자로 시작하면 안된다.
* ES5 부터 유니코드도 허용, 따라서 한글로도 가능
* 변수나 함수는 카멜케이스, 생성자나 클래스는 파스칼케이스를 주로 사용
* var(선언+초기화/할당)
* let(선언/초기화/할당)
* const(선언+초기화+할당)

## 요약

* 변수명 = 식별자
* 변수값
* 할당
* 참조
* 변수명(=식별자) → 메모리 주소 → 해당 주소에 저장 된 값 (=변수값)
