23.04.26 TIL๐Ÿ˜ฎ

์ƒค์ด๋‹ˆยท2023๋…„ 4์›” 26์ผ
0

learned.log

๋ชฉ๋ก ๋ณด๊ธฐ
36/46

์˜ค๋Š˜์€ ๋ฌด์—‡์„ ํ–ˆ๋‚˜์š”?

part1 ํ”ผ์–ด๋ฆฌ๋ทฐ

part1 ํ•œ๋‹ฌ ๊ฐ„์˜ ์—ฌ์ •์ด ๋์ด๋‚ฌ๋‹ค. ์ฝ”๋“œ์ž‡ ๋ถ€ํŠธ์บ ํ”„์—์„œ ์ฒ˜์Œ ํ•จ๊ป˜ํ•œ ํŒ€๊ณผ์˜ ์ด๋ณ„์ด๋ผ๋‹ˆ.. ๊ฐ™์ด ํ”„๋กœ์ ํŠธ ํ•œ๋ฒˆ ๋ชปํ•ด๋ด์„œ ๋„ˆ๋ฌด๋‚˜ ์•„์‰ฌ์› ๋‹ค. (๋ชจ๋‘๊ฐ€ ๋ถ€๋Ÿฌ์›Œํ•œ ์ผ€๋ฏธ์˜€๋Š”๋ฐ..(๋‡Œํ”ผ์…œใ…‹ใ…‹))

part1์ด ๋๋‚œ ํ›„, ํŒ€ ๋‚ด ํ”ผ์–ด๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋‹ค๋ฅธ ํ”ผ์–ด์— ๋Œ€ํ•ด ๊ตฌ๊ธ€ ์„ค๋ฌธ์— ์ข‹์•˜๋˜ ์ , ๊ฐœ์„ ํ•ด์•ผํ•  ์ , ๋‹ค์Œ ํŒŒํŠธ์— ๋„์ „ํ–ˆ์œผ๋ฉด ์ข‹์„ ์ ์„ ์ž‘์„ฑํ•ด์„œ ์ œ์ถœํ–ˆ๊ณ , ์ด๋ฅผ ๋ชจ์•„์„œ pdf ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ฒ˜์Œ์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์› ๋˜ ํŒ€์›๋“ค์˜ ํ‰๊ฐ€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์ด๋ผ ๊ธด์žฅ ๋ฐ˜ ๊ธฐ๋Œ€ ๋ฐ˜ใ…‹ใ…‹ใ…‹

๋“ ๋“ ํ–ˆ๋‹ค๋Š” ๊ฒƒ๊ณผ, ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ๋˜ ์ ์„ ์•Œ์•„๋ด์ฃผ์…”์„œ ๋„ˆ๋ฌด ๊ณ ๋งˆ์› ๋‹ค๐Ÿ˜ญ๐Ÿ˜ญ
์‚ฌ์‹ค ์ฒ˜์Œ์—๋Š” ์—ด์ •์ด ๋„˜์ณค๊ณ  ์ ์  ์ง€์ณ๊ฐ€๋Š” ๋‚˜๋ฅผ ๋Š๋ผ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ(feat ์ปจ๋””์…˜ ์กฐ์ ˆ ์‹คํŒจ) ์ด๋Ÿฐ ๋ฆฌ๋ทฐ๋ฅผ ํ•ด์ฃผ์…”์„œ ๋‹ค์‹œ ์—ด์ •์„ ๋˜์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค!

  • ๊ฐœ์„  ๋ฐ ๋„์ „ํ•ด๋ณผ ์ 

    ๋ฆฌ๋”ฉ ๊ฒฝํ—˜์„ ์Œ“๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋งค์šฐ ์œ ์ตํ•œ ์กฐ์–ธ! ๋˜ํ•œ, ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ์„ ํ•˜๋ฉด์„œ ์‚ฌ์‹ค ํ•˜๋ฃจํ•˜๋ฃจ ๊ฐœ๋…์„ ์Œ“๋Š”๋ฐ ๊ธ‰๊ธ‰ํ–ˆ์ง€ ๋ณต๊ธฐํ•˜๋Š” ๊ฒƒ์„ ์†Œํ™€ํžˆํ•  ๋•Œ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ, ๋‹ค์‹œ ํ•œ๋ฒˆ ์ธ์ง€๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค!
    • part1 ๋ฉค๋ฒ„๋“ค๋ผ๋ฆฌ ๋ฐ์ผ๋ฆฌ์Šคํฌ๋Ÿผ๋•Œ ์ง„ํ–‰ํ•˜๋˜ <์•ˆ๋ณด๊ณ  ๋žœ๋ค๋ฌธ์ œ ๋Œ€๋‹ตํ•˜๊ธฐ> ๋ฏธ๋‹ˆ ์„ธ์…˜์„ ์Šคํ„ฐ๋””๋กœ ๋งŒ๋“ค์–ด์„œ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค! ์ด๋ฆ„ํ•˜์•ผ "๐Ÿ์ฒญ๊ณ„์ฒœ๋“œ๋ž˜๊ณค ๋ฉด์Šค" ๋งค์ผ 30๋ถ„์”ฉ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ๊ณ , ๋ณต๊ธฐํ•˜๋Š” ๋ฐ์— ํฐ ๋„์›€์ด ๋  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€๋œ๋‹ค.

๋งค๋‹ˆ์ € ๋ฐ์ด์ง€, ์ œ์ด์™€์˜ ๋ฉด๋‹ด์„ ํ•˜๋ฉด์„œ ํ”ผ์–ด๋ฆฌ๋ทฐ๋„ ๋ณด๊ณ  ์ „๋ฐ˜์ ์ธ ์ง€๊ธˆ๊นŒ์ง€์˜ ํ˜•ํƒœ๋ฅผ ๋ณด์•˜์„ ๋•Œ ๊ฐ€์žฅ ๋ถ„์œ„๊ธฐ๊ฐ€ ์ข‹์€ ํŒ€์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ํ‰์„ ๋ฐ›์•˜๋‹ค! ๋„ˆ๋ฌด ๊ธฐ๋ปค๊ณ , ์•„์‰ฌ์›€๋„ ์ปธ๋‹คใ…Žใ…Ž..

๋‹ค์Œ์— ๋„ท์ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋Š” ๋‚ ์ด ์˜ค๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ..(์•„๋‹˜ ์šฐ๋ฆฌ๋ผ๋ฆฌ ์‚ฌ์ด๋“œ ํ”Œ์ ?ใ…Žใ…Ž)

part1, ์žฌ๋ฏธ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!๐Ÿ˜Š

์˜ค๋Š˜์˜ ๋‚˜๋Š” ๋ฌด์—‡์„ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์› ๋‚˜์š”?

[1] ๊ธฐ๋ณธ ์ž๋ฃŒ๊ตฌ์กฐ - ํ•ด์‹œ ํ•จ์ˆ˜

Direct Access Table

  • ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ key๋กœ ์ด์šฉํ•ด ์›ํ•˜๋Š” ๊ฐ’์„ O(1) ์ €์žฅํ•˜๊ณ , ์ ‘๊ทผํ•˜์—ฌ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๋ฐฉ์‹
    • ํšจ์œจ์ ์œผ๋กœ key-value๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์ž์นซ ๊ณต๊ฐ„์„ ๊ณผ๋„ํ•˜๊ฒŒ ๋‚ญ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค.

#

ํ•ด์‹œ ํ…Œ์ด๋ธ”

ํ‚ค(key)๋ฅผ ๊ฐ’(value)์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ‚ค๊ฐ€ 0 ๋˜๋Š” 1๊ฐœ์˜ ๊ฐ’๊ณผ ์—ฐ๊ด€๋จ

  • ์ฆ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์œ„์น˜= ์ธ๋ฑ์Šค
  • ํ•ด์‹œ ๋ฒ„ํ‚ท(hash bucket)์ด๋ผ๋Š” ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑ๋จ
    • ex) key 42, value ์—๋ฐ”, 5๊ฐœ์˜ ๋ฒ„ํ‚ท์ด ์žˆ์„ ๊ฒฝ์šฐ ๋‚˜๋จธ์ง€์—ฐ์‚ฐ(mod)๋ฅผ ์‚ฌ์šฉํ•ด 42%5 = ๋ฒ„ํ‚ท 2์— ๋งคํ•‘ํ•จ
      • ๋ฒ„ํ‚ท 2(๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค2)์˜ ๊ฐ’์—๋Š” 42, ์—๋ฐ” ๊ฐ€ ๋‹ด๊น€
      • ์ฆ‰ ํ•œ ์ธ๋ฑ์Šค์— ํ‚ค์™€ ๋ฐธ๋ฅ˜ ์Œ์„ ์ €์žฅํ•จ
      • ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ ๋“ฑ์„ ํ•˜๋Š” ๊ฒƒ์„ ํ•ด์‰ฌ ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.
  • ๋‘๊ฐœ์˜ ํ‚ค๊ฐ€ ๋™์ผํ•œ ๋ฒ„ํ‚ท์— ํ•ด์‹œ๋  ๋•Œ ํ•ด์‹œ ์ถฉ๋Œ (hash collision)
    • ๊ฐ ๋ฒ„ํ‚ท์— ๋Œ€ํ•ด ํ‚ค-๊ฐ’ ์Œ์˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ €์žฅํ•ด ์ฒ˜๋ฆฌ

ํ•ด์‹œํ…Œ์ด๋ธ” ์ •๋ฆฌ

  1. ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค
  2. ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ key๋ฅผ ์›ํ•˜๋Š” ๋ฒ”์œ„์˜ ์ž์—ฐ์ˆ˜๋กœ ๋ฐ”๊พผ๋‹ค.
  3. ํ•ด์‰ฌ ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๊ฐ’ ์ธ๋ฑ์Šค์— key-value ์Œ์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

ํ•ด์‰ฌ ํ•จ์ˆ˜

ํŠน์ • ๊ฐ’์„ ์›ํ•˜๋Š” ๋ฒ”์œ„์˜ ์ž์—ฐ์ˆ˜๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜

ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์กฐ๊ฑด๋“ค

  • ํ•œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํ•ด์‹œํ•จ์ˆ˜๋Š” ๊ฒฐ์ •๋ก ์ ์ด์–ด์•ผ ๋œ๋‹ค. (์ฆ‰ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผํ•œ๋‹ค)
  • ๊ฒฐ๊ณผ ํ•ด์‹œ๊ฐ’์ด ์น˜์šฐ์น˜์ง€ ์•Š๊ณ  ๊ณ ๋ฅด๊ฒŒ ๋‚˜์˜จ๋‹ค
  • ๋นจ๋ฆฌ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.
  1. ๋‚˜๋ˆ„๊ธฐ ๋ฐฉ๋ฒ• (MOD ์‚ฌ์šฉ)

    • ์ž์—ฐ์ˆ˜ key๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
  2. ๊ณฑ์…ˆ ๋ฐฉ๋ฒ•

    • 0 โ‰ค a โ‰ค 1 ์ธ a๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค,
    • a๋ฅผ key์— ๊ณฑํ•œ ํ›„ ์ •์ˆ˜๋ถ€๋ถ„์„ ๋ฒ„๋ฆฌ๊ณ  ์†Œ์ˆ˜ ๋ถ€๋ถ„๋งŒ ๋‚จ๊ธด๋‹ค.
    • ์†Œ์ˆ˜ ๋ถ€๋ถ„์— ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ๊ณฑํ•ด์ค€ ํ›„ ์†Œ์ˆ˜์ ์„ ๋ฒ„๋ฆฌ๊ณ  ์ •์ˆ˜ ๋ถ€๋ถ„์„ ๋‚จ๊ธด๋‹ค. ์ด ์ •์ˆ˜๊ฐ€ ํ•ด์‹œ๊ฐ’์ด ๋œ๋‹ค.

    โ†’ ํ•ญ์ƒ 0๋ณด๋‹ค๋Š” ํฌ๊ณ  ํ…Œ์ด๋ธ” ํฌ๊ธฐ๋ณด๋‹ค๋Š” ์ž‘์€ ํ•ด์‹œ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

ํŒŒ์ด์ฌ์˜ hash ํ•จ์ˆ˜

๋‚ด๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค. ํŒŒ์ด์ฌ์˜ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๊ฐ’์„ ์•„๋ฌด ์ •์ˆ˜๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜.

  • hash("ํŒŒ์ด์ฌ")
  • ํŒŒ์ด์ฌ hash ํ•จ์ˆ˜๋Š” ์–ธ์–ด ์ž์ฒด์ ์œผ๋กœ ๋ถˆ๋ณ€ ํƒ€์ž… ์ž๋ฃŒํ˜•์—๋งŒ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค
    • ๋ถˆ๋ฆฐ, ์ •์ˆ˜, ์†Œ์ˆ˜, ํŠœํ”Œ, ๋ฌธ์ž์—ด

ํ•ด์‹œ ์ถฉ๋Œ

์ถฉ๋Œ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์€ ํ•ด์‹œ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•˜๋ฉฐ, ์ถฉ๋Œ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์„ฑ๋Šฅ์ด ๊ฒฐ์ •๋œ๋‹ค.

  1. Chaining

    ๋ฐฐ์—ด ์ธ๋ฑ์Šค์— ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ ์ €์žฅํ•ด์„œ ์ถฉ๋Œ ํ•ด๊ฒฐ

    • ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ๋ชจ๋‘ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)
      • ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๋”ฐ์ง€๋ฉด O(1)
    • ์‚ฝ์ž… ์‹œ, ๊ฐ™์€ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์œผ๋ฉด ์ƒˆ๋กœ์šด ๋ฐธ๋ฅ˜๋กœ ๋ณ€๊ฒฝํ•จ. ์‚ญ์ œ ์‹œ, key๋ฅผ ์ด์šฉํ•ด์„œ ํƒ์ƒ‰ ํ›„ key-value ์Œ์„ ์‚ญ์ œํ•จ.
  2. Open Addressing

    • ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ ๋‹ค๋ฅธ ๋น„์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ๋น„์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•?
      1. ์„ ํ˜• ํƒ์‚ฌ(lindear probing)
        • ์ถฉ๋Œ์ด ์ผ์–ด๋‚ฌ์„ ๋•Œ ๋‹ค์Œ ์ธ๋ฑ์Šค๋กœ ์ด๋™ํ•˜๋ฉด์„œ ๋น„์—ˆ๋Š”์ง€ ํƒ์ƒ‰
      2. ์ œ๊ณฑ ํƒ์‚ฌ (Quadratic Probing)
        • 1์˜ ์ œ๊ณฑ, 2์˜ ์ œ๊ณฑ, 3์˜ ์ œ๊ณฑ โ€ฆ~~ ์”ฉ ์ด๋™ํ•˜๋ฉด์„œ ๋น„์–ด์žˆ๋Š”์ง€ ํƒ์ƒ‰
    • ํƒ์‚ฌ๋ฅผ ํ•˜๋‹ค ์œ ์˜ํ•  ์ 
      • ํƒ์ƒ‰์„ ํ•˜๋‹ค ๋น„์–ด์žˆ๋Š” ์ธ๋ฑ์Šค๋ฅผ (์ตœ์ดˆ๋กœ) ์ฐพ์œผ๋ฉด key์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป! (์™œ๋ƒ๋ฉด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ตœ์ดˆ์— ๋นˆ ์ธ๋ฑ์Šค๋Š” ๋‚˜์˜ฌ ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ)
      • ๋”ฐ๋ผ์„œ ์‚ญ์ œ๋ฅผ ํ•  ๊ฒฝ์šฐ, ๋‹จ์ˆœ ์‚ญ์ œ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค!
        • ๋งŒ์•ฝ ํ•ด์‹œ๊ฐ’(=์ธ๋ฑ์Šค๊ฐ’)์ด 21๋กœ ๋‚˜์˜จ 4๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์„ ํ˜• ํƒ์‚ฌ ๋ฐฉ์‹์œผ๋กœ ์ €์žฅ๋˜๋ฉด 21, 22, 23, 24์— ์ €์žฅ๋œ๋‹ค.
        • ์ด๋•Œ 22์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” value๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์•„๋ฌด๋Ÿฐ ํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ์— 23์ธ๋ฑ์Šค์˜ ๊ฐ’์ด๋‚˜, 24์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ํƒ์ƒ‰ํ•  ๋•Œ ๋จผ์ € ๋น„์–ด์žˆ๋Š” 22์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ’๋“ค์ด ์—†๋‹ค๊ณ  ํŒ๋‹จ๋œ๋‹ค.
        • ๋”ฐ๋ผ์„œ ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ์˜ ์ธ๋ฑ์Šค์—๋Š” DELELTED ๋“ฑ์˜ ์•ฝ์†๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ €์žฅํ•ด๋‘”๋‹ค.
    • ํƒ์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ ๋ชจ๋‘ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n)
      • ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๋”ฐ์ง€๋ฉด O(1)
      • load factor = ๋ฐ์ดํ„ฐ ์Œ์ˆ˜ / ํ•ด์‹œํ…Œ์ด๋ธ” ํฌ๊ธฐ
        • ํƒ์‚ฌ ์—ฐ์‚ฐ์˜ ๊ธฐ๋Œ€์‹œ๊ฐ„์€ ๊ธฐ๋Œ€๊ฐ’ : 1/ (1-load factor) ๋ณด๋‹ค ์ž‘๋‹ค.

[2] useState ๋ฝ€๊ฐœ๊ธฐ

๋น„๋™๊ธฐ๋กœ State๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 

setState ํ˜ธ์ถœ์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, state ๋ณ€์ˆ˜๊ฐ€ ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

  • React์—์„œ useState hook์€ state ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

WHY?

ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ์˜ lexical environment์—์„œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„์—๋„ ์‚ด์•„์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” Closure์˜ ํŠน์ง•์„ ์ด์šฉํ•œ๋‹ค.

JavaScript์—์„œ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ƒ์„ฑ๋œ ํ™˜๊ฒฝ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ๋‹ค. ์ด ํ™˜๊ฒฝ ์ •๋ณด๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

const [count, setCount] = useState(0);

useEffect(() => {
  console.log(`The count is ${count}`);
}, [count]);

useEffect hook์€ count๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, count๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์•ˆ useEffect hook์ด ์‹คํ–‰๋  ๋•Œ count ๋ณ€์ˆ˜๋Š” ์ด์ „ lexical environment์—์„œ ์ฐธ์กฐ๋œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” useState hook์ด setCount ํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • setterํ•จ์ˆ˜์— ๊ฐ’์ด ์•„๋‹ˆ๋ผ callback์„ ์ „๋‹ฌํ•ด์„œ ํ•ด๊ฒฐ - ์ฆ‰ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ

์ด์ „ ์ƒํƒœ๊ฐ’์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•ด ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

if (options.offset === 0) {
      setItems(reviews);
    } else {
      setItems((prevItems) => [...prevItems, ...reviews]);
    }
  • offset๊ฐ’์ด 0์ด ์•„๋‹ ๋•Œ ๊ธฐ์กด items ๋ฐฐ์—ด๊ณผ ์ƒˆ๋กœ ๋ฐ›์•„์˜จ reviews๋ฐฐ์—ด์„ ํ•ฉ์ณ์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“  ๋‹ค์Œ, ๊ทธ ๋ฐฐ์—ด์„ setItems๋ฅผ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด items state ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
    • ์ด๋•Œ setItmes ํ•จ์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ์•„๊ทœ๋จผํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š”๋ฐ (=์ฆ‰ ์ฝœ๋ฐฑ) ์ด์ „ items ๋ฐฐ์—ด ๊ฐ’์„ ์ด์šฉํ•ด์„œ ์ƒˆ๋กœ์šด items ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์•ผํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
    • ํ•จ์ˆ˜๋ฅผ ์•„๊ทœ๋จผํŠธ๋กœ ์ „๋‹ฌํ•˜๋ฉด (์ฝœ๋ฐฑ์„ ๋„ฃ์œผ๋ฉด) React๋Š” ์ด์ „ items ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์•„๊ทœ๋จผํŠธ๋กœ ์ „๋‹ฌํ•˜๊ณ , ์ƒˆ๋กœ์šด state ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์™œ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ด์ „ ์ƒํƒœ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ์ง€?

  • ์ถ”ํ›„ ํฌ์ŠคํŒ… ์˜ˆ์ •

์ฝœ๋ฐฑ์œผ๋กœ ์ดˆ๊ธฐ๊ฐ’ ์ง€์ •ํ•˜๊ธฐ

const [state, setState] = useState(() => {
	return initialState;
});

์ฒ˜์Œ ๋ Œ๋”๋ง ํ•  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•ด์„œ ์ดˆ๊นƒ๊ฐ’์„ ๋งŒ๋“ค๊ณ , ์ดํ›„ ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ฃผ์˜ํ•  ์  : ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ดํ•  ๋•Œ ๊นŒ์ง€ ๋ฆฌ์•กํŠธ๊ฐ€ ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

Setter ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด ๊ฐ™์€ ์ฐธ์กฐํ˜•์€ ๋ฐ˜๋“œ์‹œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“ค์–ด์„œ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

์ฐธ์กฐํ˜• State ์‚ฌ์šฉ์˜ ์ž˜๋ชป๋œ ์˜ˆ

const [state, setState] = useState({ count: 0 });

const handleAddClick = () => {
  state.count += 1; // ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆ˜์ •
  setState(state); // ์ฐธ์กฐํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์˜ ๊ฐ’(๋ ˆํผ๋Ÿฐ์Šค)๋Š” ๋ณ€ํ•˜์ง€ ์•Š์Œ
}

์ฐธ์กฐํ˜• State ์‚ฌ์šฉ์˜ ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ

const [state, setState] = useState({ count: 0 });

const handleAddClick = () => {
  setState({ ...state, count: state.count + 1 }); // ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
}

[3] React useEffect Hook์˜ Life Cycle์™€ Clean-up

๊ณต๋ถ€ํ•˜๋ฉด์„œ ์–ด๋–ค ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‚˜์š”?

useState์˜ setter์— ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ๊ฒฝ์šฐ ์™œ ์ด์ „ ์ƒํƒœ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ์ง€?

์‚ฌ์‹ค ์ด ๋‚ด์šฉ์€ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ ํ—จ๋ฆฌ(+์ผ€๋‹ˆ)์™€ ํ•จ๊ป˜ ์•ฝ 4์‹œ๊ฐ„ ๋™์•ˆ๐Ÿ˜ญ github ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ–ˆ์ง€๋งŒ ์•„์ง ์ •๋ฆฌ๊ฐ€ ์™„์„ฑ์ด ์•ˆ๋˜์—ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด,
ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „ ์ƒํƒœ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.

  • ์ด์ „ ์ƒํƒœ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ์ด์œ ๋Š”, React์—์„œ ์ƒํƒœ๊ฐ’์ด ์—…๋ฐ์ดํŠธ๋  ๋•Œ "๋™์‹œ์„ฑ ์ด์Šˆ"๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ!

React์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, setState() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์ด๋ฏธ ์ด์ „ ๊ฐ’์ด ์ƒˆ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— setState() ํ•จ์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ด์ „ ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›์•„์™€์„œ ์ƒˆ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ count ๊ฐ’์ด 0์—์„œ 1๋กœ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณธ๋‹ค๋ฉด,

setCount(count + 1);
setCount(count + 1);

์ด ์ฝ”๋“œ๋Š” count ๊ฐ’์ด 2๊ฐ€ ์•„๋‹ˆ๋ผ 1์ด ๋œ๋‹ค.. ์™œ๋ƒํ•˜๋ฉด ๋‘๋ฒˆ์งธ setCount() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ count ๊ฐ’์€ ์ด๋ฏธ 1๋กœ ์—…๋ฐ์ดํŠธ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

setCount(prevCount => prevCount + 1);
setCount(prevCount => prevCount + 1);

์ฒซ ๋ฒˆ์งธ setCount() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ์ด์ „ ๊ฐ’์ธ 0์ด prevCount ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ „ ๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ +1์ด ๋˜์–ด count ๊ฐ’์ด 1์ด ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ setCount() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด์ „ ๊ฐ’ 1์ด prevCount ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜์–ด count ๊ฐ’์ด 2๊ฐ€ ๋œ๋‹ค.

์ฆ‰, ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „ ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›์•„์™€์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๋ถ€ ๋™์ž‘์— ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๊ธธ๋ž˜?

์ด ์ ์ด ๊ถ๊ธˆํ•ด์„œ ์‚ฝ์งˆ์„ ์˜ค๋ž˜ํ–ˆ๋‹ค. ๋„์ €ํžˆ ์ดํ•ด๊ฐ€ ์•ˆ๋๋Š”๋ฐ, ์ผ€๋‹ˆ์˜ ์„ค๋ช…์— ํž˜์„ ๋ฐ›์•„ ๋” ํƒ๊ตฌํ•ด๋ณด๊ณ  ๋“œ๋””์–ด ์ดํ•ดํ–ˆ๋‹ค! ์ด๊ฒƒ์€ state๊ฐ€ ์ €์žฅ๋˜๋Š” Queue๋ฅผ ๋ถ„์„ํ•˜๋ฉด ์•Œ์ˆ˜ ์žˆ์—ˆ๋‹ค. (github์— useState์— ๊ด€๋ จ๋œ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์ €๊ธฐ ํฉ์–ด์ ธ์žˆ์–ด์„œ ํž˜๋“ค์—ˆ๋‹ค.. ๊ณต์‹๋ฌธ์„œ์—๋„ ์งง๊ฒŒ ์–ธ๊ธ‰๋˜์–ด์žˆ๊ธด ํ•œ๋“ฏ?!)

์ถ”ํ›„ ํฌ์ŠคํŒ…์œผ๋กœ ์ •๋ฆฌํ•ด์„œ ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๊ณ ์ž ํ•œ๋‹ค!

์ด์ „์— ๋“ฑ๋ก๋œ clean-up ํ•จ์ˆ˜๋ผ๋Š” ๋ง์ด ๋ญ์•ผ?

์ด์ „์— ๋“ฑ๋ก๋œ.. ์ด๋ผ๋Š” ๋ง์ด ๊ต‰์žฅ์ด ์ƒ์†Œํ–ˆ๋‹ค. ๋„๋Œ€์ฒด ์–ด๋””์„œ ๋“ฑ๋ก์ด ๋˜์–ด์„œ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€, ๋‹ค์Œ update๋•Œ ์‹คํ–‰์ด ๋˜๋Š”๊ฑฐ์ง€?

๊ทธ์— ๋Œ€ํ•ด ํƒ๊ตฌํ•ด๋ณธ ๊ฒฐ๊ณผ(๋ผ๊ณ  ์“ฐ๋ฉฐ ์‹œ๊ฐ„ ๊ฐˆ์•„๋„ฃ๊ธฐ๋ผ๊ณ  ๋งํ•œ๋‹ค)

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, useEffect์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ dependency array์— ๋”ฐ๋ผ, ์ด์ „ ๋ Œ๋”๋ง์—์„œ ๋“ฑ๋ก๋œ clean-up ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, clean-up ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋ Œ๋”๋ง์—์„œ ์‹คํ–‰๋œ useEffect ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. ์ด์ „ ๋ Œ๋”๋ง์—์„œ ๋“ฑ๋ก๋œ clean-up ํ•จ์ˆ˜๋Š”, ์ด์ „ ๋ Œ๋”๋ง์—์„œ ์‹คํ–‰๋œ useEffect ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ!๋Ÿฌ!๋‹ˆ!๊นŒ!
clean-upํ•จ์ˆ˜๋Š” ํด๋กœ์ €์ธ ๊ฒƒ์ด๋‹ค.
useEffect ๋‚ด๋ถ€์—์„œ cleanup ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด ์ด ํ•จ์ˆ˜๋Š” useEffect๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ์˜ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ํด๋กœ์ €๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ cleanup ํ•จ์ˆ˜์—์„œ ์ด์ „ ๋ Œ๋”๋ง์—์„œ ์ƒ์„ฑ๋œ ๋ฆฌ์†Œ์Šค๋“ค์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ useEffect ํ•จ์ˆ˜๊ฐ€ ์ด์ „ ๋ Œ๋”๋ง์—์„œ ๋ฐ˜ํ™˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ด๋•Œ cleanup ํ•จ์ˆ˜๋Š” ์ด์ „ ๋ Œ๋”๋ง์—์„œ์˜ ๊ฐ’๋“ค์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ํด๋กœ์ € ๊ฐœ๋…์ด ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋‚ด์ผ์˜ ๋‚˜๋Š” ๋ฌด์—‡์„ ๊ณต๋ถ€ํ•ด์•ผ ํ• ๊นŒ์š”?

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ 1๊ฐ•
  • ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ์— ๊ด€ํ•œ ํฌ์ŠคํŒ… ์˜ฌ๋ฆฌ๊ธฐ
  • ํ”ผ์–ด ์ฝ”๋“œ๋ฆฌ๋ทฐ
  • ๋ฆฌ์•กํŠธ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ ์™„๊ฐ•!!

0๊ฐœ์˜ ๋Œ“๊ธ€