기본형 데이터와 다른 메모리 할당 매커니즘을 가지고 있어
데이터 가변성을 나타내고 있다.
참조형 데이터의 종류에는 아래와 같다.
- object
- array,
- function,
- RegExp,
- Set / WeakSet
- Map / WeakMap
1. let a = { name: "Kim" } 이라는 객체 선언
변수 영역
변수명 | a | |
주소 | @201 |
데이터 영역 (Stack)
주소 | 201 | 202 |
데이터 | @401~? | "Kim" |
데이터 영역 (Heap)
주소 | 401 | 402 |
이름 | name | |
데이터 | @202 |
객체의 경우 여러개의 변수와 값을 모아놓은 그룹이기 때문에
기본형과는 다르게 데이터 영역 주소 201에 모든 데이터 값을 저장할 수가 없다.
또 특이하게 주소 201의 데이터에 ~? 라고 표시가 되어있는데 이는
이 객체가 계속해서 확장 될 수 있기 때문에 401부터 n번까지를 계속 참조하겠다는 뜻이다.
2. let a = { name: "Kim } a.name = ' lee '
변수 영역
변수명 | a | |
주소 | @201 |
데이터 영역 (Stack)
주소 | 201 | 202 | 203 |
데이터 | @401~? | "Kim" | "lee" |
데이터 영역 (Heap)
주소 | 401 | 402 |
이름 | name | |
데이터 | @203 |
참조형 데이터는 기본형 데이터가 가지는 메모리 저장 영역 외 별도의 저장 영역이 더 있는 것 말고는
전반적으로 값이 변경되는 매커니즘은 흡사하다.
이전에 썼던 기본형 데이터 예시에서
let a = 1; a=2 값 변경 시 데이터 영역의 메모리에 새로 값을 할당하여 변수 영역의 주소 @201 => @202 로 주소가 바뀌었고 기존 @201의 값은 변경되지 않기 때문에 불변성
참조형 데이터에서 let a = { name: "Kim } a.name = ' lee ' 객체의 값 변경 시 변수 영역의 참조 주소는
@201 => @201로 변경되지 않은 채 @201 주소의 데이터 영역 내에서 변화가 일어나기 때문에 가변성
3. let a = { name: "Kim } let b = a; b.name = ' lee '
변수 영역
변수명 | a | b |
주소 | @201 | @201 |
데이터 영역 (Stack)
주소 | 201 | 202 | 203 |
데이터 | @401~? | "Kim" | "lee" |
데이터 영역(Heap)
주소 | 401 | 402 |
이름 | name | |
데이터 | @203 |
let b = a를 선언하게 되면 b도 a와 같은 주소를 참조
그런데 이 상태에서 b 객체의 값을 변경하게 된다면 같은 주소의 값이 변경 되기 때문에 a.name의 값도 lee로 변경
이러한 특성은 얕은 복사와 깊은 복사로 이어지고, 때문에 참조형 데이터를 복사하고 수정할때는 주의 !
얕은 복사 & 깊은 복사
얕은 복사
주소값을 복사 (스택 영역)하기 때문에 참조하고 있는 실제 값은 같다.
깊은 복사
실제 값을 메모리 공간에 복사 (힙 영역) 하기 때문에 참조하고 있는 실제 값이 다르다.