TIL_20210407

ChungsikPark·2021년 4월 7일
0

TIL

목록 보기
28/31

위크맵

  • 위크맵은 부차적인 데이터를 저장할 곳이 필요할 때 사용
  • 서드파티 라이브러리와 같은 외부 코드에 ‘속한’ 객체를 가지고 작업을 해야 한다고 가정, 추가해 줄 데이터는 객체가 살아있는 동안에만 유효한 상황에 위크맵에 원하는 데이터를 저장하고, 이때 키는 객체를 사용. 이렇게 하면 객체가 가비지 컬렉션의 대상이 될 때, 데이터도 함께 사라짐
weakMap.set(john, "비밀문서");
// john이 사망하면, 비밀문서는 자동으로 파기

캐싱

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

// 연산을 수행하고 그 결과를 맵에 저장
function process(obj) {
  if (!cache.has(obj)) {
    let result = /* 연산 수행 */ obj;

    cache.set(obj, result);
  }

  return cache.get(obj);
}

// 함수 process()를 호출

// main.js
let obj = {/* ... 객체 ... */};

let result1 = process(obj); // 함수를 호출

// 동일한 함수를 두 번째 호출할 땐,
let result2 = process(obj); // 연산을 수행할 필요 없이 맵에 저장된 결과를 가져옴

// 객체가 쓸모없어지면 아래와 같이 null로 덮음
obj = null;

alert(cache.size); // 1 (객체가 여전히 cache에 남음. 메모리 낭비)
  • 위 메모리 낭비를 위크맵으로 예방
// cache.js
let cache = new WeakMap();

// 연산을 수행하고 그 결과를 위크맵에 저장
function process(obj) {
  if (!cache.has(obj)) {
    let result = /* 연산 수행 */ obj;

    cache.set(obj, result);
  }

  return cache.get(obj);
}

// main.js
let obj = {/* ... 객체 ... */};

let result1 = process(obj);
let result2 = process(obj);

// 객체가 쓸모없어지면 아래와 같이 null로 덮음
obj = null;

// 이 예시에선 맵을 사용한 예시처럼 cache.size를 사용할 수 없음
// 하지만 obj가 가비지 컬렉션의 대상이 되므로, 캐싱된 데이터 역시 메모리에서 삭제
// 삭제가 진행되면 cache엔 그 어떤 요소도 남지 않음
profile
Blog by Chungsik Park

0개의 댓글