javaScript/jsDeepDive

변수와 메모리의 관계

부엉이사장 2023. 3. 21. 08:19

# 변수 선언과 할당시 메모리 동작 구조.

1

단순히 코드상 1이라는 숫자를 하나 적었다. 그렇다면 메모리에는 어떻게 저장될까?

이 숫자 1이저장된 메모리공간에 메모리주소한개가 부여된다.

 

그렇다면 아래코드는 어떻게 저장이될까?

let number_1 = 1;

1이라는 숫자를 number_1이라는 변수에 할당을 했다.

변수를 사용하면 위 코드에서 number_1이 즉 변수이름 식별자가 되고,

이 식별자는 메모리주소 하나를 가르킨다.

그렇다면 위의 코드를 실행하면 이렇게 구조가 잡힌다고 생각할 것이다.

number_1이라는 식별자는 메모리 주소를 가르키고 이 메모리주소가 찾아가는 메모리에는 숫자 1이 저장되어있다.

하지만 이 구조는 틀렸다

 

자바스크립트는 변수선언시 이렇게 동작을 한다.

// let number_1 = 1; 이라는 코드를 실행할때

let number_1;
number = 1

let number_1 = 1;을 실행할때 코드는 두개로 나뉘어서 실행된다.

let number_1; 으로 선언을 하고 이 메모리주소가 가르키는 메모리공간에는 undefined가 저장이된다.

이것을 초기화(initialize)라고 한다. (엄밀히말하면 선언과 초기화는 구분된다)

그 후, number = 1;으로 '새로운 메모리주소의 메모리공간에 1이 저장이 되는것이다.(재할당)

그림으로 보면 아래와 같다.

변수선언과 할당시에는 이러한 구조로 메모리가 동작한다.

 

 

 

## 중요한 용어정리

 

1. 선언 declaration

let value;

이렇게 변수를 하나 만들 수 있는데 이것을 선언이라고 한다.

만약 선언이 이루어지지 않았을경우를 테스트해보면

console.log(value_1); //reference Error뜸(참조에러)

즉 선언하지 않고 변수값을 불러오려하면 참조에러가 뜬다.

let value_1;
console.log(value_1); //undefined뜸. 에러발생X

 

선언후 참조할때 에러가 뜨지 않는것이다.

 

 * 참고로 선언과 동시에 식별자에 메모리 주소가 매칭되는것은 var이다.(초기화가 동시에 진행된다.)

let과 const등은 아주바로 메모리주소가 생기는게 아니다.

초기화 단계차이인데 이는 TDZ(temporal dead zone)이라고 한다. 다음  '변수 호이스팅'포스팅에서 다루도록 하겠다.

 

호이스팅, 그리고 초기화 initialize, Temporal Dead Zone

초기화는 변수선언시에 최초로 undefined가 할당이 되는것을 말한다. 먼저 그림으로 살펴보면, let value = 'hello world'; 라는 코드가 실행되면 먼저 식별자 value가 가르키는 메모리주소1이 생성되고 이

jacobowl.tistory.com

 

 

 

2. 할당 assignment

let value_1 = 1;

이렇게 변수에 값을 넣는것을 할당이라고 한다. 

물론 선언만해도 undefined가 할당되는것이고 값을 할당하면 위에 썼듯이 엄밀히말하면 재할당이다.

재할당은 다음과같이 다시 할 수 있다.

value_1 = 2;

값이 1에서 2로 바뀌었다. 이제 value_1이라는 식별자는 2가 저장된 메모리주소를 가르키고있을것이다.

 

 

 

 

3. 참조 reference

console.log(value_1);

이렇게 변수에 저장된 값을 불러올때 컴퓨터는 이 메모리공간에 접근해서 값을 가져온다.

이것을 '참조한다'라고 한다.

 

 

 

 

4 식별자 identifier

변수가 식별자다.

즉 변수는 메모리주소를 가르키고 이 메모리주소가 메모리공간의 위치를 의미한다.

 

 

5. 초기화 initialize 

변수 선언이 이루어지면 변수(식별자)가 가르키는 메모리주소가 초기화되며 undefined가 할당된다.

var과 let(const etc) 이 초기화 구조가 다르다. 이는 다른 포스팅에서 다루도록 하겠다.