본문 바로가기
컴퓨터 언어/JavaScript

[JavaScript] 위크맵(WeakMap)과 위크셋(WeakSet)

by 테크케찰 2021. 7. 30.

1. WeakMap

WeakMap과 Map은 비슷한 자료구조입니다.

다만 한 가지 명확한 차이점이 있다면, 위크맵은 키로 반드시 객체를 받아와야 합니다.

아래 예제 코드를 통해 WeakMap에 대해 살펴봅시다.

let weakMap = new WeakMap(); //weakMap 선언

let object={name:'Jason'};

weakMap.set(object, 'hi!'); 
weakMap.set('string', 'hi!'); // error!

WeakMap에서 지원하는 메서드는 Map 객체의 메서드와 비슷한 양상을 띱니다.

Map 객체 메서드는 아래 포스팅에서 확인하실 수 있습니다.

https://eloquence-developers.tistory.com/167

 

[JavaScript] 맵(Map)

Map은 key-value 간의 관계를 나타내는 자료 구조입니다. 객체 역시 key-value 간의 관계를 프로퍼티라고 표현하면서 나타내는 자료형이었습니다. 그렇다면 객체와 Map의 차이점은 무엇일까요? 바로 key

eloquence-developers.tistory.com

WeakMap은 get, set, delete, has 이렇게 4 개의 메서드를 갖는데, 이 4 개의 메서드를 가지고 간단한 예제 코드를 만들어 살펴보도록 하겠습니다. 

let weakMap = new WeakMap(); //weakMap 선언

let object={name:'Jason'};

weakMap.set(object, 'hi!'); 

console.log(weakMap.get(object)); //hi!
console.log(weakMap.has(object)); //true
weakMap.delete(object);
console.log(weakMap.has(object)); //false -> 삭제 이후 조회되지 않음

앞서 언급드렸듯이 WeakMap은 key 값으로 객체를 받습니다.

객체가 가비지 컬렉터(Garbage Collector)의 대상이 되면 객체가 메모리에서 삭제가 되는데요, WeakMap에서는 key가 가비지 컬렉터의 대상이 되면 WeakMap의 데이터가 자동으로 삭제됩니다. 

반면에 Map 객체는 key 값이 가비지 컬렉터의 대상이 되더라도 해당 데이터가 삭제되지 않습니다.

이 점이 Map과 WeakMap의 가장 큰 차이점이라고 할 수 있겠습니다.

WeakMap의 구체적인 사용 사례는 제가 아래에 참고 링크 걸어놓은 부분에서 확인하실 수 있습니다.

 

2. WeakSet

WeakSet은 객체만 저장할 수 있다는 점만 제외한다면 Set 객체와 비슷합니다.

WeakSet에서 저장된 데이터 값이 null과 같이 되어 가비지 컬렉터의 대상이 된다면, 해당 데이터가 자동으로 삭제되는 특성을 가지고 있습니다.

WeakSet은 add, has, delete 메서드를 가지고 있습니다. 

이를 이용해서 간단한 예제코드를 살펴보도록 합시다.

let weakSet = new WeakSet(); // weakSet 선언

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

weakSet.add(john); // weakSet에 데이터를 추가
weakSet.add(pete); 
weakSet.add(john); 

console.log(weakSet.has(john)); // true
weakSet.delete(john); //weakSet 데이터 삭제
console.log(weakSet.has(john)); // false 

console.log(weakSet.has(pete)); // true
pete=null;
console.log(weakSet.has(pete)); // false

 

 

참고

https://ko.javascript.info/weakmap-weakset

 

위크맵과 위크셋

 

ko.javascript.info

 

'컴퓨터 언어 > JavaScript' 카테고리의 다른 글

[JavaScript] Date  (0) 2021.07.30
[JavaScript] 구조 분해 할당(Destructuring Assignment)  (0) 2021.07.30
[JavaScript] Object.keys, values, entries  (0) 2021.07.30
[JavaScript] 셋(Set)  (0) 2021.07.30
[JavaScript] 맵(Map)  (0) 2021.07.30