
type : 데이터의 종류와 특성을 정의 (Number, String, Boolean 등)
structure : 데이터를 어떻게 저장하고 관리할지를 정의 (Array, Stack, Queue, Map, Set 등)
Object는 자료형 이면서 동시에 자료구조의 역할도 한다.
Object 라는건 자바스크립트에서 기본적으로 제공하는 데이터 유형이기 때문에 자료형이지만 데이터 저장 용도로 사용하면 키-값을 저장하는 방식의 해시 테이블 같은 자료구조에 해당된다.
표기법으로 구분되는건지 찾아봤는데, 자료형을 말할 땐 'object'이고 내장 객체를 말할 땐 Object지만 js 문법상 필수적인 차이가 아니어서 크게 신경쓰지 않아도 되는 것 같다.
결국 자료타입(자료형)은 데이터를 표현하는 방식이고, 자료구조는 데이터를 저장하고 활용하는 방식이라고 이해되었다.
자료형을 확인하고 싶으면 typeof 를 사용하면 된다.
console.log(typeof []) // object (배열도 객체로 분류된다.)
console.log(typeof {}) // object
console.log(typeof new Map()) // object
console.log(typeof new Set()) // object
Map 과 Set도 object 로 나옴 : 자체적인 자료형이 아니라 객체 기반의 자료구조라는 의미
Map이 객체 기반의 자료구조라면 일반적인 Object 와는 저장방식에서 어떤 차이가 있는지 궁금했다.
const obj = {}
obj['1'] = 'test1'
obj[1] = 'test2'
// obj[1] 과 obj['1']이 동일한 키로 취급
console.log(obj) // {'1' : test2} 덮어씌워진다.
const map = new Map();
map.set(1, 'test1');
map.set('1', 'test2');
console.log(map); // Map(2) {1 => 'test1', '1' => 'test2'}
그렇다면 근본적으로는 둘 다 해시테이블 기반인데 어째서 다른 것인지가 또 궁금했다.
console.log(obj.hasOwnProperty('42')) // false
console.log(obj.hasOwnProperty('1')) // true
console.log(obj.toString) // [Function: toString]
1-4. 객체 속성을 해시 테이블에 저장 (성능 좋음 : 소규모 데이터에 적합) > 프로토타입 체인을 따라가며 조회 (toString, hasOwnProperty 같은 기본 메서드가 존재하는 이유)
1-5. 키 값이 Object.prototype 과 겹치는 경우 충돌이날 수 있으나 Object.create(null) 로 생성하면 프로토타입을 상속받지 않아 충돌을 방지할 수 있다.
console.log(map.get(1)) // 'test1'
console.log(map.get('1')) // 'test2'
// 객체를 키로 사용 (Object 에서는 불가)
const objKey = {id:1};
const map2 = new Map();
map2.set(objKey, 'object_key');
console.log(map2.get(objKey)) // 'object_key'
2-4. 해시 테이블을 최적화해 키 탐색 속도가 Object 보다 빠름.
2-5. 내부적으로 linked list 같은 구조를 사용해 입력 순서를 유지 (순서 보장)
2-6. Object.prototype을 상속받지 않아 충돌 위험이 없음.
결론적으로 Object는 일반적인 객체 기반이고 속성 접근이 최적화되고, Map은 별도의 해시 테이블 구조이면서 고성능 탐색에 최적화되어있다.