[๐Ÿค–] JavaScript WeakMap๊ณผ WeakSet: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€์™€ ์ตœ์ ํ™” ์ „๋žต

JavaScript์—์„œ WeakMap๊ณผ WeakSet์„ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์šฉ์ ์ธ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ž์„ธํžˆ ์•Œ์•„๋ด์š”. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋™์ž‘ ์›๋ฆฌ์™€ ํ•จ๊ป˜ ๊ฐ์ฒด ์ฐธ์กฐ ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ์„ ์ดํ•ดํ•˜๊ณ , ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋Š” ์ „๋žต์„ ๋ฐฐ์›Œ๋ด์š”.

23๋ถ„
๋‹จ์–ด: 1,917๊ฐœ
๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ
์ •๋ณด

๐Ÿค– ์ด ํฌ์ŠคํŒ…์€ Gemini 2.5 Flash AI๊ฐ€ ์ž‘์„ฑํ–ˆ์–ด์š”.
๋‚ด์šฉ์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์ง€๋งŒ, ์‹ค๋ฌด ์ ์šฉ ์ „ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์œ ์šฉํ•œ ํŒ

์ด ๊ธ€์—์„œ๋Š” JavaScript์˜ ๊ฐ•๋ ฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋„๊ตฌ์ธ WeakMap๊ณผ WeakSet์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ „ ํ™œ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ์ฃผ์˜์‚ฌํ•ญ๊นŒ์ง€ ์ดˆ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž ๋ˆˆ๋†’์ด์— ๋งž์ถฐ ์ž์„ธํžˆ ๋‹ค๋ฃจ๊ณ  ์žˆ์–ด์š”.

์•ˆ๋…•ํ•˜์„ธ์š”, 10๋…„ ์ด์ƒ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์‹œ๋‹ˆ์–ด ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž์ด์ž ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ SEO ์ „๋ฌธ๊ฐ€ ๋ธ”๋ฃจ์˜ˆ์š”. ์ €๋Š” ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์„ฑ์žฅ์„ ๋•๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•˜๊ณ  ์žˆ์–ด์š”.

์˜ค๋Š˜์€ JavaScript ๊ฐœ๋ฐœ์ž๋“ค์ด ์ข…์ข… ๊ฐ„๊ณผํ•˜์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์— ์ง€๋Œ€ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” '๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ'์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด๋ ค๊ณ  ํ•ด์š”. ํŠนํžˆ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” WeakMap๊ณผ WeakSet์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด ๋ณผ ๊ฑฐ์˜ˆ์š”.

๐Ÿค” ๋ฌธ์ œ ์ œ๊ธฐ: JavaScript์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

JavaScript๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection) ๋•๋ถ„์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ๊ฑฐ์˜ ์—†์–ด์š”. ํ•˜์ง€๋งŒ '๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜'์ด ๋งŒ๋Šฅ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์•„์…”์•ผ ํ•ด์š”. ์ž˜๋ชป๋œ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”.

0๏ธโƒฃ ๊ฐ•ํ•œ ์ฐธ์กฐ(Strong Reference)์™€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ํ•œ๊ณ„

๋Œ€๋ถ€๋ถ„์˜ JavaScript ๊ฐ์ฒด๋Š” '๊ฐ•ํ•œ ์ฐธ์กฐ'๋ฅผ ํ†ตํ•ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์š”. ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•˜๋ฉด, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ '์‚ฌ์šฉ ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ'๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ํ•ด์ œํ•˜์ง€ ์•Š์•„์š”. ๋ฌธ์ œ๋Š” ์ด ์ฐธ์กฐ๊ฐ€ ๋” ์ด์ƒ ํ•„์š” ์—†๋Š”๋ฐ๋„ ๋Š์–ด์ง€์ง€ ์•Š๊ณ  ๋‚จ์•„์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•ด์š”. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, Map์ด๋‚˜ Set ๊ฐ™์€ ์ปฌ๋ ‰์…˜์€ ํ‚ค๋‚˜ ๊ฐ’์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ๋•Œ '๊ฐ•ํ•œ ์ฐธ์กฐ'๋ฅผ ์œ ์ง€ํ•ด์š”. ์ปฌ๋ ‰์…˜์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด, ๊ฐ์ฒด์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์ฐธ์กฐ๊ฐ€ ๋ชจ๋‘ ์‚ฌ๋ผ์ ธ๋„ ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€์˜ ์ฐธ์กฐ ๋•Œ๋ฌธ์— ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋  ์ˆ˜ ์žˆ์–ด์š”.

const cache = new Map(); function expensiveOperation(obj: object) { if (cache.has(obj)) { console.log('์บ์‹œ ํžˆํŠธ!', obj); return cache.get(obj); } // ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์—ฐ์‚ฐ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด์š”. const result = { data: obj.id * 2 }; cache.set(obj, result); console.log('์บ์‹œ ๋ฏธ์Šค! ์—ฐ์‚ฐ ํ›„ ์ €์žฅ', obj); return result; } let user1 = { id: 1, name: '๋ธ”๋ฃจ' }; let user2 = { id: 2, name: '๋ ˆ๋“œ' }; expensiveOperation(user1); expensiveOperation(user2); expensiveOperation(user1); // user1 ๊ฐ์ฒด์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ null๋กœ ๋งŒ๋“ค์–ด์š”. // ํ•˜์ง€๋งŒ cache Map ๋‚ด์—์„œ๋Š” ์—ฌ์ „ํžˆ user1 ๊ฐ์ฒด๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์–ด์š”. user1 = null; // ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋™์ž‘ํ•ด๋„ user1 ๊ฐ์ฒด๋Š” cache Map ๋•Œ๋ฌธ์— ํ•ด์ œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด์š”. // ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ๋ฉ”๋ชจ๋ฆฌ ํƒญ์—์„œ ํ™•์ธํ•ด ๋ณด์„ธ์š”. // console.log(cache); // Map์— user1 ๊ฐ์ฒด๊ฐ€ ์—ฌ์ „ํžˆ ๋‚จ์•„์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

์œ„ ์ฝ”๋“œ์—์„œ user1 = null;์„ ํ•ด๋„ cache Map ๋‚ด๋ถ€์— user1 ๊ฐ์ฒด๊ฐ€ ์—ฌ์ „ํžˆ ๋‚จ์•„์žˆ์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ํ•ด์ œํ•˜์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ•„์š” ์—†๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ„์† ์ ์œ ํ•˜๊ฒŒ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•ด์š”.

1๏ธโƒฃ ์‹ค๋ฌด์—์„œ ํ”ํžˆ ๊ฒช๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์‹œ๋‚˜๋ฆฌ์˜ค

์ด๋Ÿฌํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ์‹ค๋ฌด์—์„œ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์–ด์š”.

  • DOM ์š”์†Œ ์ฐธ์กฐ: JavaScript์—์„œ DOM ์š”์†Œ๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ , ๋‚˜์ค‘์— ํ•ด๋‹น DOM ์š”์†Œ๊ฐ€ DOM ํŠธ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜์–ด๋„ ๋ณ€์ˆ˜ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•ด์š”.
  • ์บ์‹ฑ: ์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ Map ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์บ์‹ฑํ•  ๋•Œ, ์บ์‹œ๋œ ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋ฐ๋„ ์บ์‹œ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ƒ๊ฒจ์š”.
  • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ: ๊ฐ์ฒด์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ•ด์ œํ•˜์ง€ ์•Š์œผ๋ฉด, ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ WeakMap๊ณผ WeakSet์ด์—์š”.

๐Ÿ’ก WeakMap๊ณผ WeakSet์˜ ๋“ฑ์žฅ

WeakMap๊ณผ WeakSet์€ ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด '์•ฝํ•œ ์ฐธ์กฐ(Weak Reference)'๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ปฌ๋ ‰์…˜์ด์—์š”. ์ด ์•ฝํ•œ ์ฐธ์กฐ ๋•๋ถ„์— ์ผ๋ฐ˜ Map์ด๋‚˜ Set๊ณผ๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

0๏ธโƒฃ ์•ฝํ•œ ์ฐธ์กฐ(Weak Reference)์˜ ๊ฐœ๋…

์•ฝํ•œ ์ฐธ์กฐ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€ ์•Š๋Š” ์ฐธ์กฐ ๋ฐฉ์‹์ด์—์š”. ์ฆ‰, ์–ด๋–ค ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  '๊ฐ•ํ•œ ์ฐธ์กฐ'๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜๊ณ , WeakMap์ด๋‚˜ WeakSet ๋‚ด๋ถ€์— ๋‚จ์•„์žˆ๋Š” '์•ฝํ•œ ์ฐธ์กฐ'๋Š” ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ผ์š”. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ด์—์š”.

1๏ธโƒฃ WeakMap ๊นŠ์ด ์•Œ์•„๋ณด๊ธฐ

WeakMap์€ Map๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์–ด์š”.

  • ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด์—ฌ์•ผ ํ•ด์š”: ์›์‹œ ๊ฐ’(๋ฌธ์ž์—ด, ์ˆซ์ž, ์‹ฌ๋ณผ ๋“ฑ)์€ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์š”. WeakMap์˜ ์•ฝํ•œ ์ฐธ์กฐ๋Š” ์˜ค์ง ๊ฐ์ฒด์—๋งŒ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.
  • ํ‚ค์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•ด์š”: WeakMap์˜ ํ‚ค๋Š” ์•ฝํ•œ ์ฐธ์กฐ๋กœ ์ €์žฅ๋ผ์š”. ๋งŒ์•ฝ ํ‚ค๋กœ ์‚ฌ์šฉ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜๊ณ , WeakMap์—์„œ๋„ ํ•ด๋‹น ํ‚ค-๊ฐ’ ์Œ์ด ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ผ์š”.
  • ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜์ง€ ์•Š์•„์š”: WeakMap์€ Map์ฒ˜๋Ÿผ size, clear(), keys(), values(), entries() ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•„์š”. ์•ฝํ•œ ์ฐธ์กฐ๋กœ ์ธํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์–ธ์ œ ํ‚ค๋ฅผ ์ œ๊ฑฐํ• ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, WeakMap์˜ ๋‚ด์šฉ์„ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ํฌ๊ธฐ๋ฅผ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†์–ด์š”. ์ด๋Š” WeakMap์ด ์ฃผ๋กœ ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” '๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ'๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ด์œ ์˜ˆ์š”.

์ฃผ์š” ๋ฉ”์„œ๋“œ:

  • weakMap.set(key, value): ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•ด์š”. key๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด์—ฌ์•ผ ํ•ด์š”.
  • weakMap.get(key): key์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์š”. ํ‚ค๊ฐ€ ์—†์œผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•ด์š”.
  • weakMap.has(key): key๊ฐ€ WeakMap์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ boolean์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์š”.
  • weakMap.delete(key): key์— ํ•ด๋‹นํ•˜๋Š” ํ‚ค-๊ฐ’ ์Œ์„ ์ œ๊ฑฐํ•ด์š”.

2๏ธโƒฃ WeakSet ๊นŠ์ด ์•Œ์•„๋ณด๊ธฐ

WeakSet์€ Set๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ณ ์œ ํ•œ ๊ฐ์ฒด๋“ค์„ ์ €์žฅํ•˜์ง€๋งŒ, ์—ญ์‹œ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ์žˆ์–ด์š”.

  • ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด์—ฌ์•ผ ํ•ด์š”: WeakSet์€ ์˜ค์ง ๊ฐ์ฒด๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด์š”. ์›์‹œ ๊ฐ’์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์•„์š”.
  • ๊ฐ’์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•ด์š”: WeakSet์˜ ๊ฐ’์€ ์•ฝํ•œ ์ฐธ์กฐ๋กœ ์ €์žฅ๋ผ์š”. ์ €์žฅ๋œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋Œ€์ƒ์ด ๋˜๊ณ , WeakSet์—์„œ๋„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ผ์š”.
  • ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜์ง€ ์•Š์•„์š”: WeakSet๋„ WeakMap๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ size, clear(), keys(), values(), entries() ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•„์š”. ์ด๋Š” WeakSet์˜ ๋‚ด์šฉ์ด๋‚˜ ํฌ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์˜ˆ์š”.

์ฃผ์š” ๋ฉ”์„œ๋“œ:

  • weakSet.add(value): value(๊ฐ์ฒด)๋ฅผ WeakSet์— ์ถ”๊ฐ€ํ•ด์š”.
  • weakSet.has(value): value๊ฐ€ WeakSet์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ boolean์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์š”.
  • weakSet.delete(value): value๋ฅผ WeakSet์—์„œ ์ œ๊ฑฐํ•ด์š”.

โš™๏ธ ์‹ค์ „ ํ™œ์šฉ ์˜ˆ์‹œ

WeakMap๊ณผ WeakSet์€ ํŠน์ • ์ƒํ™ฉ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ด์š”. ๋ช‡ ๊ฐ€์ง€ ์‹ค์šฉ์ ์ธ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

0๏ธโƒฃ DOM ์š”์†Œ์— ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐํ•˜๊ธฐ (WeakMap)

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ DOM ์š”์†Œ์— ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ์•„์š”. ์ด๋•Œ ์ผ๋ฐ˜ ๊ฐ์ฒด๋‚˜ Map์„ ์‚ฌ์šฉํ•˜๋ฉด DOM ์š”์†Œ๊ฐ€ ํ™”๋ฉด์—์„œ ์ œ๊ฑฐ๋˜์–ด๋„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. WeakMap์€ ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•ด ์ค˜์š”.

interface ElementData { clicks: number; lastAccessed: Date; } // DOM ์š”์†Œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•  WeakMap์„ ์ƒ์„ฑํ•ด์š”. const elementDataMap = new WeakMap<HTMLElement, ElementData>(); function attachDataToElement(element: HTMLElement) { const data: ElementData = { clicks: 0, lastAccessed: new Date(), }; elementDataMap.set(element, data); console.log(`[${element.id}] ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”:`, data); } function getElementClicks(element: HTMLElement): number { const data = elementDataMap.get(element); if (data) { data.clicks++; data.lastAccessed = new Date(); console.log(`[${element.id}] ํด๋ฆญ ์ˆ˜ ์ฆ๊ฐ€:`, data.clicks); return data.clicks; } return 0; } // ์˜ˆ์‹œ DOM ์š”์†Œ ์ƒ์„ฑ const div1 = document.createElement('div'); div1.id = 'div1'; document.body.appendChild(div1); const div2 = document.createElement('div'); div2.id = 'div2'; document.body.appendChild(div2); attachDataToElement(div1); attachDataToElement(div2); getElementClicks(div1); getElementClicks(div1); getElementClicks(div2); // div1์„ DOM์—์„œ ์ œ๊ฑฐํ•˜๊ณ , ํ•ด๋‹น ์š”์†Œ์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ์—†์• ์š”. document.body.removeChild(div1); // div1 = null; // ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ null๋กœ ๋งŒ๋“ค๋ฉด WeakMap์—์„œ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋  ํ™•๋ฅ ์ด ๋†’์•„์ ธ์š”. // ์ž ์‹œ ํ›„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋™์ž‘ํ•˜๋ฉด div1๊ณผ ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋Š” WeakMap์—์„œ ์ž๋™์œผ๋กœ ์‚ฌ๋ผ์ ธ์š”. // WeakMap์€ ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง์ ‘ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์€ ์—†์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ํ–ฅ์ƒ๋ผ์š”. // ์—ฌ์ „ํžˆ ์ฐธ์กฐ๋˜๋Š” div2์˜ ๋ฐ์ดํ„ฐ๋Š” ์œ ํšจํ•ด์š”. console.log('div2์˜ ํ˜„์žฌ ๋ฐ์ดํ„ฐ:', elementDataMap.get(div2));

์ด ์˜ˆ์‹œ์—์„œ๋Š” elementDataMap์ด div1๊ณผ div2 ๊ฐ์ฒด์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•ด์š”. div1์ด DOM์—์„œ ์ œ๊ฑฐ๋˜๊ณ  ๋” ์ด์ƒ ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ์—†์œผ๋ฉด, div1 ๊ฐ์ฒด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜๊ณ  elementDataMap์—์„œ๋„ div1๊ณผ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ •๋ฆฌ๋ผ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ์ผ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•  ํ•„์š” ์—†์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ ๊ฐ์ฒด ์บ์‹ฑ ์ „๋žต (WeakMap)

๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•  ๋•Œ, WeakMap์„ ์‚ฌ์šฉํ•˜๋ฉด ์บ์‹œ๋œ ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ํ•„์š” ์—†์–ด์งˆ ๋•Œ ์ž๋™์œผ๋กœ ์ •๋ฆฌ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ Map์„ ์‚ฌ์šฉํ•œ ์บ์‹ฑ ์˜ˆ์‹œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ค˜์š”.

// WeakMap์„ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ๋ฅผ ๊ตฌํ˜„ํ•ด์š”. const objectCache = new WeakMap<object, any>(); function calculateExpensiveValue(obj: object): any { if (objectCache.has(obj)) { console.log('โœจ ์บ์‹œ ํžˆํŠธ!', obj); return objectCache.get(obj); } // ์‹ค์ œ๋กœ๋Š” ๋ณต์žกํ•˜๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ณ„์‚ฐ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด์š”. const result = { value: Math.random() * 100, timestamp: new Date() }; objectCache.set(obj, result); console.log('๐Ÿš€ ์บ์‹œ ๋ฏธ์Šค! ์ƒˆ๋กœ์šด ๊ฐ’ ๊ณ„์‚ฐ ๋ฐ ์ €์žฅ', obj, result); return result; } let config1 = { id: 'config-A', settings: { theme: 'dark' } }; let config2 = { id: 'config-B', settings: { theme: 'light' } }; calculateExpensiveValue(config1); calculateExpensiveValue(config2); calculateExpensiveValue(config1); // config1 ๊ฐ์ฒด์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•ด์š”. config1 = null; // ์ž ์‹œ ํ›„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋™์ž‘ํ•˜๋ฉด config1 ๊ฐ์ฒด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋Œ€์ƒ์ด ๋˜๊ณ , // objectCache์—์„œ config1๊ณผ ์—ฐ๊ฒฐ๋œ ์บ์‹œ ๋ฐ์ดํ„ฐ๋„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ผ์š”. // config2๋Š” ์—ฌ์ „ํžˆ ์ฐธ์กฐ๋˜๋ฏ€๋กœ ์บ์‹œ๊ฐ€ ์œ ํšจํ•ด์š”. calculateExpensiveValue(config2); // WeakMap์€ ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜์ง€ ์•Š์•„ ์ง์ ‘ ๋‚ด์šฉ ํ™•์ธ์€ ์–ด๋ ต์ง€๋งŒ, // ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด Map๋ณด๋‹ค ํ›จ์”ฌ ์šฐ์ˆ˜ํ•ด์š”.

์ด ์˜ˆ์‹œ์—์„œ objectCache๋Š” config1๊ณผ config2 ๊ฐ์ฒด์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•ด์š”. config1 = null;์„ ํ†ตํ•ด config1 ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ๋ชจ๋‘ ์‚ฌ๋ผ์ง€๋ฉด, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ config1์„ ํ•ด์ œํ•˜๊ณ  objectCache์—์„œ๋„ ๊ด€๋ จ ์บ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ •๋ฆฌ๋ผ์š”. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ผ์š”.

2๏ธโƒฃ ๊ฐ์ฒด ์กด์žฌ ์—ฌ๋ถ€ ์ถ”์  (WeakSet)

WeakSet์€ ํŠน์ • ๊ฐ์ฒด๊ฐ€ ํ˜„์žฌ 'ํ™œ์„ฑ ์ƒํƒœ'์ธ์ง€ ๋˜๋Š” '์ฒ˜๋ฆฌ๋œ ์ƒํƒœ'์ธ์ง€๋ฅผ ์ถ”์ ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฐ์ฒด ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ๊ฐ์ฒด๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์šฉ๋„๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

// ์ฒ˜๋ฆฌ๋œ ๊ฐ์ฒด๋ฅผ ์ถ”์ ํ•˜๋Š” WeakSet์„ ์ƒ์„ฑํ•ด์š”. const processedObjects = new WeakSet<object>(); function processObject(obj: object) { if (processedObjects.has(obj)) { console.log('โœ… ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ๊ฐ์ฒด์˜ˆ์š”:', obj); return; } console.log('๐Ÿš€ ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌ ์ค‘...', obj); // ์—ฌ๊ธฐ์— ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์‹ค์ œ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์š”. processedObjects.add(obj); console.log('๐ŸŽ‰ ๊ฐ์ฒด ์ฒ˜๋ฆฌ ์™„๋ฃŒ ๋ฐ WeakSet์— ์ถ”๊ฐ€:', obj); } let item1 = { id: 'item-A' }; let item2 = { id: 'item-B' }; let item3 = { id: 'item-C' }; processObject(item1); processObject(item2); processObject(item1); // ๋‹ค์‹œ ํ˜ธ์ถœํ•ด๋„ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๊ณ  ๋‚˜์™€์š”. // item2์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•ด์š”. item2 = null; // ์ž ์‹œ ํ›„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋™์ž‘ํ•˜๋ฉด item2 ๊ฐ์ฒด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋Œ€์ƒ์ด ๋˜๊ณ , // processedObjects์—์„œ item2๋„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ผ์š”. // WeakSet์€ ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง์ ‘ ํ™•์ธ์€ ์–ด๋ ต์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์ด ์ข‹์•„์š”. processObject(item3);

์ด ์˜ˆ์‹œ์—์„œ processedObjects๋Š” item1, item2, item3 ๊ฐ์ฒด์— ๋Œ€ํ•œ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•ด์š”. item2 = null;์„ ํ†ตํ•ด item2์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด, item2๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋Œ€์ƒ์ด ๋˜๊ณ  processedObjects์—์„œ๋„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋ผ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ“ WeakMap๊ณผ WeakSet ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

WeakMap๊ณผ WeakSet์€ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์ œ์•ฝ์‚ฌํ•ญ๊ณผ ์ฃผ์˜ํ•  ์ ์ด ์žˆ์–ด์š”.

  • ํ‚ค/๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด์—ฌ์•ผ ํ•ด์š”: ์•ž์—์„œ ๊ฐ•์กฐํ–ˆ๋“ฏ์ด, ์›์‹œ ๊ฐ’์€ ํ‚ค(WeakMap)๋‚˜ ๊ฐ’(WeakSet)์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์š”. ์ด๋Š” ์•ฝํ•œ ์ฐธ์กฐ๊ฐ€ ๊ฐ์ฒด์—๋งŒ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.
  • ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜์ง€ ์•Š์•„์š”: WeakMap๊ณผ WeakSet์€ size ์†์„ฑ์ด๋‚˜ keys(), values(), entries() ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•„์š”. ๋”ฐ๋ผ์„œ ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ํฌ๊ธฐ๋ฅผ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†์–ด์š”. ์ด๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์–ธ์ œ ์ผ์–ด๋‚ ์ง€ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. ์ด ๋•Œ๋ฌธ์— WeakMap๊ณผ WeakSet์€ ์ฃผ๋กœ '๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ'๋‚˜ '๊ฐ์ฒด ์กด์žฌ ์—ฌ๋ถ€ ํŠธ๋ž˜ํ‚น'๊ณผ ๊ฐ™์ด ํŠน์ • ๊ฐ์ฒด์— ์ •๋ณด๋ฅผ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ์ถ”์ ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ผ์š”.
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์‹œ์  ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅ: ์•ฝํ•œ ์ฐธ์กฐ๊ฐ€ ์–ธ์ œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜๋ ์ง€๋Š” ์ •ํ™•ํžˆ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์–ด์š”. ์ด๋Š” JavaScript ์—”์ง„์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„๊ณผ ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ ธ์š”. ๋”ฐ๋ผ์„œ WeakMap์ด๋‚˜ WeakSet์— ํŠน์ • ํ‚ค/๊ฐ’์ด ์กด์žฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ๋งน๋ชฉ์ ์œผ๋กœ ๊ฐ€์ •ํ•˜๋ฉด ์•ˆ ๋ผ์š”.
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์™„์ „ํžˆ ๋ง‰์•„์ฃผ์ง€๋Š” ์•Š์•„์š”: WeakMap๊ณผ WeakSet์€ '์•ฝํ•œ ์ฐธ์กฐ'๋ฅผ ํ†ตํ•ด ํŠน์ • ์ƒํ™ฉ์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜์ง€๋งŒ, ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ์ง€๋Š” ์•Š์•„์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ์ฐธ์กฐํ•˜๋Š” ํด๋กœ์ €๋กœ ์ธํ•œ ๋ˆ„์ˆ˜๋Š” ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•ญ์ƒ ์ฝ”๋“œ ์ „์ฒด์˜ ์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•ด์š”.
์œ ์šฉํ•œ ํŒ

์–ธ์ œ Map/Set์„ ์‚ฌ์šฉํ•˜๊ณ , ์–ธ์ œ WeakMap/WeakSet์„ ์‚ฌ์šฉํ• ๊นŒ์š”?

  • Map/Set: ์ปฌ๋ ‰์…˜์— ์ €์žฅ๋œ ๋ชจ๋“  ํ‚ค/๊ฐ’ ์Œ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ ํฌ๊ธฐ๋ฅผ ์•Œ์•„์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ด์š”. ํ‚ค/๊ฐ’์œผ๋กœ ์›์‹œ ๊ฐ’์„ ํฌํ•จํ•œ ๋ชจ๋“  ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • WeakMap/WeakSet: ํŠน์ • ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•ด์•ผ ํ•˜์ง€๋งŒ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๊ธฐ๋ฅผ ์›ํ•  ๋•Œ ์‚ฌ์šฉํ•ด์š”. ํ‚ค/๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด์—ฌ์•ผ ํ•ด์š”.

๐Ÿ“ ์ •๋ฆฌ

์˜ค๋Š˜์€ JavaScript์˜ WeakMap๊ณผ WeakSet์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์•˜์–ด์š”. ์ด ํŠน๋ณ„ํ•œ ์ปฌ๋ ‰์…˜์€ '์•ฝํ•œ ์ฐธ์กฐ'๋ผ๋Š” ๊ฐœ๋…์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์„ ์ค˜์š”.

  • **WeakMap**์€ ํ‚ค๊ฐ€ ๊ฐ์ฒด์ธ ํ‚ค-๊ฐ’ ์Œ์„ ์ €์žฅํ•˜๋ฉฐ, ํ‚ค ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์—”ํŠธ๋ฆฌ๊ฐ€ ์ œ๊ฑฐ๋ผ์š”. ์ฃผ๋กœ DOM ์š”์†Œ์— ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ, ๊ฐ์ฒด ๊ธฐ๋ฐ˜ ์บ์‹ฑ ๋“ฑ์— ํ™œ์šฉ๋ผ์š”.
  • **WeakSet**์€ ๊ฐ์ฒด๋งŒ์„ ๊ฐ’์œผ๋กœ ์ €์žฅํ•˜๋ฉฐ, ๊ฐ’ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ๊ฐ’์ด ์ œ๊ฑฐ๋ผ์š”. ์ฃผ๋กœ ๊ฐ์ฒด์˜ ์กด์žฌ ์—ฌ๋ถ€ ์ถ”์ , ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๊ด€๋ฆฌ ๋“ฑ์— ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์–ด์š”.

WeakMap๊ณผ WeakSet์€ ์ดํ„ฐ๋Ÿฌ๋ธ”ํ•˜์ง€ ์•Š๊ณ  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์‹œ์ ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ์ง€๋งŒ, ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•œ ์ƒํ™ฉ์— ํ™œ์šฉํ•œ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ •์ ์ธ JavaScript ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.

์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, WeakMap๊ณผ WeakSet์„ ์ ๊ทน์ ์œผ๋กœ ๊ณ ๋ คํ•ด ๋ณด์‹œ๊ธธ ๋ฐ”๋ผ์š”! ๋‹ค์Œ์—๋„ ์‹ค๋ฌด์— ๋„์›€์ด ๋˜๋Š” ์œ ์ตํ•œ ์ •๋ณด๋กœ ์ฐพ์•„์˜ฌ๊ฒŒ์š”.

๐Ÿ“ฎ ์ฐธ๊ณ 

์—ฐ๊ด€๋œ ํฌ์ŠคํŠธ