본문 바로가기
개발/자바스크립트

04. 변수

by Dahna 2022. 6. 30.

변수

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

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

 

변수가 필요한 이유는 컴퓨터는 연산(CPU)과 기억(메모리)을 수행하는 부품이 나눠져 있다. 메모리는 데이터를 저장할 수 있는 메모리 셀의 집합체다. 각 셀은 고유의 메모리 주소를 갖는다. 이 메모리 주소는 메모리 공간의 위치를 나타낸다. 이 메모리 주소를 통해 값에 직접 접근하는 것은 오류를 발생시킬 위험이 있다. 또한 값이 저장될 메모리 주소는 코드가 실행될 때 메모리의 상황에 따라 임의로 결정된다. 자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는 언어이다. 대신 프로그래밍 언어에서 값을 저장하고 참조하는 매커니즘으로 변수를 제공한다. 따라서 변수는 값의 위치를 가리키는 상징적인 이름이다. 변수는 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 메모리 공간의 주소로 치환되어 실행된다.

 

변수는 변수 이름(식별자)과 변수 값으로 구성되어 있다. 변수에 값을 저장하는 것을 할당(대입, 저장)이라 하고, 변수에 저장된 값을 읽어 들이는 것을 참조라 한다. 변수 명을 통해 참조를 요청하면 자바스크립트 엔진은 변수 이름과 매핑된 메모리 주소를 통해 메모리 공간에 접근해서 저장된 값을 반환한다. 개발자는 변수 이름을 통해 변수에 저장된 값의 의미를 알 수 있다.

 

식별자

변수 이름을 식별자라고도 한다. 식별자는 메모리 상에 존재하는 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다. 식별자는 변수 이름에만 국한해서 사용하지 않는다. 변수, 함수, 클래스 등의 이름은 모두 식별자다. 식별자는 값이 아니라 메모리 주소를 기억하고 있다. 선언에 의해 자바스크립트 엔진에 식별자의 존재를 알린다.

 

변수 선언

변수 선언이란 변수를 생성하는 것으로, 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것이다. 변수를 사용하려면 반드시 선언이 필요하다. 변수를 선언할때는 var, let, const 키워드를 사용한다. var 키워드로 선언된 변수와 ES6에서 도입된 let, const 키워드로 선언된 변수는 소스코드의 평가 과정에서 차이를 보인다. 소스코드는 실행 컨텍스트에 의해 평가와 실행 과정으로 나뉘어 실행된다. 변수 선언을 포함한 모든 선언문은 소스코드의 평가 과정에서 이루어지며, 소스코드의 실행(런타임) 이전에 실행된다. 때문에 변수 선언문은 마치 코드의 선두로 끌어 올려진 것처럼 동작하며 이를 변수 호이스팅이라 한다. 

 

변수 선언은 선언 단계와 초기화 단계에 거쳐 수행된다.

선언 단계: 실행 컨텍스트의 렉시컬 환경의 환경 레코드에 식별자가 저장된다.

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

 

var, let, const 키워드로 선언한 변수의 변수 선언 과정에서의 차이를 살펴보자.

var 키워드로 선언한 변수는 소스코드의 평가 과정에서 변수 선언 단계와 초기화 단계가 동시에 이루어진다.

반면 let, const 키워드로 선언한 변수는 변수 선언 단계는 소스코드의 평가 과정에서 이루어지지만, 초기화 단계는 소스코드의 실행 과정(소스코드가 순차적으로 실행되는 시점인 런타임에서 변수 선언문에 도달했을 때)에서 이루어진다. 스코프의 시작 지점부터 변수 선언문까지 변수를 참조할 수 없고, 참조시 참조 에러가 발생한다. 이 구간을 일시적 사각지대라 한다. let, const 키워드를 포함한 ES6에서 도입된 선언문의 호이스팅이 이와 같이 동작한다.

 

값의 할당

변수에 값을 할당(대입, 저장)할 때는 할당 연산자 =를 사용한다. 할당 연산자는 우변의 값을 좌변의 변수에 할당한다. 값의 할당은 소스코드의 실행 과정에서 실행된다. 

 

변수에 새로운 값을 또다시 할당하는 것을 재할당이라 한다. 재할당은 변수에 저장된 값을 다른 값으로 변경한다. 값을 재할당할 수 없다면 변수가 아닌 상수라 한다. 상수는 한번 정해지면 변하지 않는 값이다. 다시 말해 상수는 단 한 번만 할당할 수 있는 변수다. 자바스크립트에서 재할당 하지 않는 변수를 선언하려면 const 키워드를 사용한다. const 키워드로 상수를 표현할 수는 있지만 재할당 하지 않는 변수로 보는 것이 맞다. 데이터 타입(의 불변성-원시 타입과 객체 타입)에 따라 변수에 저장되는 값이 다르(원시 값과 참조 값)기 때문이다.

 

변수에 값을 재할당하면 이전 값이 저장되어 있는 메모리 공간을 지우고 그 메모리 공간에 재할당 값을 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그 메모리 공간에 새로운 값을 저장한 뒤 매핑된 메모리 주소를 바꾼다. 이 과정에서 참조가 해제된 메모리 공간은 가비지 컬렉터의 수거 대상이 된다.

변수 선언문 내 변수 값 할당도 변수 초기화 단계에서 암묵적으로 undefined를 할당하고 다시 변수 값을 할당하는 것이기 때문에 엄밀히 말하면 재할당이라고 할 수 있다.

 

식별자 네이밍 규칙

- 식별자는 특수문자를 제외한 문자, 숫자, 언더스코어, 달러기호를 포함할 수 있다.

- 식별자는 특수문자를 제외한 문자, 언더스코어, 달러기호로 시작해야 한다. 숫자로 시작하는 것은 허용하지 않는다.

- 예약어는 식별자로 사용할 수 없다.

'개발 > 자바스크립트' 카테고리의 다른 글

08. 제어문  (0) 2022.07.01
07. 연산자  (0) 2022.07.01
06. 데이터 타입  (0) 2022.06.30
05. 표현식과 문  (0) 2022.06.30
모던 자바스크립트 딥다이브 목차 정리  (0) 2022.06.12

댓글