Javascript의 원시 자료형과 참조 자료형을 알아보자!
먼저 간단하게 원시 자료형과 참조 자료형을 비교해보면,
- 원시 자료형이 할당될 때는 변수에 값(value) 자체가 담기고, 참조 자료형이 할당될 때는 보관함의 주소(reference)가 담긴다.
- 참조 자료형은 기존에 고정된 크기의 보관함이 아니라, 동적으로 크기가 변하는 특별한 보관함을 사용한다.
JavaScript에서 원시 타입의 데이터(primitive data types; 원시 자료형)는 객체가 아니면서 method를 가지지 않는 6 가지의 타입 , string, number, bigint, boolean, undefined, symbol, (null)으로 구분될 수 있다.
'string', 42, true, false, undefined // 데이터가 "하나"의 정보를 담고 있습니다.
const colors = ['Blue', 'Green', 'Red', 'Pink']; // 사용될 수 있는 색의 종류를 담고 있습니다.
const archer = {
name: 'tyrande',
race: 'night elf',
str: 29,
dex: 49,
// ...
} // 특정 게임의 궁수(archer)의 정보를 담고 있습니다.
- 참조 자료형과 구분되게, 원시 자료형의 보관함인 변수에는 하나의 원시 자료형만 담을 수 있다.
- 참조 자료형(배열, 객체)는 어떻게 코드를 작성하느냐에 따라 보관되는 데이터의 양이 천 개, 만 개가 될 수 있는반면 원시 자료형은 "하나"의 의미를 가지는 데이터임에는 변함이 없다.
- 그렇기 때문에 원시 자료형이 담기는 보관함의 크기는 고정하는 것이 합당하다. 어느 정도 일정한 크기의 데이터가 온다고 예상할 수 있기 때문!
const num1 = 123;
const num2 = 123456789;
"hello world!"
"hello codestates!"
// "hello world!" 와 "hello codestates!"는 모두 변경할 수 없는 고정된 값입니다.
let word = "hello world!"
word = "hello codestates!"
// 하지만, word라는 변수에 재할당을 하여 변수에 담긴 내용을 변경하는 것은 가능합니다.
const num1 = 123;
num1 = 123456789; // 에러 발생
// const 키워드로 선언하면, 재할당은 불가합니다.
위의 예처럼 변수에는 데이터의 크기와는 관계없이 하나의 데이터만 담을 수 있다. 원시 자료형은 값 자체에 대한 변경이 불가능(immutable)하지만, 변수에 다른 데이터를 할당할 수는 있다.
흠... 하지만 배열과 객체를 담았을 때는, 여러 데이터가 들어갔다가 나갔다가 하지 않나? 하나만 못 담는데..
- JavaScript에서 원시 자료형이 아닌 모든 것은 참조 자료형이다.
- 배열([])과 객체({}), 함수(function(){})가 대표적!
- 옛날에는 리스트를 구현하기 어려워서 띄어쓰기, 탭, 쉼표 등으로 데이터를 구분하여 배열과 비슷한 형태로 자료 구조를 구현하기 시작했다.
- 이 흔적은 csv에서도 찾아볼 수 있는데, 쉼표로 구분된 데이터(comma-separated values)라는 의미를 가지고 있다.
10,20,30,40,50,60
왜 참조형은 따로 자료 구조를 구현해야 했을까?
- 참조 자료형에는 하나의 데이터가 아닌 여러 데이터가 담긴다. 그래서 원시 자료형이 보관되는 데이터 보관함이 아닌 특별한 데이터 보관함에 저장한다.
- 이 데이터가 위치한 곳(메모리 상 주소)을 가리키는 주소가 변수에 저장된다
- 즉, 변수에는 특별한 데이터 보관함을 찾아갈 수 있는 주소가 담겨있고,마음대로 사이즈를 늘렸다가 줄였다가 한다. ("동적(dynamic)으로 변한다"라고 하기도 합니다.)
- 이처럼 데이터는 별도로 관리되고, 우리가 직접 다루는 변수에는 주소가 저장되기 때문에 reference data type이라고 불린다. 이런 특별한 데이터 보관함을 heap이라고도 부른다.
그렇다면... 왜 동적으로 크기가 변하는 것일까?
배열과 객체는 대량의 데이터를 쉽게 다루기 위해서 사용된다. 쉽게 사용할 수 있는 이유는 크기가 고정되어 있지 않고 우리가 데이터를 추가하고 삭제하는 것에 따라서 크기가 달라지기 때문이다.
대량의 데이터가 들어오는 경우 고정된 데이터 공간을 사용하는 것이 비효율적!
그렇기 때문에 별도의 저장 공간을 마련하여 따로 관리하게 된다. 변수에는 원시 값 혹은 주소만 지정할 수 있고, 주소는 크기가 변하는 특별한 데이터 저장소를 참조하게 되는 것이다.
마지막으로 원시 자료형과 참조 자료형의 특징을 비교해보자
- 원시 자료형이 할당될 때에는 변수에 값(value) 자체가 담기고, 참조 자료형이 할당될 때는 보관함의 주소(reference)가 담김.
- 참조 자료형은 기존에 고정된 크기의 보관함이 아니라, 동적으로 크기가 변하는 특별한 보관함을 사용할 수 있음.
- 참조타입 데이터는 주소를 복사하기 떄문에 복사한 데이터에서 원소를 변경하게 되면 주소 안의 데이터가 변경되기 때문에 기존 데이터에 영향이 감
- 값을 저장하는 대신 데이터가 담긴 저장소의 주소를 저장하는 것은 참조 자료형의 특징