: number, string, boolean, null, undefined, symbol(ES6)
: object, array, function, date, RegExp 등
C/C++, 자바 등 정적 타입 언어는 메모리 낭비 최소화를 위해 데이터 타입별로 할당할 메모리 영역을 2바이트, 4바이트로 나누어 정해놓았다.
하지만 메모리 용량이 커진 후 등장한 JavaScript는 상대적으로 메모리 관리 압박에서 자유로워 졌다. 숫자는 정수형/부동소수형 구분 없이 64비트 즉, 8바이트를 확보한다.
각 비트는 고유한 식별자를 가진다. 바이트 역시 시작하는 비트의 식별자로 위치를 파악할 수 있다. 모든 데이터는 바이트 단위의 식별자, 더 정확하게는 메모리의 주솟값(memory address)을 통해 서로 구분하고 연결 가능하다.
var a;
a = '123';
var a = '456';
변수는 변경 가능한 데이터가 담길 수 있는 공간이다.
const obj = {
a : 'apple',
b : [1, 2, 3]
};
<편의상 가정>
: 둘을 구분하는 것은 '변경 가능성'이다.
단, 이는 불변성과 구분되어야 하는 용어이다.
변수와 상수를 구분 짓는 변경 가능성의 대상 : 변수 영역 메모리
불변성 여부를 구분 할 때의 변경 가능성의 대상 : 데이터 영역 메모리
기본형 데이터는 모두 불변값이다.
참조형 데이터는 모두 가변값이다.
참조형 데이터의 변수 영역에 데이터 할당을 보면 기본형 데이터와의 차이는 객체의 변수(프로퍼티) 영역이 별도로 존재한다는 것이다.
그러나 객체가 별도로 할애한 영역은 변수의 영역이고 데이터는 기존의 데이터 영역의 메모리를 활용한다. 데이터 영역에 저장된 값은 모두 불변값이라는 것이다.
하지만 변수에는 다른 값을 얼마든지 대입할 수 있닫. 이 이유 때문에 참조형 데이터는 가변값이라고 한다.
참조 카운트 : 어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수이다.
참조 카운트가 0인 메모리 주소는 가비지 컬렉터(Garbage collector, GC)의 수거 대상이 된다. 가비지 컬렉터는 런타임 환경에 따라 특정 시점 또는 메모리 사용량이 포화 상태에 임박할 때마다 자동으로 수거 대상을 수거한다!(collecting)
수거된 메모리는 새로운 값을 할당 할 수 있는 빈 공간이 된다.
참조형 데이터가 가변값일 때 가변은 참조형 데이터 그 자체의 변경이 아닌 그 내부의 프로퍼티를 변경할 때만 성립된다.
즉, 참조형 데이터를 불변 객체로 만들고자 한 다면 내부 프로퍼티를 변경할 필요가 있을 때마다 매번 새로운 객체를 만들어 할당하면 참조형 데이터도 불변성을 확보 할 수 있다!
const user = {
name : 'winney',
link : {
blog : 'blog',
git : 'git',
email : 'email',
}
}
얕은 복사(shallow copy) : 바로 아래 단계의 값만 복사하는 방법
깊은 복사(deep copy) : 내부의 모든 값들을 하나하나 찾아서 전부 복사 하는 방법
깊은 복사를 하지 않을 경우 원본과 사본이 모두 동일한 참조형 데이터의 주소를 갖게 되어 사본이 바뀌면 원본이 바뀌고 원본이 바뀌면 사본이 바뀌기 때문에 깊은 복사를 해야 이와 같은 문제가 발생하지 않는다.
null은 비어 있다는 의미
배열 메서드의 대상에서 제외된다!!
undefined는 그냥 빈 공간이다.
최근 읽고 있는 코어 자바스크립트의 데이터 타입 파트를 아주 짧게 복습용으로 작성해보았다.
한 줄 한 줄 뜯어보면서 읽으니 시간은 오래 걸렸지만 어떤 이유에서 참조형 데이터가 가변성을 가진다고 하는지 왜 기본형 데이터가 불변값이지 그런 부분까지 이해가 되어서 굉장히 읽는 재미가 있었다.
또한 얕은 복사와 깊은 복사가 무슨 의미인지도 정확하게 알 수 있었다.
머리 속에서 정리되지 않은 용어들도 명확하게 알 수 있었다.
코어 자바스크립트의 내용을 당장 100% 이해 할 거라고 생각하지는 않지만 읽어보며 50%의 이해라도 가지고 갈 수 있다면 큰 자산이 되지 않을까 싶다.