변수

2022. 6. 22. 13:59JavaScript

*본 포스팅은 '모던 자바스크립트 Deep Dive' 의 내용을 입맛대로 재구성해본 것입니다잇~!

변수란 무엇이고, 왜 필요한가 ?

컴퓨터는 CPU를 이용해 연산하고 , 메모리를 통해 데이터를 기억한다.

메모리는 데이터를 저장할 수 있는 메모리 셀(cell)의 집합체이다.

각 셀은 고유의 메모리 주소를 가지며, 0부터 시작해서 메모리의 크기만큼 정수로 표현된다.

메모리에 저장할 데이터는 데이터 타입과 상관없이 모두 2진수로 처리한다.  (위 사진은 이해를 돕고자 10진수로 표현함.)

·

·

·

10 + 20이라는 연산을 예로 들면

연산 결과로 나온 30이라는 값은 임의의 메모리 주소를 부여 받는데,

이를 재사용하고자 할 땐 저장된 메모리 공간에 직접 접근하는 방법 밖에 없다.

·

·

그러나 메모리 주소를 통해 직접 값에 접근하는 것은 매우 위험하다.

실수로 운영체제가 사용하고 있는 값을 변경해버리면 시스템이 멈추는 치명적인 오류가 발생할 수 있기 때문.

따라서 자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는다. 

·

·

프로그래밍 언어는 기억하고 싶은 값을 메모리에 저장하고,

저장된 값을 읽어 들여 재사용하기 위해 '변수' 라는 매커니즘을 사용한다.

 

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

·

·

변수는 프로그래밍 언어에서 값을 저장하고 참조하는 매커니즘이며, 값의 위치를 가리키는 상징적인 이름이다.

변수는 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행된다.

따라서 개발자가 직접 메모리 주소를 통해 값을 저장하고 참조할 필요가 없고 변수를 통해 안전하게 값에 접근할 수 있다.

변수에 값을 저장하는 것을 할당assignment(대입, 저장)이라 하고, 변수에 저장된 값을 읽어 오는 것을 참조reference라 한다.

 

 

 

 

 

식별자

 

변수 이름을 식별자identifier라고도 한다.

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

 

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

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

식별자는 메모리 주소에 붙인 이름이다.

변수, 함수, 클래스 등의 이름과 같은 식별자는 네이밍 규칙을 준수해야하며,

선언declaration에 의해 자바스크립트 엔진에 식별자의 존재를 알린다.

 

 

 

 

변수 선언

 

변수 선언variable declaration 이란, 값을 저장하기 위한 메모리 공간을 확보하고,

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

·

·

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

변수 선언 시 var, let, const 키워드keyword를 사용할 수 있다.

키워드keyword는 자바스크립트 코드를 해석하고 실행하는 자바스크립트 엔진이 수행할 동작을 규정한 일종의 명령어다. 자바스크립트 엔진은 키워드를 만나면 자신이 수행해야 할 약속된 동작을 수행한다. 예를 들어, var 키워드를 만나면 자바스크립트 엔진은 뒤에 오는 변수 이름으로 새로운 변수를 선언한다.

 

var 는 뒤에 오는 변수 이름으로 새로운 변수를 선언할 것을 지시하는 키워드다.

var score; //변수 선언 (변수 선언문)

위 변수 선언문은 다음과 같이 변수 이름을 등록하고 값을 저장할 메모리 공간을 확보한다.

 

변수에 값을 할당하지 않아서 확보된 메모리 공간이 비어있을 것 같지만 

자바스크립트 엔진은 그 공간에 암묵적으로 undefined라는 값을 할당한다. 이 동작을 '초기화initialization' 라 부른다.

 

undefined는 자바스크립트에서 제공하는 원시 타입의 값primitive value이다.

 

이처럼 자바스크립트 엔진은 변수 선언을 다음과 같은 2단계에 거쳐 수행한다.

 

  • 선언 단계 : 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.
  • 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화 한다.

 

변수 이름은 어디에 등록되는가?
변수 이름을 비롯한 모든 식별자들은 실행 컨텍스트에 등록된다. 실행 컨텍스트execution context는 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다. 자바스크립트 엔진은 실행 컨텍스트를 통해 식별자와 스코프를 관리한다.

 

변수 뿐만 아니라 모든 식별자들을 사용하려면 반드시 선언이 필요하고, 

만약 선언되지 않은 식별자에 접근하면 ReferenceError(참조에러)가 발생한다.

 

 

 

 

 

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

 

console.log(score); //undefined

var score; // 변수 선언문

변수 선언문보다 변수를 참조하는 코드가 앞에 있다. 

자바스크립트 코드는 인터프리터에 의해 한 줄씩 순차적으로 실행되므로

console.log가 실행되는 시점에 아직 score 변수가 선언되지 않았으므로 ReferenceError가 발생할 것 처럼 보인다.

그러나 실행해보면 undefined가 출력된다.

·

·

그 이유는 변수 선언이 소스코드가 한 줄씩 순차적으로 실행되는 시점,

런타임runtime이 아니라 그 이전 단계에서 먼저 실행되기 때문이다.

·

·

자바스크립트 엔진은 소스코드를 한 줄씩 순차적으로 실행하기에 앞서 먼저 소스코드의 평가 과정을 거치면서 소스코드를 실행하기 위한 준비를 한다. 이 소스코드 평가 과정에서 자바스크립트 엔진은 변수 선언을 포함한 모든 선언문을 소스코드에서 찾아내 먼저 실행한다. 이는 변수 선언이 소스코드의 어디에 있든 상관없이 다른 코드보다 먼저 실행함을 의미한다.

·

·

이처럼 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을

변수 호이스팅variable hoisting이라 한다.

 

 

 

 

값의 할당

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

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

var score; // 변수 선언
score = 80; // 값의 할당

var score = 80; //변수 선언과 값의 할당

자바스크립트 엔진은 변수 선언과 값의 할당을 하나의 문으로 단축 표현해도

변수 선언과 값의 할당을 2개의 문으로 나누어 각각 실행한다.

·

·

이 때 주의할 점은 각각의 실행 시점이 다르다는 점이다. 

·

·

변수 선언은 소스코드가 순차적으로 실행되는 런타임 이전에 먼저 실행되지만,

값의 할당은 소스코드가 순차적으로 실행되는 런타임에 실행된다.

console.log(score); // undefined

var score = 80; // 변수 선언과 값의 할당

console.log(score); // 80

·

·

·

·

변수에 값을 할당할 때는 이전 값 undefined가 저장되어 있던 메모리 공간을 지우고 그 메모리 공간에 할당값 80을 새롭게 저장하는 것이 아니라 새로운 메모리 공간을 확보하고 그 곳에 할당값 80을 저장한다는 점을 주의하자.

 

 

 

 

 

값의 재할당
var score = 80; // 변수 선언과 값의 할당
score = 90; // 값의 재할당
// 변수 선언이 되면 선언과 동시에 변수에 undefined가 할당(초기화)되므로 
// 엄밀히 말하자면 변수에 처음으로 값을 할당하는 것도 재할당이다.

 

var 키워드로 선언된 변수의 값은 재할당 할 수 있다.

재할당은 현재 변수에 저장된 값을 버리고 새로운 값을 저장하는 것이다.

·

·

재할당은 변수에 저장된 값을 다른 값으로 변경한다. 그래서 변수라고 하는 것이다. 

만약 값을 재할당 할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수constant라 한다.

·

·

·

·

재할당도 마찬가지로 새로운 메모리 공간을 확보하고 그 자리에 값을 저장한다.

현재 변수 값은 90이다. score변수의 이전 값들인 undefined와 80은 어떤 변수도 값으로 가지고 있지 않다. 

이것은  undefined와 80이 더 이상 필요하지 않다는 것을 의미한다.

이러한 불필요한 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제된다.

단, 메모리에서 언제 해제될지는 예측할 수 없다.

 

'JavaScript' 카테고리의 다른 글

const & let  (0) 2022.06.07
Javascript - Datatype  (0) 2022.06.01
Javascript와 HTML의 만남  (0) 2022.06.01
Javascript  (0) 2022.06.01