기본 콘텐츠로 건너뛰기

라벨이 WeakMap인 게시물 표시

WeakMap vs Map

  WeakMap은 무엇일까? 간단하게 말하면, key를 Object로만 사용하는 Map이다. 물론 이렇게만 말한다면, Map의 하위 호환 처럼 보인다. 그렇다는 것은 이것은 무엇 때문에 생긴것일까?  WeakMap은 무엇이 약한 Map일까? 키에 대한 참조가 약한 Map이다. 키에 대한 참조가 약하다니 무슨 뜻일까?  Map은 key가 더 이상 접근이 불가능 하더라도, Map에는 값이 존재한다. 하지만 WeakMap은 가비지 컬렉션의 대상이 되어 가비지 컬렉터한테 걸리면 key를 참조 하지 못하는 데이터를 제거 한다.  예제를 보면 이와 같다. let weakmap = new WeakMap () let obj = { key : 'key' } weakmap . set ( obj , 'hello' ) console . log ( weakmap . get ( obj )) // 'hello' obj = null // obj 가 가비지 컬렉션에 의해 제거됨 // weakMap {obj, 'hello'} 또한 가비지 컬렉션에 의해 제거된다 . let map = new Map () let obj = { key : 'key' } map . set ( obj , 'hello' ) console . log ( map . get ( obj )) // 'hello' obj = null // obj 가 가비지 컬렉션에 의해 제거됨 // map {obj, 'hello'} 제거 되지 않는다 . weakmap에는 데이터가 존재 하지 않는다. map에는 여전히 데이터가 존재한다.  가비지 컬렉터가 실행 된 이후에 각각의 객체를 확인 해보면 위와 같이 확인 할 수 있다. 하지만, 가비지 컬렉터가 실행되지 않았다면, WeakMap을 이용 하더라도 아래처럼 확인이 되니, 주의하자. 접근 할 수 있는 key제거 되었지만, value가 남아있다.  참고로 위처럼 한번이라도 개발자 콘솔...