Map, Set Collection, WeakMap, WeakSet Collection

2020. 2. 9. 17:52TypeScript&JavaScript/Node.js

ES2015 기준

"use strict"

const profiles = new Map();
profiles.set('twitter', '@adalovelace');
profiles.set('facebook', 'adalovelace');
profiles.set('googleplus', 'ada');

profiles.size; // 3
profiles.has('twitter'); // true
profiles.get('twitter'); // "@adalovelace"
profiles.has('youtube'); // false
profiles.delete('facebook');
profiles.has('facebook'); // false
profiles.get('facebook'); // undefined

for (const entry of profiles) {
    console.log(entry);
}

Map 은 ES2015에서 제공하는 프로토타입 객체, set, get, has, delete, size 등의 메소드가 내장되어 있다. 

Map은 함수와 객체를 Map의 키로 사용할 수 있다. 일반적으로는 모든 키가 자동으로 문자열로 변환되기 때문에 Map의 활용도는 높다. 루프 내 모든 entry는 첫 번째 요소로 키를 두 번째 요소로 값을 가지는 배열이다.

const tests = new Map();
tests.set(() => 2+2, 4);
tests.set(() => 2*2, 5);
tests.set(() => 2/2, 1);

for (const entry of tests) {
    console.log((entry[0]() === entry[1]) ? 'PASS' : 'FAIL');
}

// PASS
// FAIL
// PASS

위는 함수를 키로 예상되는 결과를 값으로 저장한 뒤에 hash map의 함수들을 반복 구문으로 실행하는 것.

Set 프로토타입은 모든 요소들이 유일한 고유값을 가지는 목록인 집합(set)을 쉽게 만들 수 있다.

const s = new Set([0, 1, 2, 3]);
s.add(3); // 추가되지 않음
s.size; // 4
s.delete(0);
s.has(0); // false

for (const entry of s) {
    console.log(entry);
}

Map과 유사하지만 약간의 차이가 있다. set 대신 add를 쓴다거나. set을 반복 구문으로 사용할 수도 있는데 이 경우 모든 요소들은 값이 된다. 또한 set은 그 요소로 객체와 함수를 가질 수 있다.

WeakMap과 WeakSet은 ES2015에서 Map, Set 프로토타입에 대한 'weak'버전을 정의한다.

WeakMap과 Map의 차이는 WeakMap은 가지고 있는 요소 전체를 반복 구문으로 탐색할 방법이 없으며, 객체 만을 키로 가질 수 있다. WeakMap의 독특한 특징은 키로 사용된 객체에 대한 유일한 참조가 WeakMap 내에만 남아 있을 경우, 이 객체를 가비지컬렉트 할 수 있다는 것이다. 이것은 어플리케이션의 생명 주기 내에서 삭제되어야 할 객체와 관련된 몇몇 메타 데이터를 저장하는 경우 매우 유용하다. WeakSet 또한 유사하다. 유일한 참조가 남을 경우 해당 객체를 가비지 컬렉트 할 수 있으며, WeakMap, Map, WeakSet, Set의 사용처가 다르다는 점을 이해하는 것이 중요하다.

let obj = {};
const map = new WeakMap();
map.set(obj, {key: "some_value"});
console.log(map.get(obj)); //{key: "some_value"}
obj = undefined; // 다음 가비지 컬렉트 사이클에서 맵에 관련된 객체와 데이터가 정리됨


let obj1 = {key: "val1"};
let obj2 = {key: "val2"};
const set = new WeakSet(([obj1, obj2]));
console.log(set.has(obj1)); // true
obj1 = undefined; // 이제 obj1이 set에서 제거됩니다.
console.log(set.has(obj1)); // false

 

'TypeScript&JavaScript > Node.js' 카테고리의 다른 글

관찰자 패턴과 EventEmitter  (0) 2020.02.20
Reactor 패턴  (0) 2020.02.09
Node.js의 철학  (0) 2020.02.09