책으로 공부한 걸 복습하는 차원에서 정리하며 글을 써보기로 했다.
가끔은 책으로 공부하는 것도 정제된 내용을 순차적으로 공부할 수 있어 좋은 점이 있다.
기본형 : 숫자(Number), 문자열(String), 불리언(Boolean), Null, Undefined, Symbol 등
참조형 : 객체(Object)
➡️ 객체의 하위 분류 : 배열(Array), 함수(Function), 날짜(Date), 정규표현식(RegExp), Map, WeakMap, Set, WeakSet 등
기본형과 참조형의 구분점
기본형은 값이 담긴 주솟값을 바로 복제하고, 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다는 점이 다르다.
기본형은 불변성(=변하지 않는다)을 띈다. 불변성을 잘 이해하기 위해 살짝의 메모리와 데이터에 대한 지식을 공부해보자.
비트(bit) : 0과 1만을 표현할 수 있는 하나의 메모리 조각, 각 비트는 고유한 식별자를 통해 위치를 확인할 수 있다.
바이트(byte) : 1바이트 = 8비트, 총 256개의 값을 표현할 수 있다.
모든 데이터는 바이트 단위의 식별자, 메모리 주솟값을 통해 서로 구분하고 연결할 수 있다.
변수 : 변경 가능한 데이터가 담길 수 있는 공간 또는 그릇. 숫자, 문자열, 객체, 배열 등 모든 것이 데이터에 해당된다.
식별자 : 어떤 데이터를 식별하는 데 사용하는 이름. = 변수명
var a;
a = 'abc';
var a = 'abc'; // 코드는 달라도 자바스크립트 엔진은 결국 같은 동작을 수행.
a라는 이름의 변수 메모리에 데이터 'abc'를 직접 저장하는 것이 아니라, 별도의 메모리에 데이터 'abc'를 저장하고 그 주소를 변수 a의 메모리에 저장하는 방식으로 이뤄진다.
글만으로는 이해가 부족할 수 있으니 표로 확인해보자.
주소 | 100 | 101 | 102 | 103 | ... |
---|---|---|---|---|---|
데이터 | 이름 : a 값 : @201 |
주소 | 200 | 201 | 202 | 203 | ... |
---|---|---|---|---|---|
데이터 | 'abc' |
이렇게 번거로운 단계를 거치는 이유는 데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 더욱 효율적으로 관리하기 위한 고민의 결과이다
여기서, 'abc'의 마지막에 'def'를 추가한다고 해보자.
기존의 문자열 'abc'가 담긴 @201에 'abcdef'로 변경하여 할당하는 것이라고 생각할지도 모른다.. (나도 그랬다)
하지만 틀렸다. 새로운 별도의 공간에 'abcdef'라는 문자열을 새로 만들어 저장하고 그 주소를 @100에 대입한다. 기존 문자열에 어떠한 변환을 가하든 상관 없이 무조건 새로 만들어 별도의 공간에 저장한다. 이 때, 그 전 데이터는 자신의 주소를 저장하는 변수가 하나도 없게 되면 가비지 컬렉터
의 수거 대상이 된다.
주소 | 100 | 101 | 102 | 103 | ... |
---|---|---|---|---|---|
데이터 | 이름 : a 값 : @201 -> @203으로 변경 |
주소 | 200 | 201 | 202 | 203 | ... |
---|---|---|---|---|---|
데이터 | 'abc' | 'abcdef' |
여기서 또 한번 정확하게 느낄 수 있다. 번거롭다고 생각할 지 몰라도, 이렇게 분류하여 저장한다면 중복된 데이터에 대한 처리 효율이 높아진다.
첫 장에서 왜 이렇게 번거롭게 데이터를 관리할까? 라고 성급하게 생각한 나 자신을 반성한다.
이제보니 너무 효율적인 방법이였다!