Post

JS 변수 선언 및 데이터 할당과정 살펴보기

이전에 constlet, 원시형과 참조형에 대해서 간단히 다루었는데, 이번에는 메모리에서 어떻게 이루어지는지 다루면서 참조형 객체에 대해 조금 더 살펴보았다. 강의의 내용을 내 식대로 풀어서 살을 붙이며 설명하다보니 어쩔 수 없이 아주 긴 호흡의 글이 되었다.

일반적인 변수 할당 과정

우리가 변수를 선언해서, 데이터를 저장할 때 let a = 0; 처럼 사용한다. 이때, a0 은 메모리 공간에서 서로 다른 곳에 저장된다.

주소 (변수명)100110021003
데이터 a/@5001   
주소 (데이터)500150025003
데이터 0   

위 과정을 이용해, 변수와 상수라는 용어를 비교할 수 있다.

변수 vs 상수

js 에서는 const 가 상수, let 이 변수를 선언하는 방법이라고 할 수 있다.

위 예시에서, alet 으로 선언했다.

따라서, a = 1; 처럼 데이터를 변경하려는 경우에도 문제가 없다.

주소 (변수명)100110021003
데이터 a/@5002   
주소 (데이터)500150025003
데이터 01  

이렇게 바뀔 것이기 때문이다.

참고로, 5001 영역의 값 0 이 더 이상 사용되지 않는다면 가비지컬렉터에 의해 제거된다. (가비지 컬렉터가 변수들의 참조 카운트를 확인해 0 일 때는 회수한다고 한다.)

하지만, const a = 0; 처럼 상수로 선언했을 때는 @5001 에서 5002로 변경할 수가 없다.

물론, 참조형 변수는 이와 달리 stack 영역의 값은 변하지 않고 heap 영역에서 변수의 주소를 가지고 있기에 const 로 정의해도 데이터를 바꿀 수 있다. -> 이는 아래에서 자세히 다루어 보자.

불변(immutable) vs 가변(mutable)

1. 불변(immutable)

원시형 데이터와, 참조형 데이터의 차이는 불변하냐 가변하냐의 차이라고 했다.

아래 예시를 살펴보자.

let a = 0; 으로 선언한 뒤, a = 1; 로 값을 변경한 위의 예시를 가져왔다.

주소 (변수명)100110021003
데이터 a/@5002   
주소 (데이터)500150025003
데이터 01  

여기에서, 5001 은 변하지 않고 나중에 가비지 컬렉터에 의해 회수가 된다고 했다.

이런 것을 보고 불변(immutable) 하다고 말하는 것이다.

2. 가변(mutable)

const obj = {a: 0, b: "abc"} 로 정의하면 아래와 같이 저장될 것이다.

주소 (변수명)100110021003
데이터 obj/@7001   
주소 (데이터)500150025003
데이터 0“abc”  
주소700110021003
데이터 a/@5001b/@5002  

이때, obj.a = 1 을 입력해도 문제가 생기지 않는다.

그 과정을 살펴보자.

주소 (변수명)100110021003
데이터 obj/@7001   
주소 (데이터)500150025003
데이터 0“abc”1 
주소 (참조형)700110021003
데이터 a/@5003b/@5002  

이렇게 바뀌게 되고, obj 가 가지고 있는 주소 값은 변하지 않았다.

근데, 주소 7001 이 가지고 있는 값은 변했다.
이 차이점을 이해한다면, 원시형 객체는 왜 불변하다고 하는지 참조형 객체는 왜 가변한 것인지 이해하는데 도움이 될 수 있을 것이다.

이번 포스팅에서는, 불변과 가변에 대해서 구분해보는 시간을 가졌다. 다음 포스팅은, 얕은 복사와 깊은 복사에 대해서 다루어보기로 하자.

This post is licensed under CC BY 4.0 by the author.