1. 변수
1) 변수의 의미, 필요성
값을 저장하기 위해 확보한 메모리 공간 자체. 메모리 공간을 식별하기 위해 붙인 이름. 값의 위치를 가리키는 상징적인 이름
- 컴퓨터는 메모리상의 임의의 위치(
메모리 주소
)에 데이터를 2진수
로 바꾸어 저장한다
- 개발자는 연산 결과가 저장된 메모리 공간에 직접 접근할 수 없다.
- 또한 값이 저장될 메모리 주소는 임의로 결정되기 때문에 코드가 실행되기 전에는 값이 저장될 메모리 주소를 알 수 없다.
- 프로그래밍 언어에서 값을 저장하고 참조하는 메커니즘으로
값의 위치
를 가리키는 상징적인 이름이다
- 변수는
컴파일러
또는 인터프리터
에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행
되기 때문에 개발자가 안전하게 변수를 통해 값에 접근할 수 있다.
- 변수 이름(변수 명) : 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름. 변수 이름을 사용해 참조 요청 시
자바스크립트 엔진
에 의해 변수 이름에 매핑된 메모리 주소를 통해 메모리 공간에 접근해서 저장된 값을 반환한다.
- 변수 값 : 변수에 저장된 값
- 할당, 대입, 저장 : 변수에 값을 저장하는 것
- 참조 : 변수에 저장된 값을 읽어들이는 것
2) 식별자
메모리 주소에 붙인 이름, 변수 이름
- 메모리 공간에 저장된 값을 구별해 식별해 내기 위해 값이 저장되어있는 메모리 주소를 기억해야함
- 식별자는 메모리 주소와 매핑 관계를 맺으며 매핑 정보도 메모리에 저장되어야 함
3) 변수 선언
값을 저장하기 위한 메모리 공간을 확보
하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것 .
스코프(실행 컨텍스트의 렉시컬 환경) 에 변수 식별자를 등록해 자바스크립트 엔진에 변수의 존재를 알린다.
* var, const, let 의 차이
var
:
- 함수 레벨 스코프 : 함수 외부에서 선언한 변수를 코드 블록(if 문, for 문, while 문, 함수, try/catch 문 등) 내에서 선언해도 전역 변수가 된다.
- 같은 스코프 내에서 중복 선언 허용한다 : 중복 선언 시 초기화 문이 없는 변수 선언문은 무시되고, 초기화 문이 있다면 먼저 선언한 변수 값이 변경될 수도 있다.
- 소스 코드 평가 과정에서 선언 + 초기화가 동시에 진행. 변수 호이스팅에 의해 변수 선언문 이전에 참조 가능 (undefined긴 하지만)
let
:
- 블록 레벨 스코프
- 중복 선언 불가 - SyntaxError 발생
- 재할당 가능
- 런타임 이전에 초기화 없이 선언만 진행되기 때문에 변수 선언문 이전에 참조 시 참조 에러 발생. 스코프 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없게 되는데 이를 일시적 사각 지대(Temporal. Dead Zone. TDZ) 라고 부른다.
const
:
- 블록 레벨 스코프
- 재할당 금지 : 프로퍼티 동적 생성, 삭제, 객체 변경은 가능
- 소스 코드 평가 과정에서 선언 + 초기화 + 할당 진행.
4) 값의 할당과 재할당
var name = 'Tom';
name = 'Mary'
- 값의 할당은 런타임에 실행된다.
- undefined 가 저장되어 있던 공간에 새롭게 저장하는 것이 아니라 새로운 메모리 공간 확보 후 그 곳에 할당 값을 저장한다.
name
변수의 이전 값인 undefined, Tom 은 어떤 식별자와도 연결되어 있지 않은 불필요한 값이다. 이 값들은 가비지 콜렉터
에 의해 메모리에서 자동 해제된다.
* 가비지 콜렉터란?
- 가비지 콜렉터 : 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리(= 어떤 식별자도 참조하지 않는 메모리 공간)를 해제하는기능
- 자바스크립트는 가비지 콜렉터를 내장하고 있는
매니지드 언어
로 가비지 콜렉터를 통해 메모리 누수를 방지한다.