JavaScript - WeakSet 객체

안녕하세요, 프로그래밍에 도전하는 여러분! 오늘 우리는 JavaScript의 흥미롭지만 자주 간과되는 기능을 탐구해볼 것입니다: WeakSet 객체입니다. 프로그래밍 초보자라도 걱정하지 마세요; 저는 여러분을 단계별로 안내해드릴 것입니다. 마음에 드는 음료를 마시며 편안하게 앉아, 함께 이 글을 읽어보세요!

JavaScript - WeakSet

What is a WeakSet?

먼저 WeakSet이 무엇인지 이해해보겠습니다. 특별한 상자가 있고, 거기에는 고유한 장난감만 넣을 수 있지만, 아무도 놀지 않을 때 마법처럼 사라지는 장난감이 있다고 상상해보세요. 이것이 JavaScript에서 WeakSet과 비슷한 개념입니다!

WeakSet은 객체의 컬렉션으로, 몇 가지 특별한 특성을 가지고 있습니다:

  1. 오직 객체만 저장할 수 있습니다. 원시 값을 저장할 수 없습니다.
  2. WeakSet에 있는 객체는 약하게 참조되므로, 다른 참조가 없다면 가비지 콜lected될 수 있습니다.
  3. WeakSet은 열거할 수 없으므로 루프를 통해 순회할 수 없습니다.

이제 WeakSet을 어떻게 만들고 사용하는지 살펴보겠습니다.

문법

WeakSet을 만들기는 매우 간단합니다. 다음과 같이 합니다:

let myWeakSet = new WeakSet();

이제 빈 WeakSet을 생성했습니다. 이제 몇 가지 객체를 추가해보겠습니다.

let obj1 = { name: "Alice" };
let obj2 = { name: "Bob" };

myWeakSet.add(obj1);
myWeakSet.add(obj2);

console.log(myWeakSet.has(obj1)); // 출력: true
console.log(myWeakSet.has(obj2)); // 출력: true

이 예제에서 우리는 두 개의 객체를 생성하고 그것을 우리의 WeakSet에 추가했습니다. has() 메서드는 객체가 WeakSet에 있는지 확인합니다.

WeakSet 속성

이제 여러분은 "WeakSet이 어떤 속성을 가지고 있을까요?"라고 궁금해할 수도 있습니다. 이제 재미있는 사실을 알려드릴게요: WeakSet은 속성이 없습니다! 정말로, 제로, 짜릿, 무입니다! 이는 WeakSet이 가벼워지고 크기나 내용을 추적하지 않도록 설계되었기 때문입니다.

WeakSet 메서드

WeakSet에는 속성이 없지만, 몇 가지 유용한 메서드가 있습니다. 표로 보겠습니다:

메서드 설명
add(value) 새로운 객체를 WeakSet에 추가합니다
delete(value) 특정 객체를 WeakSet에서 제거합니다
has(value) 특정 객체가 WeakSet에 존재하는지 확인합니다

이제 이 메서드들을 실제로 사용해보겠습니다:

let weakSet = new WeakSet();
let obj = { id: 1 };

// 객체 추가
weakSet.add(obj);
console.log(weakSet.has(obj)); // 출력: true

// 객체 제거 시도
weakSet.delete(obj);
console.log(weakSet.has(obj)); // 출력: false

// 비 객체를 추가하려고 시도 (에러 발생)
try {
weakSet.add(1);
} catch(error) {
console.log("Error:", error.message);
}
// 출력: Error: Invalid value used in weak set

이 예제에서 우리는 WeakSet의 모든 세 가지 메서드를 사용했습니다. 비 객체 값을 추가하려고 시도할 때 에러가 발생하는 것을 주의하세요. WeakSet은 오직 객체만을 위한 것입니다!

예제

이제 기본 내용을 다루었으므로, 실제로 WeakSet을 사용할 수 있는 몇 가지 예제를 살펴보겠습니다.

예제 1: 객체 방문 추적

웹사이트를 만들고 사용자가 방문한 페이지를 추적하고 싶지만, 사용자가 활발히 브라우징 중일 때만 추적하고 싶은 상황을 상상해보세요:

let visitedPages = new WeakSet();

class Page {
constructor(url) {
this.url = url;
}

visit() {
visitedPages.add(this);
console.log(`Visited: ${this.url}`);
}

hasVisited() {
return visitedPages.has(this);
}
}

let homePage = new Page("https://example.com");
let aboutPage = new Page("https://example.com/about");

homePage.visit(); // 출력: Visited: https://example.com
console.log(homePage.hasVisited()); // 출력: true
console.log(aboutPage.hasVisited()); // 출력: false

이 예제에서 우리는 방문한 Page 객체를 추적하기 위해 WeakSet을 사용하고 있습니다. WeakSet은 Page 객체가 더 이상 필요하지 않을 때 가비지 콜lected될 수 있도록 해주어 메모리 관리에 유리합니다!

예제 2: 중복 처리 방지

사용자 데이터를 처리하는 프로그램을 작성하고 있지만, 각 사용자가 오직 한 번만 처리되도록 하고 싶은 경우를 상상해보세요:

let processedUsers = new WeakSet();

function processUser(user) {
if (processedUsers.has(user)) {
console.log(`User ${user.name} has already been processed.`);
return;
}

// 사용자 처리...
console.log(`Processing user: ${user.name}`);
processedUsers.add(user);
}

let user1 = { name: "Alice" };
let user2 = { name: "Bob" };

processUser(user1); // 출력: Processing user: Alice
processUser(user2); // 출력: Processing user: Bob
processUser(user1); // 출력: User Alice has already been processed.

이 예제에서 우리는 처리된 사용자를 추적하기 위해 WeakSet을 사용하고 있습니다. 이는 중복 처리를 방지하고 메모리 효율적입니다. 사용자 객체가 코드의 다른 부분에서 더 이상 참조되지 않으면, 사용자 객체와 WeakSet에 있는 그들의 항목은 가비지 콜lected됩니다.

결론

그렇습니다, 여러분! 우리는 JavaScript의 신비한 WeakSet 세계를 탐구했습니다. WeakSet은 그 cool하고 미니멀리스트 친구처럼, 오래 가지고 싶지 않은 것들을 좋아합니다. 객체와 특정 상태나 행동을 연결할 필요가 있지만, 객체가 가비지 콜lected되는 것을 방지하고 싶지 않을 때 완벽합니다.

WeakSet은 매일 사용할 것은 아니지만, 이해하는 것은 JavaScript 도구箱에 또 하나의 강력한 도구를 추가해줍니다. 어느 날, WeakSet이 복잡한 문제를 해결하는 데 정확히 필요할 수도 있습니다.

계속 코딩하시고, 호기심을 유지하시고, 기억하세요: 프로그래밍의 세계에서는 항상 새로운 것을 배울 수 있습니다!

Credits: Image by storyset