
ES6(ECMAScript 2015) – Map, Set, WeakMap, WeakSet – 2 – WeakMap의 사용과 특징
WeakMap이란?
WeakMap은 ES6(ECMAScript 2015)에서 도입된 새로운 데이터 구조 중 하나입니다. WeakMap은 키와 값의 쌍을 저장하며, 객체만을 키로 사용할 수 있습니다. 하지만 WeakMap은 일반 Map과는 다른 특징을 가지고 있습니다. 이제부터 한 번 살펴보도록 하겠습니다.
WeakMap의 사용
WeakMap은 주로 객체에 대한 부가적인 데이터를 저장하는 용도로 사용됩니다. 예를 들어, 메모리 누수를 방지하면서 객체에 연결된 데이터를 관리해야 할 때 유용합니다. WeakMap은 약한 참조(weak reference)를 사용하여 객체에 대한 참조를 유지합니다. 이는 객체가 다른 곳에서 참조되지 않을 때 가비지 컬렉션(Garbage Collection)의 대상이 되어 메모리에서 자동으로 제거될 수 있도록 합니다.
다음은 WeakMap을 사용하는 예시입니다. 가정해보겠습니다. 당신이 웹 애플리케이션을 개발하고 있고, 사용자 객체에 대한 추가 정보를 저장하고 싶다고 가정해봅시다.
let user1 = { id: 1 };
let user2 = { id: 2 };
let user3 = { id: 3 };
let userAdditionalInfo = new WeakMap();
userAdditionalInfo.set(user1, { name: 'John', age: 25 });
userAdditionalInfo.set(user2, { name: 'Sarah', age: 32 });
userAdditionalInfo.set(user3, { name: 'Michael', age: 28 });
위 예시에서 userAdditionalInfo
WeakMap은 사용자 객체를 키로 하고 부가적인 정보를 값으로 저장합니다. WeakMap을 사용하면 원하는만큼 객체에 연결된 데이터를 보관할 수 있습니다. 이렇게 저장된 정보는 필요할 때 언제든 접근할 수 있습니다.
let userInfo = userAdditionalInfo.get(user1);
console.log(userInfo); // { name: 'John', age: 25 }
userAdditionalInfo.get(user1)
을 호출하면, 해당 사용자 객체에 연결된 정보를 얻을 수 있습니다.
WeakMap의 특징
- 약한 참조(weak reference): WeakMap은 키로 사용된 객체에 대한 약한 참조를 유지합니다. 즉, 다른 곳에서 해당 객체를 참조하지 않는다면 가비지 컬렉션에 의해 메모리에서 자동으로 제거될 수 있습니다. 이는 메모리 누수를 방지하는 데에 도움을 줍니다.
- 이터러블(iterable)하지 않음: WeakMap은 이터러블하지 않기 때문에 for…of 루프를 사용하여 키-값 쌍을 직접 순회할 수 없습니다.
- 크기(size) 및 열거(enumeration) 불가능: WeakMap은 size 프로퍼티를 제공하지 않으며, 키-값 쌍의 목록을 직접 열거할 수 없습니다.
- 메서드 제한: WeakMap은 get(), set(), has(), delete()와 같은 메서드만을 제공합니다. 기타 메서드들은 제공되지 않습니다.
WeakMap 사용 시 주의해야 할 점
- 키는 반드시 객체여야 합니다. 원시 값(예: 숫자, 문자열)은 키로 사용할 수 없습니다.
- WeakMap의 키는 약한 참조로 유지되기 때문에, 해당 키에 대한 참조가 존재하지 않는다면 가비지 컬렉션에 의해 메모리에서 자동으로 제거될 수 있습니다. 따라서, WeakMap의 키로 사용되는 객체는 다른 곳에서 참조되지 않는지 주의해야 합니다. 그렇지 않으면 원하지 않는 데이터 손실이 발생할 수 있습니다.
지금까지 ES6(ECMAScript 2015)의 WeakMap에 대해 알아보았습니다. WeakMap은 객체에 대한 부가적인 데이터를 안전하게 저장하고 관리하는 데에 유용합니다. 특히 메모리 누수를 방지하고 가비지 컬렉션을 활용하는 상황에서 유용하게 사용될 수 있습니다. 이제 당신은 WeakMap을 사용하여 객체에 연결된 데이터를 관리할 수 있을 것입니다. 활용해보세요!