원시 자료형 깊게 이해하기
자바스크립트에서 원시 타입의 데이터(primitive data types; 원시 자료형)는 객체가 아니면서 method를 가지지 않는 6 가지의 타입
string, number,bigint, boolean, undefined, symbol, (null)
을 말한다.
왜 원시 자료형이라고 부르나요?
'string', 42, true, false, undefined // 데이터가 "하나"의 정보를 담고 있습니다.
원시 자료형은 모두 "하나"의 정보, 즉, 데이터를 담고 있다. 옛날에 어떻게 코드를 작성했는지를 돌아보면, 왜 이런 단순한 데이터가 "원시적인" 데이터라고 이야기 하는지 조금은 더 쉽게 이해하실 수 있다. 그 때는 데이터 저장소(메모리)의 용량이 제한되어 변수 하나에 데이터 용량이 제한된 하나의 원시 자료형 밖에 담을 수 밖에 없었기 때문이다.
옛날 컴퓨터에서 사용되던 BASIC이라는 컴퓨터 언어인데, 우리가 알고 있는 string과 number는 쉽게 찾을 수 있지만, 배열에 상응하는 녀석은 찾기 어렵다. 이 때는 배열이 구현 가능했더라도 보통 사이즈가 제한되어 있었다.
원시 자료형의 보관함인 변수에는 하나의 원시 자료형만 담을 수 있다. 이 특징은 참조 자료형이 보관되는 특별한 보관함과는 구분된다. 우리가 배웠던 참조 자료형(배열, 객체...)는 어떻게 코드를 작성하느냐에 따라 보관되는 데이터의 양이 천 개, 만 개가 될 수 있다. 반면에, 원시 자료형은 "하나"의 의미를 가지는 데이터임에는 변함이 없다. 그렇기 때문에 원시 자료형이 담기는 보관함의 크기는 고정하는 것이 합당하다. 어느정도 일정한 크기의 데이터가 온다고 예상할 수 있기 때문이다.
변수에는 하나의 데이터만 담는다.
const num1 = 123;
const num2 = 123456789;
이렇게 변수에는 데이터의 크기와는 관계 없이 하나의 데이터만 담을 수 있다. 원시 자료형은 값 자체에 대한 변경이 불가능(immutable)하지만, 변수에 다른 데이터를 할당할 수는 있다.
"hello world!"
"hello codestates!"
// "hello world!" 와 "hello codestates!"는 모두 변경할 수 없는 고정된 값입니다.
let word = "hello world!"
word = "hello codestates!"
// 하지만, word라는 변수에 재할당을 하여 변수에 담긴 내용을 변경은 가능합니다.
const num1 = 123;
num1 = 123456789; // 에러 발생
// const 키워드로 선언하면, 재할당은 불가합니다.
참조 자료형 깊게 이해하기
자바스크립트에서 원시 자료형이 아닌 모든 것은 참조 자료형이다. 배열([])과 객체({}), 함수(function(){})가 대표적이다. 이런 자료형을 자바스크립트에서는 참조 자료형(reference data type; 참조 타입)이라고도 부른다.
참조 자료형이 저장되는 특별한 보관함
참조 자료형에는 하나의 데이터가 아닌 여러 데이터가 담기게 된다. 그래서 참조 자료형의 데이터 자체는 지금까지 배웠던 원시 자료형이 보관되는 데이터 보관함이 아닌 특별한 데이터 보관함에 저장된다. 이 데이터가 위치한 곳(메모리 상 주소)을 가리키는 주소가 변수에 저장된다. 즉, 변수에는 특별한 데이터 보관함을 찾아갈 수 있는 주소가 담겨있고, 이 주소를 따라가보면 특별한 데이터 보관함을 찾을 수 있는데, 이 특별한 데이터 보관함에서는 자기 마음데로 사이즈를 늘렸다가 줄였다가 한다. ("동적(dynamic)으로 변한다"라고 하기도 합니다.) 이처럼 데이터는 별도로 관리되고, 우리가 직접 다루는 변수에는 주소가 저장되기 때문에 reference type이라고 불립니다. 이런 특별한 데이터 보관함을 heap이라고도 부른다.
우리가 흔히 참고자료를 찾을 때, 레퍼런스(reference)를 찾는다고 종종 이야기한다. 이 레퍼런스라는 단어는 본래 참조할 만한 자료라는 영어 단어로 실생활에서 자주 쓰이지만, 컴퓨터 공학에서는 변수가 가리키고(refer)있는 데이터의 참조한다는 의미로 사용된다.
특별한 데이터 보관함은, 왜 동적으로 크기가 변하게 되었을까요?
대량의 데이터는 고정된 데이터 공간을 사용하는 것이 비효율적이다. 그렇기 때문에, 크기가 상황에 따라서 커졌다가 작아지는 특별한 데이터 저장소를 만들어 사용하기로 합의했다. 데이터가 언제 늘어나고 줄어들지 모르기 때문에 별도의 저장공간을 마련하여 따로 관리하는 것이다. 변수에는 원시값 혹은 주소만 지정할 수 있고, 주소는 크기가 변하는 특별한 데이터 저장소를 참조하게 되는 것이다.
원시 자료형과 참조 자료형의 특징
- 원시 자료형이 할당될 때에는 변수에 값(value) 자체가 담기고, 참조 자료형이 할당될 때는 보관함의 주소(reference)가 담긴다.
- 그래서 참조 자료형은 기존에 고정된 크기의 보관함이 아니라, 동적으로 크기가 변하는 특별한 보관함을 사용할 수 있다.
'TIL > Code States' 카테고리의 다른 글
Code States 13일차 - 클로저 (0) | 2021.08.04 |
---|---|
Code States 13일차 - 스코프 (0) | 2021.08.04 |
Code States 12일차 - CSS 중급 (0) | 2021.08.03 |
Code States 10일차 - 배열, 객체 (0) | 2021.07.30 |
Code States 8일차 - CLI 기본 명령어 (0) | 2021.07.28 |