전체 목록
JavaScriptHard#433

JavaScript의 WeakMap과 Map은 어떤 차이가 있고 WeakMap은 언제 사용하나요?

#JavaScript#WeakMap#Map#GC

답변 포인트

키의 참조 방식과 가비지 컬렉션 관점에서 비교해보세요.

정답 및 해설

빠른 요약

Map은 다양한 타입의 key를 사용할 수 있는 key-value 저장소입니다. Map이 key를 강하게 참조하기 때문에, key 객체를 다른 곳에서 더 이상 사용하지 않아도 Map 안에 남아 있으면 GC 대상이 되지 않습니다.

Map은 다양한 타입의 key를 사용할 수 있는 key-value 저장소입니다. Map이 key를 강하게 참조하기 때문에, key 객체를 다른 곳에서 더 이상 사용하지 않아도 Map 안에 남아 있으면 GC 대상이 되지 않습니다.

WeakMap은 key로 객체만 사용할 수 있고, key를 약하게 참조합니다. 즉 key 객체를 참조하는 곳이 WeakMap뿐이라면 가비지 컬렉션 대상이 될 수 있습니다.

JavaScript
const meta = new WeakMap();

function attachMeta(element) {
  meta.set(element, { clicked: 0 });
}

DOM 요소나 외부 객체에 부가 정보를 붙이고 싶지만, 그 객체의 생명주기를 방해하고 싶지 않을 때 WeakMap이 유용합니다. 예를 들어 특정 DOM 노드별 상태, 라이브러리 내부 private metadata, 객체별 캐시를 저장할 수 있습니다.

차이점 때문에 WeakMap은 순회할 수 없습니다. 어떤 key가 GC 되었는지 관찰할 수 있으면 GC 동작이 프로그램 의미에 영향을 주기 때문입니다. 따라서 전체 목록을 보여줘야 하거나 key를 문자열로 관리해야 한다면 Map을 써야 합니다.

요약하면 Map은 일반적인 컬렉션, WeakMap은 객체 생명주기를 방해하지 않는 부가 데이터 저장소입니다.

관련 질문

같은 카테고리/태그 기준