1. WeakMap 오브젝트 개요, new WeakMap()


WeakMap 오브젝트

그렇다면 어째서 더 제약이 심한 WeakMap 오브젝트가 있는것일까요? 이는 Map의 문제를 살펴보면서 분석하면 좋습니다. Map에서 key를 object로 삭제한 [key, value] 쌍이 있다고 가정합니다.

여기서 이 key로 설정한 변수가 참조하는 메모리주소를 바꾼다면 object는 삭제되어 참조할수 없지만 Map에서는 object가 남아있습니다. 이럴 경우 메모리 릭(Memory Leak)이 발생합니다.

let sports = {like: "축구"};
const obj = new Map([[sports, "like: 축구"]]);
sports = {like: "농구"};

console.log(obj.get(sports));
console.log(obj.keys().next().value);

[실행 결과]

undefined

{like: "축구"}

  1. sports = {like: "농구"};

    ⇒ sports 변수가 바라보는 대상 오브젝트가 변경되며 참조 주소값이 바뀝니다.

  2. obj.get(sports);

    ⇒ 변경된 sports의 메모리주소값은 obj 인스턴스 내에서 key로 쓰이지 않기때문에 undefined반환

  3. obj.keys().next().value

    ⇒ obj 인스턴스내에 등록된 [key, value]에서 key는 sports가 변경되기 전에 등록한 {like: "축구"}이고 외부에서 해당 오브젝트를 참조하는 변수가 없어졌기 때문에 메모리 릭(memory leak)발생

WeakMap은 이런 문제를 해결하기 위해 나온 오브젝트로 WeakMap의 object를 Garbage Collection(GC)가 같이 지워줍니다.

이 WeakMap 오브젝트 메소드는 Map 오브젝트와 다르게 연결된 메소드가 한정적입니다.

이처럼 CRUD와 관련된 메소드만 있으며 entry의 열거나 이터레이션이 불가능합니다.

new WeakMap()

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3f19981f-0a40-4fcb-847b-27738d4e55eb/Untitled.png