이번 포스팅부터 다음 포스팅에서는 데이터 타입부터 얕은복사, 깊은 복사까지 많은 내용이 나오긴 할테지만 최대한 축약하여 정리하고자 한다 !
#1. 데이터 타입
자바스크립트에서는 데이터 타입을 크게 2가지로 나뉠수 있는데 바로 오늘의 제목인 기본형과 참조형 데이터다.

사실 우리가 이미 많이 봤던 데이터들이나 위와 같이 나눠지는 기준은 값의 저장방식과 불변성의 여부이다.
[기본형과 참조형의 구분 기준]
1. 복제의 방식
- 기본형 : 값이 담긴 주소값을 바로 복제
- 참조형 : 값이 담긴 주소값들로 이루어진 묶음을 가리키는 주소값을 복제
2. 불변성의 여부
- 기본형 : 불변성을 띔
- 참조형 : 불변성을 띄지 않음
위 내용을 이해하기 위해서는 데이터가 저장되는 방식에 대해서 확인을 해야하는데 아래와 같다 !
#2. 데이터 할당
// 기본형 데이터
/** 선언과 할당을 풀어 쓴 방식 */
var str;
str = 'test!';
/** 선언과 할당을 붙여 쓴 방식 */
var str = 'test!';
이렇게 변수를 선언하고 데이터를 할당했을 때 컴퓨터에서는 어떻게 저장을 할까?
컴퓨터에는 메모리 라는것이 있고 각 변수와 데이터마다 고유한 주소값이 있어 해당 주소값에 저장하고 불러올 때는 해당 주소값을 참고한다.
아래 메모리 주소 예시에 선언된 변수와 할당된 데이터 주소를 확인해보자.
| 변수 | 주소 | ... | 1002 | 1003 | 1004 | ... |
| 데이터 | str/@5002 |
데이터 메모리 주소 예시
| 데이터 | 주소 | ... | 5002 | 5003 | 5004 | ... |
| 데이터 | 'test!' | 123 |
먼저 str이라는 변수가 1002 라는 주소에 저장되고, 'test!' 라는 문자열 데이터가 데이터 메모리인 5002 주소에 저장되었다.
str이라는 변수에는 'test!' 문자열이 할당되었으니 문자열의 메모리 주소값인 /@5002 주소가 함께 저장된다.
이때 str 이라는 변수에 123 이라는 숫자 데이터로 재할당하게 된다면 어떻게 될까?
변수 주소는 그대로(1002) 있지만 그 안에 저장된 값이 str/@5003 으로 변경될 것이다.
(123이라는 데이터가 데이터 영역 주소에 없기 때문에 새로운 주소에 저장되었다.)
기존 데이터 영역인 5002의 데이터가 변경된 것이 아니라 5003에 새롭게 저장되었다.
더이상 쓰이지 않는 데이터 영역에 @5002 는 가비지 컬렉터에 의해 수거된다.
결론적으로 아래와 같이 정리할 수 있는데
메모리를 기준으로 생각하는 두가지 개념 !
1. 변수 vs 상수
- 변수 : 변수 영역 메모리를 변경할 수 있음
- 상수 : 변수 영역 메모리를 변경할 수 없음
2. 불변하다 vs 불변하지 않다(가변하다)
- 불변하다 : 데이터 영역 메모리를 변경할 수 없음
- 불변하지 않다 : 데이터 영역 메모리를 변경할 수 있음
참조형 데이터는 어떨까?
// 참조형 데이터는 별도 저장공간(obj1을 위한 별도 공간)이 필요합니다!
var obj1 = {
a: 1,
b: 'bbb,
};
변수 메모리 주소 예시
| 변수 | 주소 | ... | 1002 | 1003 | 1004 | ... |
| 데이터 | obj1/@8002~3 |
데이터 메모리 주소 예시
| 데이터 | 주소 | ... | 5002 | 5003 | 5004 | ... |
| 데이터 | 1 | 'bbb' |
데이터 메모리 주소 예시
| obj1 | 주소 | ... | 8002 | 8003 | 8004 | ... |
| 데이터 | a/@5002 | b/@5003 |
참조형 데이터의 경우 obj1을 위한 별도의 저장공간이 필요하고 위 예시와 같이 저장된다.
이때 저장된 obj의 프로퍼티 중 a key값에 해당하는 value를 변경하면 어떻게 될까?
var obj1 = {
a: 1,
b: 'bbb',
};
// 데이터를 변경해봅시다.
obj1.a = 2;
변수 메모리 주소 예시
| 변수 | 주소 | ... | 1002 | 1003 | 1004 | ... |
| 데이터 | obj1/@8002~3 |
데이터 메모리 주소 예시
| 데이터 | 주소 | ... | 5002 | 5003 | 5004 | ... |
| 데이터 | 1 | 'bbb' | 2 |
참조형 데이터 메모리 주소 예시
| obj1 | 주소 | ... | 8002 | 8003 | 8004 | ... |
| 데이터 | a/@5004 | b/@5003 |
데이터 영역에 저장된 값은 여전히 불변값이지만, obj1만을 위한 영역은 변경이 가능하다.
따라서 참조형 데이터를 불변하지 않다(가변하다) 고 표현할 수 있다.
중첩 객체도 한번 알아보자 !
var obj = {
x: 3,
arr: [3, 4, 5],
}
// obj.arr[1]의 탐색과정은 어떻게 될까요? 작성하신 표에서 한번 찾아가보세요!
변수 메모리 주소 예시
| 변수 | 주소 | ... | 1002 | 1003 | 1004 | ... |
| 데이터 | obj/@7002~3 |
데이터 메모리 주소 예시
| 데이터 | 주소 | ... | 5002 | 5003 | 5004 | ... |
| 데이터 | 3 | 4 | 5 |
참조형 메모리 주소 예시
| obj1 | 주소 | ... | 7002 | 7003 | 7004 | ... |
| 데이터 | x/@5002 | arr/@8002~4 |
중첩 객체 메모리 주소 예시
| arr | 주소 | ... | 8002 | 8003 | 8004 | ... |
| 데이터 | 0/@5002 | 1/@5003 | 2/@5004 |
이렇게 메모리에 저장되는 것에 따라 변수와 상수, 불변과 가변에 대해서 알아보았는데
사실 이렇게 알아보게 된 이유는 앞으로 배우게 될 데이터 복사에 대해 이해해야하기 때문이다 !
다음 포스팅에서는 변수와 객체를 복사하였을 때 어떤 현상이 벌어지게되고 그로 인해 발생되는 문제가 무엇인지 확인해보고자 한다.
'자바스크립트 도전' 카테고리의 다른 글
| 자바스크립트_Chapter 15. 얕은 복사 / 깊은 복사 (1) | 2023.11.14 |
|---|---|
| 자바스크립트_Chapter 12. 일급 객체로서의 함수 (First Class Function) (0) | 2023.11.09 |
| 자바스크립트_Chapter 11. 전개구문 (Spread) (0) | 2023.11.08 |
| 자바스크립트_Chapter 10. 구조분해할당 (Destructuring) (0) | 2023.11.07 |
| 자바스크립트_Chapter 9. 동기/비동기 vs Block/Non-Block (1) | 2023.11.02 |