IT/JavaScript

위크맵 and 위크셋

U_Flix 2022. 2. 11.

위크맵

맵과 위크맵의 첫 번째 차이는 위크맵의 키가 반드시 객체여야 한다는 점입니다. 원시값은 위크맵의 키가 될 수 없습니다.

let weakMap = new WeakMap();

let obj = {};

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

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

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

 

위크맵 지원 메소드

  • weakMap.get(key) : 키에 연결된 값 불러오기
  • weakMap.set(key, value) : 키에 연결된 값 수정
  • weakMap.delete(key) : 키에 연결된 값 삭제
  • weakMap.has(key) : key에 연결된 값이 WeakMap  객체에 존재하는지 나타내는 불리언 값을 반환합니다.

위크맵을 사용하는 이유는 사용자 방문 횟수 저장 함수를 예로 들어 설명 할 수 있다.

// 📁 visitsCount.js
let visitsCountMap = new Map(); // 맵에 사용자의 방문 횟수를 저장함

// 사용자가 방문하면 방문 횟수를 늘려줍니다.
function countUser(user) {
  let count = visitsCountMap.get(user) || 0;
  visitsCountMap.set(user, count + 1);
}
----------------------------------------------------------------------------------------
// 📁 main.js
let john = { name: "John" };

countUser(john); // John의 방문 횟수를 증가시킵니다.

// John의 방문 횟수를 셀 필요가 없어지면 아래와 같이 john을 null로 덮어씁니다.
john = null;

해당 소스는 Map을 이용한 방문 횟수 함수이다.

가비지 컬렉터에 해당하지 않아 값이 메모리에서 삭제가 되지 않는다.

이렇게 메모리 값이 삭제되지 않으면 해당 생성자 함수에 메모리 값이 한없이 커져 에러로 발생 할 수 있으니, 이 때 위크맵을 사용한다.

// 📁 visitsCount.js
let visitsCountMap = new WeakMap(); // 위크맵에 사용자의 방문 횟수를 저장함

// 사용자가 방문하면 방문 횟수를 늘려줍니다.
function countUser(user) {
  let count = visitsCountMap.get(user) || 0;
  visitsCountMap.set(user, count + 1);
}

이렇게 함수 작성시 visitsCountMap 을 수동으로 청소해줄 필요가 없어진다.

위크셋

  • 위크셋은 셋과 유사한데, 객체만 저장할 수 있다는 점이 다르다. 원시값은 저장할 수 없다.
  • 셋 안의 객체는 도달 가능할 때만 메모리에서 유지된다.
  • 셋과 마찬가지로 위크셋이 지원하는 메서드는 단출하다. add, has, delete를 사용할 수 있고, size, keys()나 반복 작업 관련 메서드는 사용할 수 없다.

아래 코드에선 사용자의 사이트 방문 여부를 추적하는 용도로 위크셋을 사용

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을 나타내는 객체가 자동으로 삭제됩니다.

위크맵과 위크셋의 가장 큰 단점은 반복 작업이 불가능하다는 점.

위크맵과 위크셋은 객체와 함께 ‘추가’ 데이터를 저장하는 용도로 쓸 수 있다.

'IT > JavaScript' 카테고리의 다른 글

[JavaScript] Promise  (0) 2022.03.06
[JavaScript] 증감 버튼 연산 페이지 만들기  (0) 2022.02.16
var, let 차이점  (0) 2022.02.02
가비지 컬렉션  (0) 2022.02.01
함수란?  (2) 2022.01.31

댓글