[TIL] 기본형 데이터와 참조형 데이터_불변값과 가변값

hsecode·2022년 11월 16일
0

코어자바스크립트

목록 보기
3/4
post-thumbnail

[Core JavaScript. 핵심 개념과 동작원리 이해하기]

불변값

변수(variable) ➡️ 바꿀 수 있음
상수(constant) ➡️ 바꿀 수 없음 ≠ 불변값
---> 여기서 변경 가능성의 대상은 변수 영역 메모리.
한번 데이터 할당이 이루어진 변수 공간에 다른 데이터를 재할당할 수 있는지 여부가 관건이다.

but.

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

var a = 'abc'; // 변수 a에 abc를 할당
a = a + 'def'; // ⭐️기존의 'abc'를 바꾸는게 아니고, 새로운 문자열 'abcdef'를 만들어 a에 저장한다.


var b = 5; // 변수 b에 5를 할당
var c = 5; // ⬆️변수 b를 만들며 만들어 둔 데이터가 있으므로 이를 재활용
b = 7; // ⭐️기존에 저장된 5를 바꾸는 것이 아니라, 기존에 저장된 7이 있다면 그것을 재활용하고 없다면 새로 만들어서 b에 저장하는 것.

즉, 기존에 저장된 abc와 5는 다른 값으로 변경할 수 없다. ➡️ 불변값의 성질.
한번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다.

가변값

기본형 데이터는 모두 불변값이지만, 참조형 데이터가 모두 가변값인 것은 아니다.
참조형 데이터의 할당 과정을 알아보자.

var obj1 = {
  a: 1,
  b: 'bbb'
};

  1. 변수 영역의 빈공간(@1002)을 확보하고 그 주소의 이름을 obj1로 지정한다.
  2. 임의의 데이터 저장공간(@5001)에 데이터를 저장..하려고 보니 여러개의 프로퍼티로 이루어진 데이터 그룹이다.
    이 그룹 내부의 프로퍼티들을 지정하기 위해 별도의 변수 영역을 마련하고, 그 영역의 주소(@7003~...)을 @5001에 저장한다.
  3. @7003, @7004에 각각 a와 b라는 프로퍼티 이름을 지정한다.
  4. 우선 데이터 영역에서 숫자 1을 검색해본다. 검색 결과가 없으므로 임의로 @5003에 저장하고, 이 주소를 @7003에 저장한다.
    문자열 'bbb'역시 임의로 @5004에 저장하고, 이 주소를 @7004에 저장한다.

➡️ 기본형 데이터와의 차이는 객체의 변수(프로퍼티) 영역이 별도로 존재한다는 점이다. 여기서 객체가 별도로 할애한 영역은 변수 영역일 뿐 '데이터 영역'은 기존의 메모리 공간을 그대로 활용하고 있다. 데이터 영역에 저장된 값은 모두 불변값이다.

but 변수에는 다른 값을 얼마든지 대입할 수 있다.(4번)
이때문에 참조형 데이터는 불변하지 않는다(가변값이다)라고 하는 것.

profile
Markup Developer 💫

0개의 댓글