Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트 WeakMap의 .clear() 메서드란 무엇인가?

WeakMap.clear() 메서드란?

WeakMap 객체의 clear() 메서드는 해당 WeakMap에 저장된 모든 키/값(key/value) 쌍을 한 번에 삭제하는 기능을 합니다. 일반 Map과 달리 WeakMap은 키로 사용된 객체가 더 이상 참조되지 않으면 자동으로 가비지 컬렉션 대상이 되는데, clear()는 이러한 내부 정리 과정과 무관하게 저장된 모든 데이터를 즉시 비워버리는 역할을 했습니다.

표준 사양에서 제거된 이유

중요한 점은 이 메서드가 현재 ECMAScript 표준 사양에서 제거되었다는 것입니다. clear()는 가비지 컬렉터의 내부 동작 타이밍을 외부에서 추측할 수 있게 만들어 보안상 부작용(사이드 채널 공격 가능성)을 일으킬 수 있어 표준에서 제외되었습니다.

따라서 최신 자바스크립트 환경에서는 WeakMap.prototype.clear를 직접 호출할 수 없습니다. 하지만 WeakMap 객체를 감싸는 래퍼(Wrapper) 클래스를 작성하고 그 안에서 clear 기능을 직접 구현하면 동일한 효과를 얻을 수 있습니다.

구현 예제: ClearableWeakMap

아래 코드는 WeakMap을 내부에 두고 clear, delete, get, has, set 메서드를 지원하는 래퍼 클래스입니다.

class ClearableWeakMap {
    constructor(init) {
        this._wm = new WeakMap(init)
    }
    clear() {
        // 새로운 빈 WeakMap으로 교체하여 모든 데이터를 제거
        this._wm = new WeakMap()
    }
    delete(k) {
        return this._wm.delete(k)
    }
    get(k) {
        return this._wm.get(k)
    }
    has(k) {
        return this._wm.has(k)
    }
    set(k, v) {
        this._wm.set(k, v)
        return this
    }
}

동작 방식 설명

clear()의 핵심 아이디어는 단순합니다. 기존 WeakMap의 내용을 하나씩 지우는 대신, 새로운 빈 WeakMap 인스턴스로 교체하는 것입니다. 이렇게 하면 기존 객체에 대한 참조가 끊기므로 저장되어 있던 모든 키/값 쌍은 곧바로 가비지 컬렉션의 대상이 됩니다.

또한 set() 메서드가 this를 반환하도록 작성되어 있어, 다음과 같이 메서드 체이닝(method chaining)도 가능합니다.

const cwm = new ClearableWeakMap();
cwm.set(obj1, 'data1').set(obj2, 'data2');

cwm.has(obj1); // true
cwm.clear();
cwm.has(obj1); // false

정리

  • WeakMap.prototype.clear()는 원래 모든 키/값 쌍을 제거하기 위한 메서드였습니다.
  • 보안상의 이유로 현재 표준 사양에는 포함되어 있지 않습니다.
  • 래퍼 클래스를 활용하면 얼마든지 동일한 기능을 직접 구현할 수 있습니다.