WeakMap

// Weak라는건 가비지 컬렉팅이 잘 된다는 뜻이다.
//  즉, 메모리에서 빨리빨리 정리가 된다는 뜻이다.
//  이를 구체적으로 설명드리자면, 아까 key를 객체로 할 수 있다고 했다.
//  WeakMap도 마찬가지로 key를 객체로 설정할 수 있다.

const wm = new WeakMap();

console.log(wm); // WeakMap { <items unknown> }

let obj = {};
wm.set(obj, '123');
console.log(wm); // WeakMap { <items unknown> }
console.log(wm.get(obj)); // 123

// 나중에 위의 obj가 null로 바뀌었다면
obj = null;
// 그럼 obj는 가비지 컬렉팅이 될 것이다.
//  그럼 위의 wm에 할당한 '123'도 같이 사라진다.

console.log(wm.get(obj)); // undefined // 바로 가비지컬렉팅 되는 듯.

// setTimeout(() => {
//     console.log(wm); // WeakMap { <items unknown> }
//     console.log(wm.get(obj)); // undefined
// }, 3000)

// ----------------------------------------
// Map 객체의 가비지 컬렉팅 테스트
const m = new Map();
let obj2 = {};
m.set(obj2, '234');

console.log(m); // Map(1) { {} => '234' }
console.log(m.get(obj2)); // 234
console.log(m.size); // 1

obj2 = null;

console.log(m.get(obj2)); // undefined
console.log(obj2); // null
console.log(m); // Map(1) { {} => '234' } // 아직 obj2를 가지고 있다.
console.log(m.size); // 1

// 위에 분명 obj2를 null로 줌으로써 비웠다.
// 하지만 obj2는 가비지 컬렉팅되지 않는다.
//  왜냐, Map 객체인 m이 obj2를 가지고 있기 때문이다.
//  때문에 가비지 컬렉팅이 안되고 계속 메모리에 쌓인다.

// 그래서 WeakMap을 사용하는 것이다.

// ----------------------------------------------------------------------
// 그런데 자바스크립트에서 메모리를 컨트롤 할 일이 있을까? WeakMap 대신에 Map 써도 큰 문제는 안되지 않을까?
//  사실 그렇다. Map 객체 안에 객체키를 몇백만개 넣지 않는 이상 큰 이슈는 없다.
//  때문에 그럼 WeakMap 어따가 써? 이럴 수도 있다.
//  WeakMap을 사용할 만한 부분을 추천해보겠다.

let hyungju = { name: 'hyungju-lee', age: 36, }
hyungju.married = true; // 이렇게 작성하기 싫은 경우도 있다.
// 위의 hyungju 객체가 건들 수 없는 객체일 수도 있다.
// 아니면 hyungju 객체가 서버로부터왔고, 항상 이 상태가 유지되어야하고, 여기에 신규 속성을 추가하면 나중에 헷갈릴 수도 있다면,
const deepCopyHyungju = {
    ...hyungju,
    married: true,
}
// 위와 같이 하나의 객체를 새로 만들어서 값을 만들어도 된다.
// 또 다른 방법으로 여기서 WeakMap을 사용해도된다.

wm.set(hyungju, {married: true}); // hyungju 객체를 수정하지 않으면서 부가적인 정보를 추가 및 수정할 수 있다.
console.log(wm.get(hyungju));

hyungju = null; // 나중에 hyungju 객체가 null 되어 가비지 컬렉팅 되어야한다면,
// WeakMap 객체 안에 있는 hyungju 키 그리고 값도 같이 가비지 컬렉팅이 된다.
// 원본 객체를 건드리지 않으면서 부가적인 정보를 저장할 수 있는 수단이 WeakMap 이라고 보면된다.
// 추가로 가비지 컬렉팅도 방해하지 않는다.