B25 : ์œ„ํฌ๋งต๊ณผ ์œ„ํฌ์…‹(weak) ๊ฐ์ฒด

2025. 8. 26. 19:55ใ†Front-end/JavaScript

๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

1. ์œ„ํฌ๋งต๊ณผ ์œ„ํฌ์…‹

2. ์œ„ํฌ๋งต (WeekMap)

    2-1. ๋งต๊ณผ ์œ„ํฌ๋งต์˜ ์ฐจ์ด (์œ„ํฌ๋งต์˜ ํŠน์ง•)

    2-2. ์œ„ํฌ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

3. ์œ„ํฌ์…‹ (WeekSet)


1. ์œ„ํฌ๋งต๊ณผ ์œ„ํฌ์…‹

๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ, ๋ฐฐ์—ด์˜ ์š”์†Œ, ๋งต๊ณผ ์…‹์˜ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์€ ๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๋™์•ˆ์€ ๊ทธ ์š”์†Œ๋„ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์œ„ํฌ๋งต๊ณผ ์œ„ํฌ์…‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‚ค๋กœ ์“ฐ์ธ ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค.

 


2. ์œ„ํฌ๋งต (WeekMap)

1. ๋งต๊ณผ ์œ„ํฌ๋งต์˜ ์ฐจ์ด (์œ„ํฌ๋งต์˜ ํŠน์ง•)

1. ์œ„ํฌ๋งต์˜ ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด์—ฌ์•ผ ํ•œ๋‹ค. (์›์‹œ๊ฐ’์€ ์œ„ํฌ๋งต์˜ ํ‚ค๊ฐ€ ๋  ์ˆ˜ ์—†์Œ)

let weakMap = new WeakMap();

let obj = {};

weakMap.set(obj, "ok");	// ์ •์ƒ ์ž‘๋™
weekMap.set("text", "no");	// Error: Invalid value ...

 

์œ„ํฌ๋งต์˜ ํ‚ค๋กœ ์‚ฌ์šฉ๋œ ๊ฐ์ฒด(obj)๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์—†๋‹ค๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ ์œ„ํฌ๋งต์—์„œ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋œ๋‹ค.

let john = { name: "John" };	// ๊ฐ์ฒด

let weakMap = new WeakMap();	// weakmap ์ƒ์„ฑ
weakMap.set(john, "...");	// ๊ฐ์ฒด๋ฅผ ํ‚ค๋กœ ์„ค์ •

john = null;	// ์ฐธ์กฐ๋ฅผ ๋ฎ์–ด์จ์„œ {name:"John"}์€ ์ด์ œ ์ง€์›Œ์ง

john์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด { name: "John" }์€ ์˜ค๋กœ์ง€ ์œ„ํฌ๋งต์˜ ํ‚ค๋กœ๋งŒ ์“ฐ์ด๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ฐธ์กฐ๋ฅผ ๋ฎ์–ด์“ฐ๊ฒŒ ๋˜๋ฉด ์ด ๊ฐ์ฒด๋Š” ์œ„ํฌ๋งต, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œ๋œ๋‹ค.

 

2. ๋ฐ˜๋ณต ์ž‘์—…๊ณผ keys(), values(), entries() ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ์œ„ํฌ๋งต์—์„œ ํ‚ค๋‚˜ ๊ฐ’ ์ „์ฒด๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ„ํฌ๋งต์ด ์ง€์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ์ ์–ด์ง„๋‹ค.

  • weakMap.get(key)
  • weakMap.set(key, value)
  • weakMap.delete(key)
  • weakMap.has(key)

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋™์ž‘ ์‹œ์ ์„ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์š”์†Œ ์ „์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋™์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

 

2. ์œ„ํฌ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

1. ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ

๋ถ€์ฐจ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ณณ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.

"์™ธ๋ถ€ ์ฝ”๋“œ์— ์†ํ•œ ๊ฐ์ฒด"์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ๋ฐ์ดํ„ฐ๋Š” "์™ธ๋ถ€ ๊ฐ์ฒด"๊ฐ€ ์‚ด์•„์žˆ๋Š” ๋™์•ˆ๋งŒ ์œ ํšจํ•˜๋‹ค.

์œ„ํฌ๋งต์— ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ํ‚ค๋กœ "์™ธ๋ถ€ ๊ฐ์ฒด"๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

// visitsCount.js
let visitsCountMap = new WeakMap();	// ์‚ฌ์šฉ์ž์˜ ๋ฐฉ๋ฌธ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” visitsCountMap

function countUser(user) {
  let count = visitsCountMap.get(user) || 0;
  visitsCountMap.set(user, count + 1);
}

// main.js
let john = { name: "John };
countUser(john);
// ...

john = null;	// john์ด ํƒˆํ‡ดํ•˜๋ฉด WeakMap์—์„œ๋„ john์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ง€์›Œ์ง

 

2. ์บ์‹ฑ (cashing)

๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด์•ผํ•  ๋•Œ, ์ตœ์ดˆ ํ˜ธ์ถœ ์‹œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ์ €์žฅํ•ด๋’€๋‹ค๊ฐ€ ๋‹ค์Œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

// cache.js
let cache = new WeakMap();

function process(obj) {
  if(!cache.has(obj)) {
    let result = /* ์—ฐ์‚ฐ ์ˆ˜ํ–‰ */ obj;	// obj์— ๋Œ€ํ•œ ์—ฐ์‚ฐ
    cache.set(obj, result);
  }
  return cache.get(obj);
}

// main.js
let obj = {/*... ๊ฐ์ฒด ...*/};
let result1 = process(obj);
let result2 = process(obj);

obj = null;

alert(cache.size);

์—ฌ๊ธฐ์„œ cache๋ฅผ map์œผ๋กœ ์„ ์–ธํ–ˆ๋‹ค๋ฉด, ํ•„์š”์—†์–ด์ง„ obj๋ฅผ null๋กœ ๋ฎ์–ด์จ๋„ cache์—๋Š” ์—ฌ์ „ํžˆ obj์— ๋Œ€ํ•œ ๊ฐ’์ด ๋‚จ์•„์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ WeakMap์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ obj๊ฐ€ null์ด ๋˜๋ฉด cache์˜ obj๋„ ์ง€์›Œ์ง„๋‹ค.

 


3. ์œ„ํฌ์…‹ (WeekSet)

์œ„ํฌ์…‹์€ ๊ฐ์ฒด๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. (์›์‹œ๊ฐ’ ์ €์žฅ ๋ถˆ๊ฐ€๋Šฅ)

weakmap๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์œ„ํฌ์…‹์ด ์ง€์›ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์ถœํ•˜๋‹ค. (์œ„์™€ ๊ฐ™์€ ์ด์œ )

  • weakSet.get(key)
  • weakSet.set(key, value)
  • weakSet.delete(key)
  • weakSet.has(key)

์œ„ํฌ์…‹ ์—ญ์‹œ ๋ถ€์ฐจ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์œ„ํฌ์…‹์—๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

๋Œ€์‹  ๊ฐ„๋‹จํ•œ ๋‹ต๋ณ€์„ ์–ป๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

์˜ˆ์‹œ๋กœ ์‚ฌ์šฉ์ž์˜ ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•˜๋Š” ์šฉ๋„์˜ ์‚ฌ์šฉ์„ ๋ณด์ž.

let visitedSet = new WeakSet();

let john = { name: "John" };
let kim = { name: "Kim" };
let dayeon = { name: "Dayeon" };

visitedSet.add(john);
visitedSet.add(kim);
visitedSet.add(john);

alert(visitedSet.has(john));	// true
alert(visitedSet.has(mary));	// false

john = null;
// visitedSet์—์„œ john์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋œ๋‹ค.

 

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•