blog-imgDucklog

불변값 가변값

불변값

우리는 변수와 상수를 변경 가능성으로 구분해야한다.

변수는 바뀔 수 있지만 상수는 바꿀 수 없다. 그래서 불변값과 상수를 같은 개념으로 오해하기도 한다.

변수와 상수를 구분 짓는 변경 가능성의 대상은 변수 영역 메모리다. 즉, 한번 데이터를 할당한 변수 공간을 재사용할 수 있는지가 관건이다.


하지만 불변셩의 여부를 구분할 때의 변경 가능성의 대상은 데이터 영역 메모리다.

저번 글에서 기본형 데이터에는 숫자, 문자열, boolean, null, undefined, symbol(es6)이 있다는 것을 알 수 있었다. 위에서 쓴 기본형 데이터는 모두 불변값이다.

예시를 이용하여 불변성의 개념을 알아보자.

불변성 예시
var a = 'abc';
a = a + 'def';

var b = 5;
var c = 5;
b = 7;

첫번째 코드에서 a에 문자열 abc를 할당했다가 def를 더하면, 기존의 abc가 'abcdef'로 바뀌는게 아니라, 새로운 'abcdef'를 만들어 그 주소를 변수 a에 저장한다. 그렇기 때문에 'abc'와 'abcdef'는 완전 별개의 데이터다.


그 후 변수 b에 숫자 5를 할당한다. 그러면 컴퓨터는 데이터 영역에서 5를 찾고 없으면, 데이터 공간을 하나 만들어서 저장하게 된다. 그리고 그 주소를 b에 저장한다.


그 다음 코드에서 c에 숫자 5를 할당하는데, 이미 그 전에 숫자 5를 새 주소에 저장해놨기 때문에 주소를 재활용한다.


마지막 코드에서 b를 7로 바꾸려고 한다. 그러면 저장된 5를 바꾸는 것이 아니라, 7이 있는지 확인하고 없다면 5를 저장했던 것처럼 새롭게 주소를 만들어 저장한다.

그렇기 때문에 5와 7 모두 다른 값으로 바뀔 수 없다.

이처럼 문자열도 한번 만든 값을 바꿀 수도 없고 숫자도 다른 값으로 바뀔 수 없다. 이게 바로 불변값의 성질이며 가비지 컬렉팅이 당하지 않는 이상 영원히 변하지 않는다.


가변값

기본형 데이터는 모두 불변값이지만 참조형 데이터는 다르다. 참조형 데이터는 기본적으로 가변값이지만, 때에 따라서 변경이 불가능하거나 불변값으로 활용하기도 한다.

참조형 데이터 할당
var obj = {
  a: 1,
  b: 'bbb',
};

참조형 데이터를 할당하는 순서
  • 변수 영역에서 빈 공간(@1002)를 확보한 후 주소 이름을 obj로 지정한다.

  • 임의의 데이터 저장 공간(@5001)에 데이터를 저장하려고 보니 여러 개로 이루어진 데이터 그룹이기 때문에 별도의 변수 영역을 만들고, 그 영역의 주소(@7103 ~?)를 @5001에 저장한다.

  • @7103및 @7104에 각각 a와 b라는 프로퍼티 이름을 지정해준다.

  • 데이터 영역에서 숫자 1를 검색하고, 없기 때문에 임의로 @5003에 저장하고 이 주소를 @7103에 저장한다.

  • 문자열 'bbb'도 임의의 @5004에 저장하고 이 주소를 @7104에 저장한다.


기본형 데이터와 다르게 객체의 변수 영역이 별도로 존재한다.


데이터 영역에 있는 값들은 모두 불변값이지만, 변수에 다른 값을 얼마든지 대입할 수 있기 때문에 참조형 데이터는 **불변하지 않다(가변적)**라고 한다.


참조형 데이터의 프로퍼티 재할당

그렇다면 데이터를 재할당할 때는 어떤 순서로 진행될까?

var obj = {
  a: 1,
  b: 'bbb',
};
obj.a = 2;

obj의 a에 숫자 2를 할당하려고 코드를 작성했기 때문에 우선 숫자 2를 데이터 영역에서 검색하고 만약 없다면, 빈 공간인 @5005에 저장하고 이 주소를 @7103에 저장한다.


그래서 변수 obj가 바라보는 @5001로 변하지 않았다. 즉 새로운 객체가 만들어진게 아니라 객체 내부의 값만 바뀐 것이다.


다음 글에서는 기본형 데이터와 참조형 데이터의 차이와 변수 복사를 비교에 관한 글을 다룰 것이다!