객체를 참조하는 변수가 있을 때, 해당 객체는 계속해서 메모리에 유지된다. 변수가 존재하지 않을 때만 가비지 컬렉션에 의해 제거된다. 일반적으로 변수에 객체가 할당하는 경우는 강한 참조로 저장이 된다.
객체를 참조하는 변수가 있더라도, 해당 객체가 사용되지 않을 때 메모리에서 자동으로 제거됩니다. 이를 위해 WeakMap과 WeakSet을 사용할 수 있습니다.
WeakMap은 Map과 유사하지만 몇 가지 차이점이 있다. WeakMap에서는 key 가 반드시 객체여야 한다는 점과, WeakMap에서 key 는 약한 참조로 저장이 된다.
WeakSet은 WeakMap과 동일한 모습을 보인다. WeakSet에서는 value 가 반드시 객체여야 하며. WeakSet에서 value는 약한 참조로 저장이 된다. 이는 값이 사용되지 않을 때 메모리에서 자동으로 제거될 수 있음을 의미합니다.
WeakMap() 을 활용하여 캐싱기능을 구현하는 것이 가능하다. 캐싱이 사용되는 시점까지는 맵에 저장하여 사용하다가, 더이상 사용되지 않는 시점에서 해당 객체를 null 값을 업데이트 하면, obj가 가비지 컬럭터 대상이 되어 데이터를 메모리에서 삭제하게 된다.
// 📁 cache.js
let cache = new WeakMap();
// 연산을 수행하고 그 결과를 위크맵에 저장합니다.
function process(obj) {
if (!cache.has(obj)) {
let result = /* 연산 수행 */ obj;
cache.set(obj, result);
}
return cache.get(obj);
}
// 📁 main.js
let obj = {/* ... 객체 ... */};
let result1 = process(obj);
let result2 = process(obj);
// 객체가 쓸모없어지면 아래와 같이 null로 덮어씁니다.
obj = null;
// 이 예시에선 맵을 사용한 예시처럼 cache.size를 사용할 수 없습니다.
// 하지만 obj가 가비지 컬렉션의 대상이 되므로, 캐싱된 데이터 역시 메모리에서 삭제될 겁니다.
// 삭제가 진행되면 cache엔 그 어떤 요소도 남아있지 않을겁니다.
// https://kiki97-dev.tistory.com/71 참고