개요
고정된 공간을 차지하는 데이터를 원시자료형(primitive data type), 대량의 데이터를 다루기에 적합한 배열과 객체는 참조 자료형(reference data type) 이라고 분류합니다. 참조 자료형은 원시 자료형과 달리 저장 공간이 계속 늘어날 수 있습니다.
학습 목표
- 원시 자료형과 참조 자료형의 구분이 왜 필요한지에 대해서 이해할 수 있다.
- 원시 자료형과 참조 자료형의 차이를 이해하고 각자 맞는 상황에서 사용할 수 있다.
- 원시 자료형이 할당될 때는 변수에 값(value) 자체가 담기고 참조 자료형이 할당될 때는 보관함의 주소(reference)가 담긴다는 개념을 코드로 설명할 수 있다.
- 참조 자료형은 기존에 고정된 크기의 보관함이 아니라 동적으로 크기가 변하는 특별한 보관함을 사용한다는 것을 이해할 수 있다.
원시 타입 자료형 개요
- 메모리의 스택(stack)에 변수명에 해당하는 이름표에 값(value)가 보관됩니다.
number
, boolean
, null
, undefined
, string
5가지는 원시 자료형입니다.
bigint
, symbol
도 원시 자료형이지만 자주 사용하지 않습니다.
참조 타입 자료형 개요
- 메모리에 힙(heap)이라는 빈공간을 만들어서 값(요소)들을 줄줄이 연결해줍니다.
- 이름과 주소(reference)를 스택(stack)에 저장해서 필요할 때 이름과 주소값을 참조해서 요소들을 CRUD 합니다.
array
, object
, function
3가지가 참조 자료형에 해당합니다.
원시 자료형과 참조 자료형 데이터 복사 비교
- 원시 자료형 : 원시 자료형 간의 데이터(값, value) 복사시에 값자체를 복사하기에 서로의 값에 영향이 가지 않습니다. (immutable)
let a = 1; // a=1
let b = a; // a=1, b=1
let b = 2; // a=1, b=2
- 참조 자료형 : 참조 자료형 데이터 복사시에 주소(refernece)를 복사하기에 서로의 값(요소)에 영향이 갈 수 있습니다. (mutable)
// 서로의 요소에 영향을 줄때
let arr1 = [10, 20]; // arr1 = [10, 20]
let arr2 = arr1; // arr1 = [10, 20], arr2 = [10, 20]
let arr2[0] = 15; // arr1 = [15, 20], arr2 = [15, 20]
// 서로의 요소에 영향을 주지 않기 위한 예시
let arr1 = [10, 20]; // arr1 = [10, 20]
let arr2 = arr1.slice(); // arr1 = [10, 20], arr2 = [10, 20]
let arr2[0] = 15; // arr1 = [10, 20], arr2 = [15, 20]
왜 원시 자료형이라고 부르나요?
- 옛날 컴퓨터(BASIC 등)에서는 데이터 보관함 한 칸(stack)에 하나의 데이터만 넣을 수 있는 그때의 "원시적인" 방식이였습니다.
- 배열이 없지는 않았지만 보통 사이즈가 제한되어 있었습니다.
- 변수에는 하나의 데이터만 담습니다.
왜 참조 자료형이라고 부르나요?
- 옛날 컴퓨터에서는 배열(리스트) 개념을 구현하기 어려워서 띄어쓰기, 탭, 쉼표 등으로 데이터를 구분하여 배열과 비슷한 형태로 자료 구조를 구현하기 시작했습니다. (이 흔적은 csv에서 찾아볼 수 있습니다.)
- 과거에는 보통 배열의 사이즈가 제한되어 있었기 때문에 배열을 여러개 만들어야 한다거나 요소의 길이가 변경되는 CRUD 진행시 발생되는 번거로움이 많이 있었습니다.
- 그에 대한 해결법으로 현재는 "데이터의 크기가 동적으로 변하는" 특별한 데이터 보관함을 사용합니다.
- 참조 자료형의 변수에는 특별한 데이터 보관함을 찾아 갈수 있는 주소를 저장하고 CRUD가 필요할 때 해당 주소를 참조(reference)하여 값(요소)들을 관리합니다.
특별한 데이터 보관함 heap
- 자기 마음대로 사이즈를 늘렸다가 줄였다가 합니다.
- "동적(dynamic)으로 변한다"라고 표현하기도 합니다.
- 데이터는 별도로 관리되고 우리가 직접 다루는 변수에는 주소가 저장됩니다.
결론
변수에는 원시 값 혹은 주소만 지정할 수 있습니다.
주소는 크기가 변하는 특별한 데이터 저장소(heap)를 참조합니다.