[JS] WeakMap์ด ๋ฌด์—‡์ธ๊ฐ€..?

๐Ÿค”WeakMap..?

WeakMap์€ Javascript์˜ ๊ฐ์ฒด ํƒ€์ž…์ž…๋‹ˆ๋‹ค. Map๊ณผ์˜ ์ฐจ์ด์ ์€ ํ‚ค ๊ฐ’์ด ๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ(strong reference)๋ฅผ ํ•˜์ง€ ์•Š๊ณ , ์•ฝํ•œ ์ฐธ์กฐ(weak reference)๋ฅผ ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โ“๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ(strong reference)์™€ ์•ฝํ•œ ์ฐธ์กฐ(weak reference)๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ์™€ ์•ฝํ•œ ์ฐธ์กฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด์ž…๋‹ˆ๋‹ค.

**๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ(strong reference)**๋Š” ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก, ๋ฌด๊ธฐํ•œ์œผ๋กœ ์œ ์ง€๋˜๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด **์•ฝํ•œ ์ฐธ์กฐ(weak reference)**๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

โ“๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

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

  1. ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด, ๋ฐ์ดํ„ฐ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‹๋ณ„๋œ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ฒดํ•˜๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๐Ÿค”WeakMap๊ณผ Map๊ฐ์ฒด์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

WeakMap์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ด€๋ จ๋œ ์ด์ ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด… Map๊ฐ์ฒด์™€ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

 

์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ ๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ์™€ ์•ฝํ•œ ์ฐธ์กฐ์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

  • Map๊ฐ์ฒด๋Š” ๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ‚ค๋‚˜ ๊ฐ’์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ํ•œ, ๊ทธ ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ ˆ๋Œ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๋ฐ˜๋ฉด WeakMap์€ ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์—, ํ‚ค, ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค!

WeakMap์€ ์—ด๊ฑฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ํ‚ค ๋ชฉ๋ก์„ ๊ฐ€์ง€๊ณ  ์‹ถ๋‹ค๋ฉด, Map๊ฐ์ฒด์˜ keys()๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Map๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ์ดํ„ฐ๋Ÿฌ๋ธ”(Iterable) ๊ฐ์ฒด๋กœ, for …of์™€ ๊ฐ™์€ ๋ฃจํ”„๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ WeakMap์˜ ๊ฒฝ์šฐ ์ˆœ์„œ๊ฐ€ ์—†๋Š” ๋…ผ-์ดํ„ฐ๋Ÿฌ๋ธ”(Non-Iterable) ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค!

WeakMap์˜ ํ‚ค ๊ฐ’์€ ๊ฐ์ฒด๋งŒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค!

  • WeakMap์˜ ํ‚ค ๊ฐ’์œผ๋กœ ์›์‹œ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! ์ •ํ™•ํ•˜๊ฒŒ๋Š” ๊ฐ์ฒด์™€ ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ์‹ฌ๋ณผ์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๊ฐ€๋Šฅํ•œ ๊ฐ’๋งŒ์ด ํ‚ค๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ•ฉ๋‹ˆ๋‹ค! ๋Œ€๋ถ€๋ถ„์˜ ์›์‹œ ๊ฐ’์€ ์ž„์˜๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๊ณ , ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๋”ฐ๋กœ ์—†์œผ๋ฏ€๋กœ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

โ—๊ทธ๋Ÿฌ๋‹ˆ๊นŒ...

WeakMap์€ ์—ด๊ฑฐํ•  ์ˆ˜ ์—†๊ณ , key๊ฐ’์œผ๋กœ “๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๊ฐ€๋Šฅํ•œ ๊ฐ’”๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ด€๋ จ๋œ ์ด์ ์ด ์žˆ๊ธฐ์— ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!

 

WeakMap์€ ์บ์‹ฑ์„ ์ด์šฉํ•œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜, Private Filed๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ด€๋ จ๋œ ๊ณณ์—์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์ด ๋ถ€๋ถ„์€ ์•„์ง ์‹ค๋ ฅ์ด ๋ถ€์กฑํ•œ ์ €๋กœ์จ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  ๋” ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜๊ฒ ๋„ค์š”..๐Ÿ˜ฃ

 

 

WeakMap - JavaScript | MDN

WeakMap ์€ ํ‚ค/๊ฐ’ ์Œ์˜ ๋ชจ์Œ์œผ๋กœ, ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ์ฒด ๋˜๋Š” ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ์‹ฌ๋ณผ์ด๋ฉฐ ๊ฐ’์€ ์ž„์˜์˜ JavaScript ํƒ€์ž…์ž…๋‹ˆ๋‹ค. WeakMap์€ ํ‚ค์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ฐ์ฒด๊ฐ€ WeakMap์˜ ํ‚ค์— ํฌํ•จ

developer.mozilla.org