WeakSet과 WeakMap (WeakSet and WeakMap)
자바스크립트에서 WeakSet과 WeakMap은 ES6에서 도입된 데이터 구조로, 객체 참조를 약하게 유지한다. 메모리 관리를 개선하며 Set과 Map의 특수한 변형이다. WeakSet과 WeakMap의 개념, 사용 방법, 활용 사례를 예제로 확인해보자.
이들은 가비지 컬렉션(Garbage Collection)과 연계되어 동작한다.
WeakSet이란 무엇인가?
WeakSet
은 객체만 저장할 수 있는 집합으로, 참조가 약하다. 객체가 더 이상 참조되지 않으면 자동으로 제거된다. 기본적인 예제를 보자:
const weakSet = new WeakSet();
let obj = { "id": 1 };
weakSet.add(obj);
console.log(weakSet.has(obj)); // true
obj = null; // 참조 제거
// 가비지 컬렉션 후 weakSet에서 obj 사라짐
WeakSet
은 값으로 객체만 허용하며, 크기나 내용을 직접 확인할 수 없다.
WeakMap이란 무엇인가?
WeakMap
은 키가 객체만 가능한 키-값 쌍 컬렉션이다. 키가 더 이상 참조되지 않으면 해당 항목이 제거된다. 예제를 보자:
const weakMap = new WeakMap();
let key = { "id": 2 };
weakMap.set(key, "철수");
console.log(weakMap.get(key)); // "철수"
key = null; // 참조 제거
// 가비지 컬렉션 후 weakMap에서 key 사라짐
WeakMap
은 키로 객체만 사용할 수 있다.
WeakSet과 WeakMap의 주요 메서드
WeakSet과 WeakMap의 메서드는 제한적이다. 예제로 확인해보자.
1. WeakSet 메서드
- add
: 객체 추가
- has
: 객체 존재 여부 확인
- delete
: 객체 삭제
const ws = new WeakSet();
const obj1 = {};
ws.add(obj1);
console.log(ws.has(obj1)); // true
ws.delete(obj1);
console.log(ws.has(obj1)); // false
2. WeakMap 메서드
- set
: 키-값 쌍 추가
- get
: 값 조회
- has
: 키 존재 여부 확인
const wm = new WeakMap();
const key2 = {};
wm.set(key2, "영희");
console.log(wm.get(key2)); // "영희"
console.log(wm.has(key2)); // true
WeakSet과 WeakMap의 동작 방식
WeakSet과 WeakMap은 약한 참조를 통해 메모리를 관리한다. 예제로 확인해보자.
1. 약한 참조
참조가 끊어지면 가비지 컬렉션이 동작한다:
let weakSet2 = new WeakSet();
let temp = {};
weakSet2.add(temp);
temp = null;
// weakSet2에서 temp 자동 제거 (검사 불가)
2. 비반복성
내용을 순회할 수 없다:
const weakMap2 = new WeakMap();
const key3 = {};
weakMap2.set(key3, 42);
// weakMap2.forEach 같은 메서드 없음
사용 사례
WeakSet과 WeakMap을 활용한 몇 가지 예제를 확인해보자.
1. 객체 추적 (WeakSet)
특정 객체가 처리되었는지 확인한다:
const processed = new WeakSet();
const item = { "data": 1 };
if (!processed.has(item)) {
processed.add(item);
console.log("처리됨");
} // "처리됨"
2. 메타데이터 저장 (WeakMap)
객체에 추가 정보를 붙인다:
const metadata = new WeakMap();
const user = { "id": 3 };
metadata.set(user, { "role": "admin" });
console.log(metadata.get(user)); // {role: "admin"}
3. DOM 요소 관리
DOM 객체를 약하게 참조한다:
const domRefs = new WeakMap();
const element = document.createElement("div");
domRefs.set(element, "메인 요소");
console.log(domRefs.get(element)); // "메인 요소"
// element 제거 시 domRefs에서도 자동 정리
성능과 한계
장점
- 메모리 관리: 약한 참조로 메모리 누수를 방지한다.
- 간결함: 불필요한 참조를 유지하지 않는다.
한계
- 제한된 기능: 반복, 크기 확인 불가.
- 객체 전용: WeakSet과 WeakMap은 객체만 다룬다.
Set과 Map은 강한 참조를 유지하며 더 많은 메서드를 제공한다.
마무리
WeakSet과 WeakMap은 자바스크립트에서 메모리 효율적인 데이터 관리를 가능하게 한다. 약한 참조의 특성과 활용 사례를 예제로 다뤘다.
'코딩 공부 > 자바스크립트' 카테고리의 다른 글
52. 자바스크립트 고급 조건문 패턴 (Advanced Conditional Patterns) (3) | 2025.03.17 |
---|---|
51. 자바스크립트 배열 성능 최적화 (Array Performance Optimization) (2) | 2025.03.16 |
49. 자바스크립트 Set과 Map (Set and Map) (0) | 2025.03.15 |
48. 자바스크립트 타입드 배열 (Typed Arrays) (1) | 2025.03.15 |
47. 자바스크립트 프로토타입 (Prototype) (0) | 2025.03.14 |