위크맵과 위크셋

양주영·2021년 8월 26일
0

javascript

목록 보기
11/42

위크맵과 위크셋


자료구조를 구성하는 요소도 자신이 속한 자료구조가 메모리에 남아있는 동안 도달 가능한 값으로 취급되어 메모리에서 삭제되지 않는다. 객체의 프로퍼티나 배열의 요소, 맵이나 셋을 구성하는 요소들이 이에 해당한다.



위크맵


위크맵은 맵과 유사한 컬렉션이지만, 차이점이 존재한다.

맵과의 차이점

  1. 위크맵을 구성하는 요소의 키는 오직 객체만 가능하다. 키로 사용된 객체가 메모리에서 삭제되면 이에 대응하는 값 역시 삭제된다.

  2. 반복 작업이 불가능하고 keys(), values(), entries() 메서드를 지원하지 않기 때문에 키나 값 전체를 얻는 게 불가능하다.

  3. ‘부차적인 데이터를 저장할 때’ 사용한다.

let weakMap = new WeakMap();

let obj = {};

weakMap.set(obj, "ok"); //정상적으로 동작합니다(객체 키).

// 문자열("test")은 키로 사용할 수 없습니다.
weakMap.set("test", "Whoops"); // Error: Invalid value used as weak map key

위크맵의 키로 사용된 객체를 참조하는 것이 아무것도 없다면 해당 객체는 메모리와 위크맵에서 자동으로 삭제된다.

let john = { name: "John" };

let weakMap = new WeakMap();
weakMap.set(john, "...");

john = null; // 참조를 덮어씀

// john을 나타내는 객체는 이제 메모리에서 지워집니다!

워크맵이 지원하는 메서드는 아래와 같다.

  • weakMap.get(key)
  • weakMap.set(key, value)
  • weakMap.delete(key)
  • weakMap.has(key)

적은 메서드만 제공하는 이유는 가비지 컬렉션의 동작 방식 때문이다. 위 예시의 john을 나타내는 객체처럼, 객체는 모든 참조를 잃게 되면 자동으로 가비지 컬렉션의 대상이 된다. 그런데 가비지 컬렉션의 동작 시점은 정확히 알 수 없다.



유스케이텍스트스: 추가 데이터


위크맵은 부차적인 데이터를 저장할 곳이 필요할 때 사용한다.
외부 코드에 ‘속한’ 객체를 가지고 작업을 해야 한다고 가정해보자. 이 객체에 데이터를 추가해줘야 하는데, 추가해 줄 데이터는 객체가 살아있는 동안에만 유효한 상황이다. 이럴 때 위크맵을 사용할 수 있다.

위크맵에 원하는 데이터를 저장하고, 이때 키는 객체를 사용하면 된다. 이렇게 하면 객체가 가비지 컬렉션의 대상이 될 때, 데이터도 함께 사라지게 된다.

weakMap.set(john, "비밀문서");
// john이 사망하면, 비밀문서는 자동으로 파기됩니다.


유스케이스: 캐싱

위크맵은 캐싱이 필요할 때 유용하다. 캐싱은 시간이 오래 걸리는 작업의 결과를 저장해서 연산 시간과 비용을 절약해주는 기법이다.
동일한 함수를 여러 번 호출해야 할 때, 최초 호출 시 반환된 값을 어딘가에 저장해 놓았다가 그다음엔 함수를 호출하는 대신 저장된 값을 사용하는 게 캐싱의 실례이다.



위크셋


셋과 유사한 컬렉션이지만, 차이점이 존재한다.

  1. 위크셋엔 객체만 저장할 수 있다. 위크셋에 저장된 객체가 도달 불가능한 상태가 되면 해당 객체는 메모리에서 삭제된다.

  2. 반복작업이 불가능하다. 위크셋은 addhasdelete를 사용할 수 있고, sizekeys()나 반복 작업 관련 메서드는 사용할 수 없다.

  3. ‘부차적인 데이터를 저장할 때’ 사용한다. 복잡한 데이터를 저장하지 않는다. “예”, “아니오”와 같은 간단한 답변을 얻는 용도로 사용된다.


let visitedSet = new WeakSet();

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

visitedSet.add(john); // John이 사이트를 방문합니다.
visitedSet.add(pete); // 이어서 Pete가 사이트를 방문합니다.
visitedSet.add(john); // 이어서 John이 다시 사이트를 방문합니다.

// visitedSet엔 두 명의 사용자가 저장될 겁니다.

// John의 방문 여부를 확인해보겠습니다.
alert(visitedSet.has(john)); // true

// Mary의 방문 여부를 확인해보겠습니다.
alert(visitedSet.has(mary)); // false

john = null;

// visitedSet에서 john을 나타내는 객체가 자동으로 삭제됩니다.

위크맵과 위크셋은 반복작업이 불가능하다. 때문에, ‘추가’ 데이터를 저장하는 용도로 쓸 수 있다.





참조 : https://ko.javascript.info/weakmap-weakset

profile
뚜벅뚜벅

0개의 댓글