모던 자바스크립트 Deep Dive 4장

홍범선·2025년 2월 4일
0

모던자바스크립트

목록 보기
3/6

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

변수

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

var result = 10 + 20;

여기서 result는 메모리 공간에 저장된 값을 식별할 수 있는 고유한 이름이다.

식별자

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

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

변수 선언이란?

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

var키워드로 변수 선언한다면

메모리 공간을 확보 후 변수 이름과 메모리 공간의 주소를 매핑한다. 그리고 자바스크립트는 암묵적으로 undefined를 할당한다.

이렇게 undefined로 할당하는 이유는 이전에 다른 애플리케이션에서 사용했던 값이 남아 있을 수 있기 때문에 초기화를 수행한다.

변수 이름은 어디에 저장할까?

참고로 변수 이름과 같은 식별자는 실행 컨텍스트에 등록되어 관리한다. 실행 컨텍스트에 변수 이름, 변수 값은 키/값 형식인 객체로 저장된다.

실행 컨텍스트란?

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

변수 호이스팅

console.log(score); // undefined

var score;

앞서 자바스크립트는 인터프리터이기 때문에 console.log(score)부터 실행하고 다음 줄 코드를 실행한다.
하지만 참조 에러가 발생하지 않고 undefined를 출력한다.
그 이유는 변수 선언이 소스코드 한 줄씩 순차적으로 실행되는 시점, 즉 런타임이 아니라 그 이전 단계에서 실행되기 때문이다.

자바스크립트는 변수 선언을 포함한 모든 선언문(변수 선언문, 함수 선언문)을 소스코드에서 찾아 먼저 실행한다.
이러한 평가 과정이 끝나고 그 후 소스코드를 한 줄씩 실행한다.

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

값의 할당

= 할당연산자를 사용한다.

//1
var score;
score = 80;

//2
var score = 80;

여기서 2번째 방법인 변수 선언과 값 할당을 하나의 문으로 단축 표현해도 변수 선언값의 할당을 2개의 문으로 나누어서 실행한다.

즉 내부적으로 1과 2은 동일하게 동작한다는 것이다.

변수 선언이 런타임 이전에 실행되고, 값의 할당은 순차적으로 실행되는 시점인 런타임에 실행된다.

여기서 score에 undefined로 초기화를 진행하는 것은 변함이 없다.
하지만 변수에 값을 할당할 때에는 그 메모리 공간에 80을 저장하는 것이 아닌 새로운 메모리 공간을 확보하고 그곳에 할당한다.

값의 재할당

var score = 80;
score = 90;

var 키워드는 재할당할 수 있다. 이 상황도 마찬가지로 새로운 메모리 공간을 확보하고 그 메모리 공간에 재할당을 한다.

여기서 메모리가 낭비되지 않을까 걱정할 수 있지만
가비지 콜렉터를 통해 불필요한 값들은 자동제거 된다.

여기서 가비지 콜렉터는 어떠한 식별자도 참조하고 있지 않는 메모리 공간을 검사하여 자동 해제한다.

면접 예상 질문

1. 호이스팅이란 무엇인가요?

변수, 함수, 클래스 등 선언문을 소스코드가 순차적으로 실행되는 시점인 런타임 전에 찾아 먼저 실행한 후, 그 후 런타임이 시작되는 것을 의미합니다.


자세히)여기서 var로 선언한 변수는 undefined로 할당되고 const, let으로 선언한 변수는 일시적 사각지대가 됩니다. 함수 선언문은 완전 호이스팅이 되지만 함수 표현식은, 변수 호이스팅처럼 동작합니다.

2. 변수 재할당 과정에 대해 설명해보세요

변수 재할당할 때 기존 메모리에 재할당하는 것이 아닌 새로운 메모리를 확보 후 그 공간에 재할당을 합니다.

profile
알고리즘 정리 블로그입니다.

0개의 댓글