JavaScript의 WeakMap 객체는 키(key)와 값(value)으로 이루어진 요소들을 저장하는 컬렉션입니다. 다만 일반 Map과 달리 키는 반드시 객체여야 하며, 값은 원시 값(문자열, 숫자 등)이나 객체 모두 가능합니다.
WeakMap의 가장 큰 특징은 약한 참조(weak reference)를 유지한다는 점입니다. 즉, 키로 사용된 객체가 외부에서 더 이상 참조되지 않으면 해당 객체는 가비지 컬렉션(Garbage Collection)에 의해 자동으로 메모리에서 제거됩니다. 이러한 특성 덕분에 메모리 누수를 방지해야 하는 상황에서 유용하게 활용할 수 있습니다.
WeakMap 주요 특징
- 키로 객체만 사용할 수 있으며, 원시 값은 키로 지정할 수 없습니다.
- 키 객체에 대한 참조가 사라지면 가비지 컬렉터가 해당 항목을 회수합니다.
- WeakMap은 열거(순회)가 불가능하므로 keys(), values(), size 같은 메서드나 속성을 제공하지 않습니다.
예제 코드
다음은 JavaScript에서 WeakMap 객체를 생성하고 활용하는 예제입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
body {
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
}
.result {
font-size: 18px;
font-weight: 500;
color: rebeccapurple;
}
</style>
</head>
<body>
<h1>JavaScript의 WeakMap 객체</h1>
<div class="result"></div>
<button class="Btn">Show WeakMap</button>
<h3>위 버튼을 클릭하면 WeakMap 객체를 생성하고 화면에 표시합니다</h3>
<button class="Btn">REMOVE</button>
<h3>위 버튼을 클릭하면 WeakMap 키의 참조를 제거합니다</h3>
<script>
let resultEle = document.querySelector(".result");
let btnEle = document.querySelectorAll(".Btn");
let personObj = {
name: "Rohan Sharma",
age: 22,
class: 9,
};
let WeakMap1 = new WeakMap();
WeakMap1.set(personObj, "Rohan Object");
btnEle[0].addEventListener("click", () => {
resultEle.innerHTML = "personObj : " + WeakMap1.get(personObj) + "<br>";
});
btnEle[1].addEventListener("click", () => {
personObj = null;
resultEle.innerHTML += "personObj : " + WeakMap1.get(personObj) + "<br>";
resultEle.innerHTML += " personObj is now removed from memory";
});
</script>
</body>
</html>실행 결과
위 코드를 실행하면 다음과 같은 화면이 출력됩니다.

'Show WeakMap' 버튼 클릭 시
버튼을 클릭하면 WeakMap에 저장된 personObj 키에 해당하는 값이 화면에 표시됩니다.

'REMOVE' 버튼 클릭 시
REMOVE 버튼을 클릭하면 personObj = null; 코드를 통해 객체 참조가 제거됩니다. 참조가 사라진 객체는 WeakMap 내부에서도 유효하지 않게 되며, 이후 가비지 컬렉터에 의해 메모리에서 해제됩니다.

정리
WeakMap은 객체를 키로 사용하면서도 해당 객체의 생명주기에 간섭하지 않는 특별한 컬렉션입니다. DOM 요소에 부가 데이터를 연결하거나 캐시를 구현할 때 메모리 누수 없이 안전하게 사용할 수 있어, 실무에서 매우 유용하게 활용됩니다.