원시 자료형(primitive data types)이란?
- JavaScript에서 객체가 아니면서 method를 가지지 않는 6가지의 타입을 말한다.
string, number, bigint, boolean, undefined, symbol, null
- 고정된 저장 공간을 차지하는 데이터이다.
- 변수에 하나의 데이터만 담을 수 있다.
- 값 자체에 대한 변경이 불가능(immutable)하지만 변수에 다른 데이터를 할당할 수 있다.
// 원시 자료형은 변수(보관함)에 하나의 데이터만 담을 수 있다.
let num1 = 123;
let num2 = 123456789;
// "hello world"는 변경할 수 없는 고정된 값이다.
"hello world"
// 하지만 word라는 변수에 재할당을 하여 변수에 담긴 내용을 변경하는 것은 가능하다.
let word = "hello world"
word = "hello"
let x = 2;
let y = x;
y = 3;
consloe.log(x); // 2
consloe.log(y); // 3
- 원시 자료형은 그 값 자체를 변수에 할당한다. 즉, 값을 복사하여 변수에 저장한다.
- 변수 x를 y에 할당하는 경우 x의 값은 원시 자료형이기 때문에 2를 y에 할당한다.
- 하지만 변수 y에 3이 할당되어도 x는 2이다. x의 값을 y로 복사하여 할당했기 때문에 세번째 줄의 코드는 변수 x에 영향을 주지 않는다.
참조 자료형(reference data type)이란?
- JavaScript에서 원시 자료형이 아닌 모든 것은 참조 자료형이며 배열과 객체, 함수가 대표적이다.
- 원시 자료형은 변수에 넣을 수 있는 데이터 크기가 제한되기 때문에 대량의 데이터를 다루기에 적합한 참조 자료형을 사용한다.
- 변수에 할당할 때 값이 아닌 주소를 저장한다.
let first = [10, 20, 30, 40];
let second = first;
second[0] = 5;
-
- first === second는 true이다.
O, first와 second는 같은 주소를 참조하기 때문에 true이다.
-
- first의 0번째 인덱스에 있는 요소는 5이다.
O, 값만 복사하는 것이 아닌 같은 주소를 참조하기 때문에 first도 똑같이 변경된다.
-
- first와 second는 다른 주소를 공유하고 있다.
X, 같은 주소를 공유하고 있다.
-
- first와 second는 참조 자료형이다.
O, 같은 주소를 참조하기 때문에 참조자료형이다.
참조 자료형이 저장되는 특별한 데이터 보관함
- 참조 자료형에는 하나의 데이터가 아닌 여러 데이터가 담기며 특별한 데이터 보관함에 저장되는데 이 데이터가 위치한 곳(메모리 상 주소)을 가리키는 주소가 변수에 저장된다. 쉽게 말하자면, 변수에는 특별한 데이터 보관함을 찾아갈 수 있는 주소가 담겨있다.
- 또한 이 특별한 데이터 보관함은 자기 마음대로 사이즈를 늘렸다가 줄였다가 할 수 있는데 이처럼 데이터는 별도로 관리되고 변수에는 주소가 저장되기 때문에 reference data type이라고 불리며 이런 특별한 데이터 보관함을 heap이라고 부른다.
특별한 데이터 보관함이 동적으로 크기가 변하는 이유
- 배열과 객체는 대량의 데이터를 쉽게 다루기 위해서 사용되며 크기가 고정되어 있지 않은데 우리가 데이터를 추가, 삭제하는 것에 따라서 크기가 달라지기 때문이다. 100만 개의 데이터가 들어올 수 있는 상황에서 고정된 데이터 공간을 사용하는 것이 합당할까? 대량의 데이터가 들어오는 경우 고정된 데이터 공간을 사용하는 것이 비효율적이다.
- 그렇기 때문에 크기가 상황에 따라서 커졌다가 작아지는 특별한 데이터 저장소를 만들어 사용하기로 합의하였고 데이터가 언제 늘어나고 줄어들지 모르기 때문에 별도의 저장 공간을 마련하여 따로 관리하는 것이다. 변수에는 원시 값 혹은 주소만 지정할 수 있고 주소는 크기가 변하는 특별한 데이터 저장소를 참조하게 된다.
원시 자료형과 참조 자료형의 특징
- 원시 자료형이 할당될 때에는 변수에 값(value) 자체가 담기고 참조 자료형이 할당될 때는 보관함의 주소(reference)가 담긴다.
- 그래서 참조 자료형은 기존의 고정된 크기의 보관함이 아니라 동적으로 크기가 변하는 특별한 보관함을 사용한다.
[] === [] ?
- 참조 자료형의 ===(strict equality)는 주소값이 같은지 확인하기 때문에 위 두 배열을 비교하면 false를 반환한다.
- 컴퓨터가 위 코드를 읽으면서 이미 두 개의 heap 저장 공간의 주소를 확보하였지만 우리가 눈으로 직접 확인할 수는 없다. 그러므로 두 배열은 서로 다른 주소를 참조하기 때문에 false를 반환한다.