๐Ÿ“•[์ฑ…] ์™์™ ๋“ค์–ด์˜ค๋Š” ํ•จ์ˆ˜ํ˜• ์ฝ”๋”ฉ

์ด๊ฐ•์šฑยท2023๋…„ 3์›” 13์ผ
0

๐Ÿ“•์ฑ…

๋ชฉ๋ก ๋ณด๊ธฐ
1/3
post-thumbnail

์ฒซ๋‚  ๋‹ค์ง

์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์‹ค์šฉ ์ค‘์‹ฌ ์•ˆ๋‚ด์„œ. ๋„ˆ๋ฌด ์–ด๋ ค์šด ์ด๋ก  (lambda calculus) ๋˜๋Š” ๋„ˆ๋ฌด ๋‹จ์ˆœํ•œ ์„ ์–ธ ("side effect๋ฅผ ์—†์• ๋ผ!!!")์„ ์ œ์ณ๋‘๊ณ , ์‹ค์ƒํ™œ์˜ ์˜ˆ์‹œ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘. ์ข…๊ตญ์—๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‹ค์šฉ์ ์ธ ๋Œ€์•ˆ์œผ๋กœ ์„ ํƒํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ.

์ถ”์ฒœ์‚ฌ์— ๋‹ด๊ธด ์ •๋ฆฌ

structured programming - organizing control flow
์Šฌ๋กœ๊ฑด : 'go to๋ฅผ ์—†์• ์ž'
๋ชฉํ‘œ : ํ๋ฆ„ ์ œ์–ด๋ฅผ ๋‹จ์ˆœํ•œ ํŒจํ„ด์œผ๋กœ ๋งŒ๋“ค์ž.(if-then-else, switch, for, while)
โฌ‡๏ธ
object-oriented programming - organizing access to data
์Šฌ๋กœ๊ฑด : '์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์—†์• ์ž'
๋ชฉํ‘œ : ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜์ž. (์บก์Šํ™”, ์ƒ์†)
โฌ‡๏ธ
functional programming - organizing side effect
์Šฌ๋กœ๊ฑด : '๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์—†์• ์ž'
๋ชฉํ‘œ : ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•ด ์ฝ”๋“œ์˜ ์•„๋ฌด ๊ณณ์—๋‚˜ ์žˆ์ง€ ์•Š๋„๋ก ํ•˜์ž.

๋…์„œ ์ „๋žต

  • side effect๋ฅผ ์™œ ์—†์• ์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ถ๊ธˆํ•ด ํ•˜๋ฉด์„œ ์ฝ์–ด์•ผ๊ฒ ๋‹ค.
  • ์˜ˆ์ œ ๋ฌธ์ œ๋ฅผ ๊ผญ ํ’€์–ด๋ด์•ผ๊ฒ ๋‹ค.
  • ๋…์„œ ์ผ์ง€๋Š” ๋ธ”๋กœ๊ทธ์— ๋‚จ๊ฒจ์•ผ๊ฒ ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ ๊นƒํ—ˆ๋ธŒ ๋งํฌ ๐Ÿ‘‰ https://github.com/ericnormand/grokking-simplicity-code

๋‹ค์ง

์ •๊ธ€ ๋™๊ธฐ ํ˜• ์ค‘์— ์ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋ฏธ์นœ(?) ์‚ฌ๋žŒ์ด ํ•œ๋ช… ์žˆ์–ด์„œ ์—ฌ๋Ÿฌ๋ฒˆ ์ด์•ผ๊ธฐ๋Š” ๋“ค์—ˆ์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ๋นจ๋ฆฌ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋งŒ๋‚˜๊ฒŒ ๋  ์ค„ ๋ชฐ๋ž๋‹ค. ๋‹น์‹œ์—๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ฌด์Šจ ์œ ๋ฌผ๋ก ๊ณผ ๊ด€๋…๋ก ์ฒ˜๋Ÿผ ์ฒ ํ•™์ ์ธ ๋…ผ์Ÿ์ธ์ค„๋งŒ ์•Œ์•˜๋Š”๋ฐ, ์‹ค์žฌ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ธฐ๋Œ€๊ฐ€ ๋œ๋‹ค. ์ž…์‚ฌ ์ดˆ๊ธฐ์— ํ•  ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์•„ ๊ฑฑ์ •์ด ๋˜์ง€๋งŒ ๋ถ€๋”” ๋ฌด์‚ฌํžˆ ์™„์ฃผํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ์š”, ๋ชฉ์ 

<์š”์•ฝ>

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ •์˜ -> ํ•จ์ˆ˜ํ˜• ์‚ฌ๊ณ 

์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ •์˜๋Š” ์‹ค์šฉ์ ์ธ ์ธก๋ฉด์—์„œ ๋ฌธ์ œ์ ์„ ๊ฐ–๋Š”๋‹ค. ์‚ฌ์‹ค ๋ถ€์ˆ˜ ํšจ๊ณผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ด์œ ์ด๋‹ค. ํ•„์š”ํ•  ๋•Œ๋Š” ์จ์•ผํ•œ๋‹ค. ๋‹ค๋งŒ, ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๊ฒฐ๊ตญ ์ด ์ฑ…์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ •์˜๊ฐ€ ์•„๋‹Œ, 'ํ•จ์ˆ˜ํ˜• ์‚ฌ๊ณ '์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.
ํ•จ์ˆ˜ํ˜• ์‚ฌ๊ณ ์—๋Š” ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด ์žˆ๋‹ค.

  1. ์•ก์…˜, ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ
    • ๊ณ„์ธตํ˜• ์„ค๊ณ„ (stratified design)
  2. ์ผ๊ธ‰ ์ถ”์ƒ
    • ํƒ€์ž„๋ผ์ธ ๋‹ค์ด์–ด๊ทธ๋žจ, ์ผ๊ธ‰ ํ•จ์ˆ˜(first-class function)

์•ก์…˜ / ๊ณ„์‚ฐ / ๋ฐ์ดํ„ฐ

  • ์•ก์…˜์€ ์‹œ๊ฐ„์— ์˜์กด. ์‚ฌ์šฉํ•˜๊ธฐ ๊ฐ€์žฅ ์–ด๋ ต๋‹ค. ์•ก์…˜์—์„œ ์‹œ๊ฐ„์— ์˜์กดํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•˜๋ฉด ์ข€ ๋” ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๋‹ค.
  • ๊ณ„์‚ฐ์€ ์‹œ๊ฐ„์— ์˜์กด์ ์ด์ง€ ์•Š์Œ. ๋‹ค๋ฃจ๊ธฐ ์‰ฌ์›Œ์„œ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์ข‹์Œ.
  • ๋ฐ์ดํ„ฐ๋Š” ์ •์ ์ด๋‹ค. ํ•ด์„์ด ํ•„์š”ํ•˜๋‹ค. ์ €์žฅ, ์ „์†ก, ์ดํ•ด๊ฐ€ ํŽธํ•จ.

์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์œ„ํ•˜์—ฌ

์ฝ”๋“œ๋Š” ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ• ์ˆ˜๋ก ์ข‹๋‹ค. ์‚ฌ์—…์ด๋ž€๊ฒŒ ๊ทธ๋ž˜์„œ ๊ทธ๋Ÿฐ๋“ฏ.

๊ณ„์ธตํ˜• ์„ค๊ณ„ : ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์€ ์ฝ”๋“œ (๋ณ€๊ฒฝ ๋น„์šฉ์ด ๋‚ฎ์€ ์ฝ”๋“œ)๋ฅผ ์œ„ํ•ด, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ. ์ฃผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™, ๋„๋ฉ”์ธ ๊ทœ์น™, ๊ธฐ์ˆ  ์Šคํƒ ๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ์œ„ํ•˜์—ฌ

์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ๋ณต์žกํ•œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•„์š”ํ•ด์ง. ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•  ๋ฉ”์‹œ์ง€๋Š” ์ˆœ์„œ๊ฐ€ ์„ž์ด๊ฑฐ๋‚˜, ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ์œ ์‹ค๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์ ์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์•ก์…˜์„ ์ž˜ ๊ด€๋ฆฌํ•˜๊ณ , ๋˜๋„๋ก ๋ฐ์ดํ„ฐ์™€ ๊ณ„์‚ฐ์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค.

ํƒ€์ž„๋ผ์ธ ๋‹ค์ด์–ด๊ทธ๋žจ : ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ์•ก์…˜์„ ์‹œ๊ฐํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•. ์•ก์…˜์ด ๋‹ค๋ฅธ ์•ก์…˜๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ ๋˜๋Š”์ง€ (์–ด๋–ค ์ˆœ์„œ๋ฅผ ์ง€๋‹ˆ๋Š” ์ง€) ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ, ์ปคํŒ…์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํƒ€์ž„๋ผ์ธ์˜ ์‹œ๊ฐ„์„ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค.

<๋ฐœ์ทŒ>

์‹คํ–‰ ์‹œ์ ์ด๋‚˜ ํšŸ์ˆ˜์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์—†์• ๋ฉด, ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ  ์‹ฌ๊ฐํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ.

๊ณ„์‚ฐ์€ ์–ด๋–ค ๊ฒƒ์„ ๊ฒฐ์ •ํ•˜๊ฑฐ๋‚˜ ๊ณ„ํšํ•˜๋Š” ๊ฒƒ.

์•ก์…˜, ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ ๋ผ๋Š” ๊ด€์ ์—์„œ ๋ดค์„ ๋•Œ.
<๋ฉ”๋ชจ>

๋ถ€์ˆ˜ ํšจ๊ณผ (side effect) : ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ด๊ฐ’ ์ด์™ธ์— ํ•˜๋Š” ๋ชจ๋“  ์ผ.
์ˆœ์ˆ˜ ํ•จ์ˆ˜ (pure function) : ์ธ์ž์—๋งŒ ์˜์กดํ•˜๊ณ  (๊ฐ™์€ ์ธ์ž๋ฉด ๊ฐ™์€ ๊ฒฐ๊ณผ), ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜.

์•ก์…˜, ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ

<์š”์•ฝ>
์•ก์…˜, ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ƒ ๋˜๋Š” ์ƒˆ๋กญ๊ฒŒ ์งœ๋Š” ์ฝ”๋“œ์— ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณด๊ธฐ.

๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์„œ ์ ์šฉํ•˜๋ฉด, ๋Œ€๋ถ€๋ถ„ ์•ก์…˜์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
์•ก์…˜ ์•ˆ์—์„œ '๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”' ๊ณ„์‚ฐ๊ณผ,
๊ทธ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋‚ด ๋ถ„๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

ํžŒํŠธ๋Š” ๋ฌด์—‡์ธ๊ฐ€ ๊ฒฐ์ •ํ•˜๊ฑฐ๋‚˜ ๊ณ„ํšํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋œ๋‹ค.
๊ฒฐ์ •๊ณผ ๊ณ„ํš์€ ๊ณ„์‚ฐ์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

<๋ฐœ์ทŒ>

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์•ก์…˜์„ ๋” ์ž‘์€ ์•ก์…˜๊ณผ ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ๋กœ ๋‚˜๋ˆ„๊ณ 
๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ์–ธ์ œ ๋ฉˆ์ถฐ์•ผ ํ•  ์ง€ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ์‹œ์ ์—์„œ ๋” ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ๋ฉˆ์ถ”๊ธฐ.

๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๊ตฌํ˜„ํ•˜๊ณ , ๊ณ„์‚ฐ์„ ๊ตฌํ˜„ํ•œ ํ›„์—, ๋งˆ์ง€๋ง‰์œผ๋กœ ์•ก์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด
ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ž‘์„ฑ์˜ ์ˆœ์„œ
<๋ฉ”๋ชจ>

๋ฐ์ดํ„ฐ

  • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์‚ฌ์‹ค. ์ผ์–ด๋‚œ ์ผ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ•œ ๊ฒƒ.
  • ๋ถˆ๋ณ€์„ฑ
    • copy-on-write
    • ๋ฐฉ์–ด์  ๋ณต์‚ฌ
  • ์žฅ์ 
    (๋ฐ์ดํ„ฐ ์ž์ฒด๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†๊ธฐ์— ์—ญ์„ค์ ์œผ๋กœ ์ข‹๋‹ค.)
    • ์ง๋ ฌํ™” : ์ „์†กํ•˜๊ฑฐ๋‚˜ ๋””์Šคํฌ์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์ฝ๊ธฐ ์‰ฌ์›€.
    • ๋™์ผ์„ฑ ๋น„๊ต
    • ์ž์œ ๋กœ์šด ํ•ด์„ : ์ ‘์† ๋กœ๊ทธ๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด์„œ๋„ ์“ฐ์ด๊ณ , ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด์„œ๋„ ์“ฐ์ธ๋‹ค.

๊ณ„์‚ฐ

  • ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ถœ๋ ฅ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ฒƒ. ์ˆœ์ˆ˜ ํ•จ์ˆ˜.
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋Œ€๋ถ€๋ถ„์€ ๊ณ„์‚ฐ์„ ๊ฐ€์ง€๊ณ  ํ•˜๋Š” ์ผ.
  • ์žฅ์ 
    "์•ก์…˜๋ณด๋‹จ ๊ณ„์‚ฐ"
    • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ๋‹ค.
    • ๊ธฐ๊ณ„์ ์ธ ๋ถ„์„์ด ์‰ฝ๋‹ค.
    • ์กฐํ•ฉํ•˜๊ธฐ ์‰ฝ๋‹ค. โžก๏ธ ์ผ๊ธ‰ ๊ณ„์‚ฐ

์•ก์…˜ ๊ฐœ์š”

<์š”์•ฝ>

๐Ÿ˜‡
์•ก์…˜์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋Š”, ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋“ค์„ ์•ก์…˜์œผ๋กœ ๋งŒ๋“ ๋‹ค.
์•ˆ์— ๋“ค์–ด์žˆ๋Š” ์•ก์…˜ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์ƒ์œ„์˜ ํ˜ธ์ถœ๋„ ํ˜ธ์ถœ ์‹œ์ ๊ณผ ํšŸ์ˆ˜์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ.

์•ก์…˜์€ ๋‹ค๋ฅธ๋ง๋กœ ์ˆœ์ˆ˜ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜, ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜.
์™ธ๋ถ€ ์„ธ๊ณ„์— ์˜ํ–ฅ์„ ์ฃผ๊ฑฐ๋‚˜ ๋ฐ›๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

๐Ÿ˜‡
in ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ,
๊ณ„์‚ฐ์€ ๊ณ„ํš์ด๋‚˜ ๊ฒฐ์ •์„ ํ•  ๋•Œ ์ ์šฉํ•˜๋Š” ๊ฒƒ.
๋ฐ์ดํ„ฐ๋Š” ๊ณ„ํšํ•˜๊ฑฐ๋‚˜ ๊ฒฐ์ •ํ•œ ๊ฒฐ๊ณผ.
์•ก์…˜์€ ๊ณ„์‚ฐ์œผ๋กœ ๋งŒ๋“  ๊ณ„ํš์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ.

๐Ÿ˜‡
ํ…Œ์ŠคํŠธ์™€ ์žฌ์‚ฌ์šฉ์„ฑ์€ ์ž…์ถœ๋ ฅ๊ณผ ๊ด€๋ จ์žˆ๋‹ค.

  • ํ•จ์ˆ˜์— ์•”๋ฌต์  ์ž…์ถœ๋ ฅ์ด ์žˆ์œผ๋ฉด ์•ก์…˜์ด ๋œ๋‹ค.
  • ํ•จ์ˆ˜์—์„œ ์•”๋ฌต์  ์ž…์ถœ๋ ฅ์„ ์—†์• ๋ฉด ๊ณ„์‚ฐ์ด ๋œ๋‹ค.

์•”๋ฌต์  ์ž…์ถœ๋ ฅ์ด ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ,

ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์–ด๋ ค์šด ์ด์œ  :

  • ๋ช…์‹œ์ ์ธ ์ž…๋ ฅ (์ธ์ž), ์ถœ๋ ฅ (๋ฐ˜ํ™˜๊ฐ’) ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,
    ์•”๋ฌต์  ์ž…๋ ฅ์„ ์ผ์ผ์ด ํ…Œ์ŠคํŠธ ์กฐ๊ฑด์œผ๋กœ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•˜๊ณ , ์•”๋ฌต์  ์ถœ๋ ฅ์„ ์ผ์ผ์ด ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ์ด์œ  :

  • ํ•จ์ˆ˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ์•”๋ฌต์  ์ž…๋ ฅ๋“ค์ด ๋‹ค๋ฅธ ์กฐ๊ฑด์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅ ํ•  ์ˆ˜ ์žˆ๊ณ ,
    ์‹คํ–‰์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋˜๋Š” ์•”๋ฌต์  ์ถœ๋ ฅ๋“ค์ด ์žฌ์‚ฌ์šฉ ์ƒํ™ฉ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ˜‡
๊ฒฐ๊ตญ ์•”๋ฌต์  ์ž…์ถœ๋ ฅ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„ , DOM ์— ๋Œ€ํ•œ ์˜ํ–ฅ๊ณผ ์˜์กด์„ ์ค„์—ฌ์•ผ ํ•œ๋‹ค.
<๋ฐœ์ทŒ>

์•ก์…˜์€ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“ญ๋‹ˆ๋‹ค.
์•ก์…˜์€ ์šฐ๋ฆฌ๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

<๋ฉ”๋ชจ>

์ฝ์œผ๋ฉด ์ฝ์„ ์ˆ˜๋ก ๋œฌ๊ตฌ๋ฆ„ ์žก๋Š” ์†Œ๋ฆฌ ๊ฐ™์œผ๋ฉด์„œ๋„, ๊ทธ๊ฑธ ์–ด๋–ป๊ฒŒ ์‹คํ˜„ํ•œ๋‹ค๋Š” ๊ฑด์ง€ ๊ถ๊ธˆํ•ด์ง„๋‹ค.

์•ก์…˜์—์„œ ๊ณ„์‚ฐ ๋นผ๋‚ด๊ธฐ

<์š”์•ฝ>

๐Ÿ˜‡
์•ก์…˜์—์„œ ๊ณ„์‚ฐ ๋นผ๋‚ด๊ธฐ

  1. ์„œ๋ธŒ ๋ฃจํ‹ด ์ถ”์ถœํ•˜๊ณ 
  2. ์•”๋ฌต์  ์ž…์ถœ๋ ฅ ์—†์• ๊ธฐ.
    • ์•”๋ฌต์  ์ž…๋ ฅ์€ ์ธ์ž๋กœ,
    • ์•”๋ฌต์  ์ถœ๋ ฅ์€ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ
// ์›๋ž˜ ์ฝ”๋“œ
function update_tax_dom() {
 	set_tax_dom(shopping_cart_total * 0.10); // shopping_cart_total์€ ์ „์—ญ๋ณ€์ˆ˜
}
// ์„œ๋ธŒ ๋ฃจํ‹ด ์ถ”์ถœ
function update_tax_dom() {
 	set_tax_dom(calc_tax()); 
}

function calc_tax() {
	return shopping_cart_total * 0.10;
}
// ์•”๋ฌต์  ์ž…๋ ฅ ์—†์• ๊ธฐ
function update_tax_dom() {
	set_tax_dom(calc_tax(shopping_cart_total)); 
}

function calc_tax(total) {
	return total * 0.10;
}
  • ์ž…๋ ฅ
    - ํ•จ์ˆ˜ ์ธ์ž
    - ํ•จ์ˆ˜ ๋ฐ– ๋ณ€์ˆ˜ ์ฝ๊ธฐ
    - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ

  • ์ถœ๋ ฅ
    - ํ•จ์ˆ˜ ๋ฆฌํ„ด๊ฐ’
    - ์ „์—ญ ๋ณ€์ˆ˜๊ฐ’ ๋ฐ”๊พธ๊ธฐ
    - ๊ณต์œ  ๊ฐ์ฒด ๋ฐ”๊พธ๊ธฐ
    - ์›น ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

๐Ÿ˜‡
์ด๋ฅผ ํ†ตํ•ด ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋™์‹œ์„ฑ, ์„ค๊ณ„, ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์ธก๋ฉด์—์„œ๋„ ์ข‹์€ ์ ์„ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

<๋ฐœ์ทŒ>

์–ด๋–ค ๊ฐ’์„ ๋ฐ”๊ฟ€ ๋•Œ ๊ทธ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์€ ๋ถˆ๋ณ€์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ copy-on-write ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

<๋ฉ”๋ชจ>

[์ƒ๊ฐํ•ด๋ณด๊ธฐ]

๋งŒ์•ฝ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ ๋ฐฐ์—ด์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด ๊ทธ ํ•จ์ˆ˜๋Š” ๊ณ„์‚ฐ์ผ๊นŒ์š”?
๊ณ„์‚ฐ์ด ์•„๋‹ˆ๋ผ๋ฉด ์™œ ์•„๋‹Œ๊ฐ€์š”?

A. ๊ณ„์‚ฐ์ด ์•„๋‹ ๊ฒƒ ๊ฐ™๋‹ค. ์ผ๋‹จ ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•  ๋•Œ ๊ฒฐ๊ตญ ํ•ด๋‹น ๋ฐฐ์—ด์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋„˜๊ธธ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•จ์ˆ˜ ์•ˆ์—์„œ ๊ทธ ๋ฐฐ์—ด์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ์ด ์•„๋‹ˆ๊ฒŒ ๋œ๋‹ค.

๋” ์ข‹์€ ์•ก์…˜ ๋งŒ๋“ค๊ธฐ

<์š”์•ฝ>

๐Ÿ˜‡
๋ชจ๋“  ์•ก์…˜์„ ์—†์•จ ์ˆœ ์—†๋‹ค. ์•ก์…˜์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์กด์žฌ ์ด์œ .
์•ก์…˜์—์„œ ๋” ์ด์ƒ ๋นผ๋‚ผ ๊ณ„์‚ฐ์ด ๋” ์—†์„ ๋•Œ์˜ ๊ฐœ์„  ๋ฐฉ๋ฒ•.

  • ์•”๋ฌต์  ์ž…์ถœ๋ ฅ ์ค„์ด๊ธฐ. ์ด๊ฒƒ์ด ๊ณง ๋ชจ๋“ˆํ™” -> ํ…Œ์ŠคํŠธ ์šฉ์ด, ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๋Œ€
  • ์˜๋ฏธ์žˆ๋Š” ๊ณ„์ธต์œผ๋กœ ๊ณ„์‚ฐ์„ ๋ถ„๋ฅ˜ํ•˜๊ธฐ.

๐Ÿ˜‡
์ตœ์ข…์ ์œผ๋กœ ์ฝ”๋“œ๋Š” ๊ตฌ๋ถ„๋œ ๊ทธ๋ฃน๊ณผ ๋ถ„๋ฆฌ๋œ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑํ•  ๊ฒƒ์ž„.
์ด๋ฅผ ์—ฐ์Šตํ•˜๊ธฐ ์œ„ํ•ด, ๊ณ„์‚ฐ์„ ๋‚˜๋ˆ„์–ด ๊ณ„์ธต์„ ๋งŒ๋“ค์–ด ๋ณธ๋‹ค.

  • cart์— ๋Œ€ํ•œ ๋™์ž‘ : cart์— ๋Œ€ํ•œ ๊ตฌ์กฐ๋ฅผ ์•Œ๊ณ  ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ. ์˜ˆ๋ฅผ ๋“ค์–ด cart ๊ตฌ์กฐ๋ฅผ ์•ˆ๋‹ค๋Š” ๊ฒƒ์€, ๊ทธ๊ฒƒ์ด ์ œํ’ˆ์„ ์›์†Œ๋กœ ๊ฐ€์ง€๋Š” ๋ฐฐ์—ด์ด๋ผ๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ.
  • item์— ๋Œ€ํ•œ ๋™์ž‘ : ๋งˆ์ฐฌ๊ฐ€์ง€
  • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ : ๋ฌด๋ฃŒ ๋ฐฐ์†ก์˜ ๊ธฐ์ค€, ์„ธ๊ธˆ ์ธก์ • ๋“ฑ๋“ฑ..
  • ๋ฐฐ์—ด ์œ ํ‹ธ๋ฆฌํ‹ฐ : ์ •๋ง ๋ฌธ๋ฒ•์ ์œผ๋กœ์„œ๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์กฐ๊ฐ ๊ฐ™์€ ๊ฒƒ. (๋ฐฐ์—ด์— ์›์†Œ ์ถ”๊ฐ€ํ•˜๊ธฐ)

<๋ฐœ์ทŒ>

copy-on-write

function add_item (cart, item) {
  var new_cart = cart.slice();	// copy
  new_cart.push(item);			// write
  
  return new_cart;
}

copy-on-write โžก๏ธ ๋ณต์‚ฌ์— ๋Œ€ํ•œ ๋น„์šฉ์ด ํฌ์ง€๋Š” ์•Š์„๊นŒ?

  • ๋ฐฐ์—ด์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๋ถ„๋ช… ๋น„์šฉ์ด ๋” ๋“ ๋‹ค. ํ•˜์ง€๋งŒ gc์˜ ๋„์›€์„ ์ถฉ๋ถ„ํžˆ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ๋•Œ ์–ป๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋งŽ์ด ์žˆ๋‹ค. ์ฑ…์„ ๋ณด๋ฉด์„œ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

<๋ฉ”๋ชจ>

๋” ์ฝ์–ด ๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.
๊ณ„์† ์ด๋Ÿฐ ๊ธฐ๋ถ„์ด ๋“ค๋‹ค๊ฐ€ ๋๋‚˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ๊ฑฑ์ •์ด ๋“ ๋‹ค.

๋ถˆ๋ณ€์„ฑ ์œ ์ง€ํ•˜๊ธฐ: copy-on-write (1)

<์š”์•ฝ>

๐Ÿ˜‡
๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฐ’์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด copy-on-write๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋ณต์‚ฌ๋ณธ ๋งŒ๋“ค๊ธฐ
  2. ๋ณต์‚ฌ๋ณธ ๋ณ€๊ฒฝํ•˜๊ธฐ (์›ํ•˜๋Š” ๋งŒํผ)
  3. ๋ณต์‚ฌ๋ณธ ๋ฆฌํ„ดํ•˜๊ธฐ

๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์€ ๊ณง ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ.
์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ํ•จ์ˆ˜์˜ ์™ธ๋ถ€์—์„œ ๋ดค์„ ๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. (์•”๋ฌต์  ์ž…๋ ฅ์ด ์—†๋‹ค๋ฉด) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๋Š” ๊ณ„์‚ฐ์ผ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

'์ฝ๊ธฐ'๋ผ๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ.

๐Ÿ˜‡
'์“ฐ๊ธฐ'๋งŒ ํ•˜๋Š” ๋™์ž‘์€ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ copy-on-write ์ ์šฉํ•˜๋ฉด ๋œ๋‹ค.
'์“ฐ๊ธฐ์™€ ์ฝ๊ธฐ'๋ฅผ ๋™์‹œ์— ํ•˜๋Š” ๋™์ž‘์€,

  • ์ฝ๊ธฐ ํ•˜๋Š” ํ•จ์ˆ˜, ์“ฐ๊ธฐ ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๊ฐ๊ฐ ๋ถ„๋ฆฌํ•œ ํ›„ ์“ฐ๊ธฐ๋ฅผ copy-on-write ์ ์šฉํ•˜๊ฑฐ๋‚˜, ๊ฐ’์„ ๋‘๊ฐœ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

<๋ฐœ์ทŒ>

copy-on-write ๋Š” ์“ฐ๊ธฐ๋ฅผ ์ฝ๊ธฐ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • ๋ฐฐ์—ด์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๋ถ„๋ช… ๋น„์šฉ์ด ๋” ๋“ ๋‹ค. ํ•˜์ง€๋งŒ gc์˜ ๋„์›€์„ ์ถฉ๋ถ„ํžˆ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ณต์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•  ๋•Œ ์–ป๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋งŽ์ด ์žˆ๋‹ค. ์ฑ…์„ ๋ณด๋ฉด์„œ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

<๋ฉ”๋ชจ>

  • ๊ฒฐ๊ตญ '๋ณ€๊ฒฝ๋œ ๋ณต์‚ฌ๋ณธ' ์„ ์›๋ณธ์— ํ• ๋‹นํ•˜๊ธฐ๋Š” ํ•œ๋‹ค.
    ๋‹ค๋งŒ ๋ณ€๊ฒฝ๋œ ๋ณต์‚ฌ๋ณธ์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€, '๊ณ„์‚ฐ'์œผ๋กœ์„œ ๊ทธ ํ•จ์ˆ˜ ์™ธ๋ถ€์™€์˜ ์˜ํ–ฅ์„ ์ „ํ˜€ ์ฃผ๊ณ  ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

  • ์“ฐ๊ธฐ๋Š” ์•ก์…˜, ์ฝ๊ธฐ๋Š” ๊ณ„์‚ฐ๊ณผ ๋ฐ์ดํ„ฐ์— ๊ฐ€๊น๋‹ค.

  • copy-on-write๋ฅผ ์ ์šฉํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด, ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ˆ˜ํ•˜๊ฒŒ '์ฝ์€' ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ถˆ๋ณ€์„ฑ ์œ ์ง€ํ•˜๊ธฐ: copy-on-write (2)

<์š”์•ฝ>

๐Ÿ˜‡
๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋ถ€ ๋ถˆ๋ณ€ํ˜•์ด๋ฉด ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ์ƒํƒœ (e.g. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํƒœ) ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‚˜?
-> ๊ทธ๋Ÿด ๋•Œ๋Š” '๊ต์ฒด(swapping)'๋ฅผ ํ•œ๋‹ค.

๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹น์—ฐํžˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ๋งŽ์ด ์“ฐ๊ณ  ๋” ๋Š๋ฆฌ๋‹ค.
ํ•˜์ง€๋งŒ,

  1. GC๋Š” ๋งค์šฐ ๋น ๋ฅด๊ณ , ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์ด ๋ณต์‚ฌ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์–•์€ ๋ณต์‚ฌ, ๊ตฌ์กฐ์  ๊ณต์œ 
  2. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ง€์›ํ•˜๋Š” ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
    • ์ง์ ‘ ๋งŒ๋“  ๊ฒƒ ๋ณด๋‹ค ํšจ์œจ์ . ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๊ตฌ์กฐ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ์ด ์—ญ์‹œ copy-on-write์— ๊ธฐ๋ฐ˜ํ•œ ๊ตฌํ˜„.
  3. ์–ธ์ œ๋“  ์ตœ์ ํ™” ํ•˜๋ฉด ๋œ๋‹ค.
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ๋ณ‘๋ชฉ ์ง€์ ์„ ํ•ญ์ƒ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ง€์ ์—์„œ ๋ฐœ์ƒ. ๋ฏธ๋ฆฌ ์ตœ์ ํ™” ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์ผ๋‹จ ๋งŒ๋“ค์–ด ๋†“๊ณ  ๋Š๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๋•Œ ์ตœ์ ํ™”.

๐Ÿ˜‡
๊ฐ์ฒด์— ๋Œ€ํ•œ copy-on-write
-> ๋ฐฐ์—ด๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹
1. ๋ณต์‚ฌ๋ณธ ๋งŒ๋“ค๊ธฐ 2. ๋ณต์‚ฌ๋ณธ ๋ณ€๊ฒฝํ•˜๊ธฐ 3. ๋ณต์‚ฌ๋ณธ ๋ฆฌํ„ดํ•˜๊ธฐ.

๋‹ค๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Object.assign() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

<๋ฐœ์ทŒ>

์–•์€ ๋ณต์‚ฌ (shallow copy)

์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์ตœ์ƒ์œ„ ๋ฐ์ดํ„ฐ๋งŒ ๋ณต์‚ฌ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ์ฒด๋ฅผ ์›์†Œ๋กœ ๊ฐ€์ง€๋Š” ๋ฐฐ์—ด์„ '์–•์€ ๋ณต์‚ฌ' ํ•˜๋ฉด, ๋ฐฐ์—ด๋งŒ ๋ณต์‚ฌํ•˜๊ณ  ์•ˆ์— ์žˆ๋Š” ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋กœ ๊ณต์œ .

๊ตฌ์กฐ์  ๊ณต์œ  (structural sharing)

๋‘ ๊ฐœ์˜ ์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์–ด๋–ค ์ฐธ์กฐ๋ฅผ ๊ณต์œ ํ•œ๋‹ค๋ฉด, '๊ตฌ์กฐ์  ๊ณต์œ ' ๋ผ๊ณ  ํ•œ๋‹ค.

<๋ฉ”๋ชจ>

  • ๊ตฌ์กฐ์  ๊ณต์œ ๋Š” ์ฐธ์กฐ๋ฅผ ๊ณต์œ ํ•˜๋Š”๋ฐ, ์ด ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์˜ ์œ„ํ—˜์€ ์—†์„๊นŒ?
    • ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํ•˜์—์„œ ๊ตฌ์กฐ์  ๊ณต์œ ๋Š” ์•ˆ์ „ํ•˜๋‹ค. ์–ด์ฐŒ ๋๋“  ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ง์ ‘ '์“ฐ๊ธฐ'๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
      ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ง€๋Š” ๋ฐฐ์—ด์„ ์–•์€ ๋ณต์‚ฌํ•˜์—ฌ ๊ตฌ์กฐ์  ๊ณต์œ ๋ฅผ ํ•œ ํ›„, ๋ณต์‚ฌ๋œ ๋ฐฐ์—ด์˜ ์›์†Œ ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด ๋•Œ๋„, ๊ทธ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋ณต์‚ฌํ•˜๊ณ  -> ๊ทธ ๋ณต์‚ฌ๋ณธ์„ ๋ณ€๊ฒฝํ•˜๊ณ  -> ๋ณ€๊ฒฝ๋œ ๋ณต์‚ฌ๋ณธ์„ ์›๋ž˜ ๊ฐ์ฒด์˜ ์ž๋ฆฌ์— ํ• ๋‹นํ•˜๋ฉด์„œ '๊ต์ฒด'ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์˜ ์œ„ํ—˜์ด ์—†๋‹ค.

๋ถˆ๋ณ€์„ฑ ์œ ์ง€ํ•˜๊ธฐ: ๋ฐฉ์–ด์  ๋ณต์‚ฌ

140p ~ 161p
<์š”์•ฝ>

๐Ÿ˜‡
์–•์€ ๋ณต์‚ฌ๋Š” ๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ๋ณต์‚ฌํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๊ณต์œ ํ•œ๋‹ค. ๊ตฌ์กฐ์  ๊ณต์œ .
๊ทธ๋ž˜์„œ ์–•์€ ๋ณต์‚ฌ๊ฐ€ ๊นŠ์€ ๋ณต์‚ฌ๋ณด๋‹ค ๋น„์šฉ์ด ๋œ ๋“ ๋‹ค.

๐Ÿ˜‡
๋ฐฉ์–ด์  ๋ณต์‚ฌ : ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์•„์•ผ ํ• ๋•Œ, ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

  1. ๋ฐ์ดํ„ฐ๊ฐ€ ์•ˆ์ „ํ•œ ์ฝ”๋“œ์—์„œ ๋‚˜๊ฐˆ ๋•Œ ๋ณต์‚ฌํ•˜๊ธฐ
    • ๊นŠ์€ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค๊ณ , ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ์— ์ „๋‹ฌ (ํ•จ์ˆ˜๋ฉด ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ)
  2. ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ ๋ณต์‚ฌํ•˜๊ธฐ
    • ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ์—์„œ ์˜จ (๋ฐ˜ํ™˜๋œ) ๋ฐ์ดํ„ฐ๋ฅผ ๊นŠ์€ ๋ณต์‚ฌํ•œ ํ›„, ์•ˆ์ „ํ•œ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ.

<๋ฐœ์ทŒ>

copy-on-write๋Š” ์–ด๋””์„œ ์“ฐ๋‚˜์š”?
-> ์•ˆ์ „์ง€๋Œ€ ์–ด๋””์„œ๋“ . ์‚ฌ์‹ค copy-on-write๊ฐ€ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง„ ์•ˆ์ „์ง€๋Œ€๋ฅผ ๋งŒ๋“ ๋‹ค.

๋น„๊ณต์œ  ์•„ํ‚คํ…์ฒ˜ (shared nothing architecture)

  • ๋ชจ๋“ˆ์ด ์„œ๋กœ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด, ์ด๋ฅผ ๋น„๊ณต์œ  ์•„ํ‚คํ…์ฒ˜ ๋ผ๊ณ  ํ•จ.
  • ์ด ๋ชจ๋“ˆ์€ ์–ด๋–ค ๋ฐ์ดํ„ฐ์˜ ์ฐธ์กฐ๋„ ์„œ๋กœ ๊ณต์œ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์Œ.
  • ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์›น๊ธฐ๋ฐ˜ API๊ฐ€ ์žˆ์Œ.

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต๋‹ค.

  • ์ฃผ๋กœ Lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (lodash.com)
    <๋ฉ”๋ชจ>
    ์ด๋ฒˆ์—” ๋”ฑํžˆ ์—†์Œ.

Straightforward Implementation

162p ~ 185p
<์š”์•ฝ>

๐Ÿ˜‡
๊ณ„์ธตํ˜• ์„ค๊ณ„

  • ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ์ˆ .
  • ๊ฐ ๊ณ„์ธต์— ์žˆ๋Š” ํ•จ์ˆ˜๋Š” ๋ฐ”๋กœ ์•„๋ž˜ ๊ณ„์ธต์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ •์˜ํ•œ๋‹ค.
  • ์„ค๊ณ„ ๊ฐ๊ฐ์„ ํ‚ค์šฐ๋Š” ์ผ์€, ๊ฒฐ๊ตญ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ณ ์น˜๊ณ /์ฝ๊ณ /ํ…Œ์ŠคํŠธํ•˜๊ณ /์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ์•Œ๊ฒŒ ๋˜๋Š” ๊ฒƒ.

๊ณ„์ธต(layer)

๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™
-----------------------------------
์ฃผ์š” ๋™์ž‘ (์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์ƒํ’ˆ)
-----------------------------------
copy-on-write
-----------------------------------
์–ธ์–ด ์ง€์› ๊ธฐ๋Šฅ (๋ฐ˜๋ณต๋ฌธ, ๋ฐฐ์—ด ์ธ๋ฑ์Šค ๋“ฑ)

์ฑ…์—์„œ๋Š” ๋” ์ข‹์€ ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์‹ ํ˜ธ๋ฅผ ์ฐพ๋Š” ๋ฒ• ๋ช‡๊ฐ€์ง€๋ฅผ ์ œ์‹œ.

๐Ÿ˜‡
๊ณ„์ธตํ˜• ์„ค๊ณ„ ํŒจํ„ด
4๊ฐ€์ง€ ์ค‘์š”ํ•œ ํŒจํ„ด์ด ์กด์žฌ.

  1. Straightforward Implementation
    • straightforward : '๋‹จ์ˆœ/๊ฐ„๋‹จ' ์˜ ๋Šฌ์•™์Šค์— ๊ฐ€๊นŒ์›€.
    • ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜(ํ•จ์ˆ˜๋ช…, ์ธ์ž์ด๋ฆ„, ์ธ์ž๊ฐ’, ๋ฆฌํ„ด๊ฐ’)๊ฐ€ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—์„œ ์ ์ ˆํ•œ ๊ตฌ์ฒดํ™” ์ˆ˜์ค€์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•จ.
    • ๋„ˆ๋ฌด ๊ตฌ์ฒด์ ์ด๋ฉด ์•ˆ๋จ.
  2. ์ถ”์ƒํ™” ๋ฒฝ
    • ์„ธ๋ถ€๊ตฌํ˜„์„ ๊ฐ์ถ”๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต. ๋†’์€ ์ฐจ์›์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์–ด ์ „์ฒด๋ฅผ 'ํŒŒ์•…'ํ•˜๊ธฐ ์ข‹๋‹ค.
  3. ์ž‘์€ ์ธํ„ฐํŽ˜์ด์Šค
    • ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐœ๋…์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ค‘์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž‘๊ณ  ๊ฐ•๋ ฅํ•œ ๋™์ž‘์œผ๋กœ ๊ตฌ์„ฑ.
  4. ํŽธ๋ฆฌํ•œ ๊ณ„์ธต
    • ๊ฒฐ๊ตญ ์ด ๋ชจ๋“  ๊ฒƒ์€ ์‹ค์šฉ์„ฑ์„ ์œ„ํ•ด ์ ์šฉ๋˜์–ด์•ผ ํ•จ. ์ฝ”๋“œ์™€ ์ถ”์ƒํ™” ๊ณ„์ธต์€ ์ž‘์—…ํ•  ๋•Œ ๊ฑธ๋ฆฌ์  ๊ฑฐ๋ฆฌ์ง€ ์•Š๊ณ , ํŽธ๋ฆฌํ•จ์— ๊ธฐ์—ฌํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ˜‡
Straightforward Implementation ์ ์šฉํ•˜๊ธฐ

๋ชฉํ‘œ : ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ๊ธฐ๋Šฅ๋“ค์ด ๋ชจ๋‘ ๋น„์Šทํ•œ ๊ตฌ์ฒดํ™” ์ˆ˜์ค€์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. -> ์ด๋ฅผ ์œ„ํ•ด์„œ, ๋„ˆ๋ฌด ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„์„ ์ถ”์ƒํ™” ํ•œ๋‹ค.

์‚ฌ๊ณ  ๊ณผ์ •

  1. ํ•จ์ˆ˜๊ฐ€ ์•Œ์•„์•ผ ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์„ ํ•จ์ˆ˜๊ฐ€ ๋‹ด๊ณ  ์žˆ์Œ.
    (๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ์ฒ˜๋ฆฌ์— ๊ฐ€๊นŒ์šด ํ•จ์ˆ˜๊ฐ€ ๋ฐฐ์—ด ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ค„์•ผ ํ• ๊นŒ?)

  2. ํ•จ์ˆ˜ ์•ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” '์ง์ ‘ ๋งŒ๋“  ํ•จ์ˆ˜'์™€ '์–ธ์–ด ๊ธฐ๋Šฅ'์€ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋‹ค๋ฆ„.

  3. ์„œ๋กœ ๋‹ค๋ฅธ ์ถ”์ƒํ™” ๋‹จ๊ณ„๋กœ ์ธํ•ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ ์ง.

  4. ํ•จ์ˆ˜๊ฐ€ ์•Œ ํ•„์š”๊ฐ€ ์—†๋Š” ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„์€ ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ๊ฐ์ถฐ์คŒ์œผ๋กœ์จ, ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ๋น„์Šทํ•œ ๊ณ„์ธต์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•จ.

  5. Straightforward Implementation ์ด๋‹ค.

<๋ฐœ์ทŒ>

์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ (software design)

"์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , ํ…Œ์ŠคํŠธํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ์  ๊ฐ๊ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ"

-> '์ „๋ฌธ๊ฐ€์˜ ์ €์ฃผ' ๊ฐ™์€ ๊ฐœ๋…์„ ๊ณ ๋ คํ•ด๋ดค์„ ๋•Œ, ๊ณ„์ธตํ˜• ์„ค๊ณ„๊ฐ€ ๋ถ„๋ช…ํžˆ ๊ฐ๊ฐ์ ์ธ ์ธก๋ฉด์ด ์กด์žฌํ•œ๋‹ค๋Š” ์ ์—์„œ ๋ฏธ์  ๊ฐ๊ฐ ์ด๋ผ๋Š” ํ‘œํ˜„์„ ์‚ฌ์šฉํ•œ ๋“ฏ.

ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„์—์„œ

"๊ฐ™์€ ๋ฐ•์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐ™์€ ๊ณ„์ธต์— ์žˆ์–ด๋„ ์ข‹๋‹ค๋Š” ์ •๋ณด์ด๋‹ค."

<๋ฉ”๋ชจ>
๋ฒˆ์—ญ์ด ๋„ˆ๋ฌด ์•„์‰ฌ์›€.

Abstraction Barrier

186p ~ 210p
<์š”์•ฝ>

๐Ÿ˜‡
3๋‹จ๊ณ„ ์คŒ ๋ ˆ๋ฒจ

  • ๋‹ค์ด์–ด๊ทธ๋žจ(ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„)์„ ๋ณด๋Š” ๋ฐฉ๋ฒ•๋ก 
    • ์ „์—ญ ์คŒ ๋ ˆ๋ฒจ : ๋‹ค์ด์–ด๊ทธ๋žจ ์ „์ฒด๋ฅผ ์‚ดํŽด๋ณด๊ธฐ
    • ๊ณ„์ธต ์คŒ ๋ ˆ๋ฒจ : ํ•œ ๊ณ„์ธต๊ณผ, ์—ฐ๊ฒฐ๋œ ๊ทธ ์•„๋ž˜ ๊ณ„์ธต๋งŒ ์‚ดํŽด๋ณด๊ธฐ
    • ํ•จ์ˆ˜ ์คŒ ๋ ˆ๋ฒจ : ํ•œ ํ•จ์ˆ˜์™€, ์—ฐ๊ฒฐ๋œ ๊ทธ ์•„๋ž˜ ํ•จ์ˆ˜๋“ค๋งŒ ์‚ดํŽด๋ณด๊ธฐ

์ง์ ‘ ๊ตฌํ˜„: ๋ฆฌ๋ทฐ

  • ์ง์ ‘ ๊ตฌํ˜„์€ ๊ตฌ์ฒดํ™” ๋‹จ๊ณ„๋ฅผ ๊ณ„์ธต๋ณ„๋กœ ๊น”๋”ํ•˜๊ฒŒ ๋Š๋Š” ๊ฒƒ.
  • "์ฝ”๋“œ๋ฅผ ์ถ”์ƒํ™” ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค."

์ถ”์ƒํ™” ๋ฒฝ (abstraction barrier)

  • ์„ธ๋ถ€ ๊ตฌํ˜„์„ ๊ฐ์ถ˜ ํ•จ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ๊ณ„์ธต.
  • ์„ธ๋ถ€ ๊ตฌํ˜„์„ ๊ฐ์ท„๋‹ค๋Š” ๊ฑด, ์ž์‹ ์ด ๋ณธ๋ฌธ์— ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž„.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ API์™€ ๋น„์Šทํ•œ ๋Šฌ์•™์Šค.
  • ๊ตฌํ˜„์„ ๋ฐ”๊พธ๊ธฐ์— ์ข‹๋‹ค(e.g. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณ€๊ฒฝ). ๋•๋ถ„์— ํŒ€ ๊ฐ„ ํ˜‘์—…ํ•˜๊ธฐ๊ฐ€ ์ข‹๋‹ค.

<๋ฐœ์ทŒ>

์ถ”์ƒํ™” ๋ฒฝ์€,
์–ด๋–ค ๊ฒƒ์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜์ง€? ๋ผ๋Š” ๋ง์„ ๊ฑฐ์ฐฝํ•˜๊ฒŒ ํ‘œํ˜„ํ•œ ๊ฐœ๋….

<๋ฉ”๋ชจ>
๋น„์Šทํ•œ ๊ฐœ๋… (๊ตฌ์ฒด, ์ถ”์ƒ, ๊ณ„์ธต)์„ ๊ฐ€์ง€๊ณ , ๊ด€์‹ฌ์„ ๋‘๋Š” ์ง€์ ๋งŒ ์‚ด์ง์‚ด์ง ๋ฐ”๊ฟ”๊ฐ€๋ฉด์„œ ํŒจํ„ด์„ ๋ถ„๋ฆฌํ•œ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด๋‹ค.

Minimal Interface, Comfortable Layer. ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„๋กœ ๋น„๊ธฐ๋Šฅ์  ์š”๊ตฌ์‚ฌํ•ญ ํŒŒ์•…

211p ~ 232p
<์š”์•ฝ>

๐Ÿ˜‡
์ถ”์ƒํ™” ๋ฒฝ: ํŒจํ„ด ๋ฆฌ๋ทฐ

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

๐Ÿ˜‡
์ž‘์€ ์ธํ„ฐํŽ˜์ด์Šค (minimal interface)

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

๐Ÿ˜‡
์ž‘์€ ์ธํ„ฐํŽ˜์ด์Šค: ํŒจํ„ด ๋ฆฌ๋ทฐ

  • ์ถ”์ƒํ™” ๋ฒฝ์— ๋งŒ๋“  ํ•จ์ˆ˜๋Š” '์ธํ„ฐํŽ˜์ด์Šค' ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. -> ์ถ”์ƒํ™” ๋ฒฝ์„ ์ž‘๊ฒŒ ๋งŒ๋“ค์ž. (์‚ฌ์‹ค ๋ชจ๋“  ๊ณ„์ธต์— ์ ์šฉ ๊ฐ€๋Šฅ)
    • ์ถ”์ƒํ™” ๋ฒฝ์— ์ฝ”๋“œ๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก, ๊ตฌํ˜„์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๊ณ ์ณ์•ผ ํ•  ๊ฒƒ์ด ๋งŽ๋‹ค.
    • ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›Œ ์ง€๋ฏ€๋กœ, ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋น„์šฉ์ด ๋งŽ์•„์ง„๋‹ค.
    • ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„ ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์‰ฝ๊ณ , ์ดํ•ดํ•˜๊ธฐ๋„ ์–ด๋ ต๋‹ค.
  • ๋‹ค์†Œ ์ด์ƒ์ ์ธ ๋ชจ์Šต. ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„ ํ•˜์œ„ ๊ณ„์ธต์— '์ž‘๊ณ  ๊ฐ•๋ ฅํ•œ' ๋™์ž‘์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ˜‡
ํŽธ๋ฆฌํ•œ ๊ณ„์ธต

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

๐Ÿ˜‡
ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„ ํ™œ์šฉ

  • ๊ธฐ๋Šฅ์  ์š”๊ตฌ์‚ฌํ•ญ : ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ literally ํ•ด์•ผํ•˜๋Š” ๊ธฐ๋Šฅ. e.g. ์„ธ๊ธˆ ๊ณ„์‚ฐ์„ ํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผ.
  • ๋น„๊ธฐ๋Šฅ์  ์š”๊ตฌ์‚ฌํ•ญ
    • ์œ ์ง€๋ณด์ˆ˜์„ฑ (maintainability) : ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์–ด๋–ค ์ฝ”๋“œ์ธ๊ฐ€
    • ํ…Œ์ŠคํŠธ์„ฑ (testability) : ์–ด๋–ค ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฐ€
    • ์žฌ์‚ฌ์šฉ์„ฑ (reusability) : ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€๊ฐ€

(์•„๋ž˜์— ์žˆ๋Š” ํ•จ์ˆ˜: ๋‚ฎ์€ ๊ณ„์ธต์˜ ํ•จ์ˆ˜ / ์œ„์— ์žˆ๋Š” ํ•จ์ˆ˜: ๋†’์€ ๊ณ„์ธต์˜ ํ•จ์ˆ˜)

  1. ์œ ์ง€๋ณด์ˆ˜์„ฑ
    • ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๊ณ ์น˜๊ธฐ ์‰ฝ๋‹ค.
    • ์•„๋ž˜์— ์žˆ๋Š” ์ฝ”๋“œ์ผ์ˆ˜๋ก ๊ณ ์น˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ ์ฝ”๋“œ ์œ„์— ๋งŒ๋“  ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ํ•ต์‹ฌ : ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ์ฝ”๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ์œ„์ชฝ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  2. ํ…Œ์ŠคํŠธ์„ฑ
    • ์•„๋ž˜์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
    • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ๊ฐ€์žฅ ์•„๋ž˜์—์„œ ์ž˜ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๋”๋ถˆ์–ด, ์œ„์— ์žˆ๋Š” ์ฝ”๋“œ์ผ์ˆ˜๋ก ์ž์ฃผ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๊ฐ€ ์˜ค๋ž˜๊ฐ€์ง€ ๋ชปํ•œ๋‹ค.
    • ํ•ต์‹ฌ : ์•„๋ž˜์ชฝ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ€์น˜์žˆ๋‹ค.
  3. ์žฌ์‚ฌ์šฉ์„ฑ
    • ์•„๋ž˜์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋” ์ข‹๋‹ค.
    • ์•„๋ž˜์— ์žˆ๋Š” ์ฝ”๋“œ์ผ์ˆ˜๋ก, ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋œ ํ˜ธ์ถœํ•œ๋‹ค. -> ํŠน์ • ๊ฒฝ์šฐ๊ฐ€ ์กฐํ•ฉ๋œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•จ์ˆ˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Œ์œผ๋กœ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ข‹๋‹ค.
    • ํ•ต์‹ฌ : ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋‹จ๊ณ„๋กœ ํ•จ์ˆ˜๋ฅผ ๋นผ๋‚ด๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋” ๋†’์•„์ง„๋‹ค.

<๋ฐœ์ทŒ>

์ฝ”๋“œ ์ค„ ์ˆ˜๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ฝ”๋“œ๊ฐ€ ์ ์ ˆํ•œ ๊ตฌ์ฒดํ™” ์ˆ˜์ค€๊ณผ ์ผ๋ฐ˜ํ™”๊ฐ€ ๋˜์–ด ์žˆ๋Š”์ง€์ž…๋‹ˆ๋‹ค.

๊ณ„์ธตํ˜• ์„ค๊ณ„๋Š” ๋ฐ”๋กœ ์•„๋ž˜ ๊ณ„์ธต์— ์žˆ๋Š” ํ•จ์ˆ˜๋กœ, ํ˜„์žฌ ๊ณ„์ธต์˜ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

<๋ฉ”๋ชจ>
๊ณ„์ธต, ๊ณ„์ธต, ๊ณ„์ธต.
'ํŽธ๋ฆฌํ•œ ๊ณ„์ธต' ํŒจํ„ด์ด ๊ฐ€์žฅ ์™€๋‹ฟ์•˜๋‹ค. ์ด๋ก ์€ ์ด์ƒ, ์—…๋ฌด๋Š” ํ˜„์‹ค.

์ฝ”๋“œ์˜ ๋ƒ„์ƒˆ, ์ผ๊ธ‰ ๊ฐ’

233p ~ 252p
<์š”์•ฝ>
๐Ÿ˜‡
ํŒŒํŠธ 2 ์—์„œ ํ•  ๊ฒƒ : "์ผ๊ธ‰์ด ์•„๋‹Œ ๊ฒƒ์„ ์ฐพ๊ณ  ๊ทธ๊ฒƒ์„ ์ผ๊ธ‰์œผ๋กœ ๋ฐ”๊ฟ” ๋ณด๊ธฐ"

๐Ÿ˜‡
์ฝ”๋“œ์˜ ๋ƒ„์ƒˆ ๋งก๋Š” ๋ฒ• (ํ•จ์ˆ˜ ์ด๋ฆ„์— ์žˆ๋Š” ์•”๋ฌต์  ์ธ์ž๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฒ•)

  1. ํ•จ์ˆ˜ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋น„์Šทํ•œ ๊ตฌํ˜„์„ ์ง€๋‹ˆ๊ณ  ์žˆ๊ณ ,
  2. 'ํ•จ์ˆ˜ ์ด๋ฆ„'์ด ๊ตฌํ˜„์˜ ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ํ˜•ํƒœ๋ผ๋ฉด
  3. ๊ฐ ํ•จ์ˆ˜๋“ค์˜ ํ•จ์ˆ˜ ์ด๋ฆ„์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์•”๋ฌต์  ์ธ์ž์ด๋‹ค.

๋‘ ๊ฐ€์ง€์˜ ๋ฆฌํŒฉํ„ฐ๋ง์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

  1. ์•”๋ฌต์  ์ธ์ž๋ฅผ ๋“œ๋Ÿฌ๋‚ด๊ธฐ. ์ฆ‰, ๋ช…์‹œ์  ์ธ์ž๋กœ ๋ฐ”๊พธ๊ธฐ โžก๏ธ ์˜ค๋Š˜์˜ ์ฃผ์ œ
  2. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ (๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ.)

๐Ÿ˜‡
"์•”๋ฌต์  ์ธ์ž๋ฅผ ๋“œ๋Ÿฌ๋‚ด๊ธฐ" ๋‹จ๊ณ„

  1. ํ•จ์ˆ˜ ์ด๋ฆ„์— ์žˆ๋Š” ์•”๋ฌต์  ์ธ์ž๋ฅผ ํ™•์ธํ•œ๋‹ค.
  2. ๋ช…์‹œ์ ์ธ ์ธ์ž๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  3. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์— ํ•˜๋“œ ์ฝ”๋”ฉ๋œ๊ฐ’์„ ์ƒˆ๋กœ์šด ์ธ์ž๋กœ ๋ฐ”๊พผ๋‹ค.
  4. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์„ ๊ณ ์นœ๋‹ค.

๐Ÿ˜‡
๋ช…์‹œ์ ์ธ ์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”, ๋ณ€์ˆ˜๋‚˜ ๋ฐฐ์—ด์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š”, ์ฆ‰ ์–ธ์–ด ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๊ฒƒ -> ์ผ๊ธ‰
(๊ทธ ๋ฐ˜๋Œ€๋Š” ์•”๋ฌต์ ์ธ, ๋‹ด์„ ์ˆ˜ ์—†๋Š”, ์•„๋ฌด๋ฐ์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š”.)

๊ทธ๋ž˜์„œ "์•”๋ฌต์  ์ธ์ž๋ฅผ ๋“œ๋Ÿฌ๋‚ด๊ธฐ" ๋ฆฌํŒฉํ„ฐ๋ง๋„ ๊ฒฐ๊ตญ, ์•”๋ฌต์ ์ธ ์ด๋ฆ„์„ ์ธ์ž๋กœ ๋„˜๊ธธ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •. ์ฆ‰, ์ผ๊ธ‰์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •.

๐Ÿ˜‡
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ผ๊ธ‰(first-class)๊ฐ€ ์•„๋‹Œ ๊ฒƒ

  1. ์ˆ˜์‹ ์—ฐ์‚ฐ์ž
  2. ๋ฐ˜๋ณต๋ฌธ
  3. ์กฐ๊ฑด๋ฌธ
  4. try/catch ๋ธ”๋ก

์ผ๊ธ‰์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  1. ๋ณ€์ˆ˜์— ํ• ๋‹น
  2. ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„˜๊ธฐ๊ธฐ
  3. ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋ฐ›๊ธฐ
  4. ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด์— ๋‹ด๊ธฐ

๐Ÿ˜‡
e.g.
๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•„๋“œ๋ช…(์ผ๊ธ‰์œผ๋กœ ์ „๋‹ฌ๋œ)์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ๋™์ž‘.
API์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์›๋ž˜ ํ•„๋“œ๋ช…์„ ์ƒˆ๋กœ์šด ํ•„๋“œ๋ช…์œผ๋กœ ๋‚ด๋ถ€์—์„œ ๋Œ€์น˜์‹œ์ผœ์ฃผ๋Š” ๋™์ž‘.

  • ์ด๊ฒƒ๋“ค์€ ํ•„๋“œ๋ช…์ด ์ผ๊ธ‰์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ.
  • ์ผ๊ธ‰์ด๋ผ๋Š” ๋ง์€ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์— ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป.
  • ์–ธ์–ด์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ํ•„๋“œ๋ช…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ˜‡
์–ด๋–ค ๋ฌธ๋ฒ•์ด๋“  ์ผ๊ธ‰ ํ•จ์ˆ˜๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ 'ํ•จ์ˆ˜' ์ž์ฒด๋Š” ์ผ๊ธ‰ ๊ฐ’. (์ธ์ž ์ „๋‹ฌ ๊ฐ€๋Šฅ, ๋ณ€์ˆ˜/๋ฐฐ์—ด์— ๋‹ด๊ธฐ ๊ฐ€๋Šฅ, ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  • '+' ์—ฐ์‚ฐ์ž๋Š” ์ผ๊ธ‰์ด ์•„๋‹ˆ๋‹ค. ๋‹จ, ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋Š” ์ผ๊ธ‰ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ์–ด๋–ค ๋ฌธ๋ฒ•์ด๋“  ์ผ๊ธ‰ ํ•จ์ˆ˜๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

<๋ฐœ์ทŒ>

๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?
์—ฌ๋Ÿฌ๋ถ„๊ณผ ์—ฌ๋Ÿฌ๋ถ„์˜ ํŒ€์ด ์„ ํƒํ•œ ์–ธ์–ด๊ฐ€ ํŽธํ•˜๋‹ค๋ฉด ๊ฑฑ์ •ํ•˜์ง€ ๋ง๊ณ  ๊ณ„์† ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ž ์„ ๋” ์ž๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋„ค์š”.

  • ์ •์  ํƒ€์ž… vs ๋™์  ํƒ€์ž…, ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒ€์‚ฌ vs ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ ์—์„œ.

๋ฐ์ดํ„ฐ ์ง€ํ–ฅ
์ด๋ฒคํŠธ์™€ ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•œ ์‚ฌ์‹ค์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ˜•์‹.

  • ํ˜ธ์ถœ ๊ทธ๋ž˜ํ”„ ์•„๋ž˜์— ์œ„์น˜ํ•œ ์ผ๋ฐ˜์ ์ธ(์œ„์— ์œ„์น˜ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€) ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•ด์„œ๋Š”, ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉ๋  ์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•ด ์ผ๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ธ ๊ฐ์ฒด/๋ฐฐ์—ด์„ ์‚ฌ์šฉ.
  • ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ ์ž„์˜์˜ ์ธํ„ฐํŽ˜์ด์Šค(์ปค์Šคํ…€ API)๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ•ด์ง„ ๋ฐฉ๋ฒ•์œผ๋กœ๋งŒ ์จ์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋Ÿฐ ์ œํ•œ์ด ์œ ์šฉํ•œ ์ˆœ๊ฐ„๋„ ์žˆ์„ ๊ฒƒ.
    <๋ฉ”๋ชจ>
    ๊ทธ๋ฆฌ๊ณ  ์ž ์„ ๋” ์ž๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋„ค์š”.

์ผ๊ธ‰ ํ•จ์ˆ˜

253p ~ 278p
<์š”์•ฝ>
๐Ÿ˜‡ ๊ฐœ์š”
์ฝ”๋“œ์˜ ๋ƒ„์ƒˆ. ๋‘ ๊ฐ€์ง€์˜ ๋ฆฌํŒฉํ„ฐ๋ง์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ.

  1. ์•”๋ฌต์  ์ธ์ž๋ฅผ ๋“œ๋Ÿฌ๋‚ด๊ธฐ. ์ฆ‰, ๋ช…์‹œ์  ์ธ์ž๋กœ ๋ฐ”๊พธ๊ธฐ (์ผ๊ธ‰ ๊ฐ’)
  2. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ (๊ณ ์ฐจ ํ•จ์ˆ˜) โžก๏ธ ์˜ค๋Š˜์˜ ์ฃผ์ œ.

๐Ÿ˜‡ ์šฉ์–ด ์ •๋ฆฌ
์ผ๊ธ‰ (first-class) : "์ธ์ž๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค."
์ผ๊ธ‰ ๊ฐ’ : '์ผ๊ธ‰'์ธ ๋ฐ์ดํ„ฐ.
์ผ๊ธ‰ ํ•จ์ˆ˜ : '์ผ๊ธ‰'์ธ ํ•จ์ˆ˜.
๊ณ ์ฐจ ํ•จ์ˆ˜ : ์ผ๊ธ‰ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜.

๐Ÿ˜‡ "ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ"

  1. ๋ณธ๋ฌธ๊ณผ ๊ทธ ์•ž๋ถ€๋ถ„ / ๋’ท๋ถ€๋ถ„ ์„ ํ™•์ธํ•œ๋‹ค.
    • ๋ณธ๋ฌธ : ๊ตฌํ˜„์ด ๋น„์Šทํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•จ์ˆ˜์—์„œ, ์ฝ”๋“œ์— ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„.
  2. ๋ฆฌํŒฉํ„ฐ๋ง ํ•  ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ๋นผ๋‚ธ๋‹ค.
  3. ๋ณธ๋ฌธ์„ ์ธ์ž(์ฝœ๋ฐฑ ํ•จ์ˆ˜)๋กœ ๋งŒ๋“ค์–ด, 2๋ฒˆ์—์„œ ๋นผ๋‚ธ ํ•จ์ˆ˜(๊ณ ์ฐจ ํ•จ์ˆ˜)์— ์ธ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค.

๐Ÿ˜‡ ์ฝ”๋“œ ์˜ˆ์‹œ

// 1. ์•ž๋ถ€๋ถ„ ๋’ท๋ถ€๋ถ„ ํ™•์ธ
function arraySet (array, idx, value) {
	var copy = array.slice();	// ์•ž๋ถ€๋ถ„
  	copy[idx] = value;			// ๋ณธ๋ฌธ
  	return copy;				// ๋’ท๋ถ€๋ถ„
}

// 2. ํ•จ์ˆ˜ ๋นผ๋‚ด๊ธฐ
function withArrayCopy(array) {
	var copy = array.slice();
	copy[idx] = value;				        // ๋ณธ๋ฌธ. ์•„์ง ์ œ๋Œ€๋กœ ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ.
  	return copy;
}
function arraySet(array, idx, value) {
	return withArrayCopy(array);
}


// 3. ์ฝœ๋ฐฑ ๋นผ๋‚ด๊ธฐ
function withArrayCopy(array, modify) {
	var copy = array.slice();
	modify(copy);	                        // ์ฝœ๋ฐฑ ํ˜ธ์ถœ. ์›๋ž˜์˜ ๋ณธ๋ฌธ์— ํ•ด๋‹น.
  	return copy;
}
function arraySet(array, idx, value) {
  	return withArrayCopy(
      array,
      function(copy) {copy[idx] = value;}	// ์ฝœ๋ฐฑ ์ „๋‹ฌ
    );
}

<๋ฐœ์ทŒ>

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑ(callback) ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜(handler function) ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์™ธ์˜ ๋‹ค๋ฅธ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋„ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด์ž…๋‹ˆ๋‹ค. ์ฝœ๋ฐฑ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜๋Š” "๋‚˜์ค‘์— ํ˜ธ์ถœ๋  ๊ฒƒ"์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ ํƒ์ ์œผ๋กœ ํ˜ธ์ถœ (e.g. ์กฐ๊ฑด๋ฌธ ์•ˆ์—์„œ)
  • ๋‚˜์ค‘์— ํ˜ธ์ถœ (e.g. sleep()์„ ํ†ตํ•œ ์ผ์ • ์‹œ๊ฐ„ ๊ฒฝ๊ณผ ํ›„)
  • ์ƒˆ๋กœ์šด ๋ฌธ๋งฅ ์•ˆ์—์„œ ํ˜ธ์ถœ (e.g. try/catch ๊ตฌ๋ฌธ ์•ˆ์—์„œ)

<๋ฉ”๋ชจ>
๊ณ ์ฐจ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š”, ๊ณ ์ฐจ ํ•จ์ˆ˜ ์•ˆ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ๊ผด์— ๋งž๋Š” ์ธ์ž์™€ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•จ. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์™œ ์ƒ๊ฒผ๋Š”์ง€ ์•Œ๊ฒ ๋‹ค.

๊ณ ์ฐจ ํ•จ์ˆ˜ ๋งˆ๋ฌด๋ฆฌ. ํ•จ์ˆ˜ํ˜• ๋ฐ˜๋ณต (map, filter, reduce)

279p ~ 302p
<์š”์•ฝ>
๐Ÿ˜‡ ๊ฐœ์š”
ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ -> ๊ฒฐ๊ตญ, ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•œ ๋ฆฌํŒฉํ† ๋ง๊ณผ ๊ฐ™์€ ๋ง.
1. with ํŒจํ„ด
2. wrap ํŒจํ„ด

// ์˜ˆ) saveUserData() ํ•จ์ˆ˜ ์‹คํ–‰ ์—๋Ÿฌ ์‹œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์‹ถ์Œ
// ์›๋ž˜ ์ฝ”๋“œ
try {
  saveUserData(user);
} catch (error) {
  logToSnapErrors(error);
}

// withLogging
function withLogging(f) {
  try {
    f();
  } catch(error) {
    logToSnapErrors(error);
  }
}
withLogging(function() {
  saveUserData(user);
});

// wrapLogging
function wrapLogging(f) {
  return function (arg) {
    try {
      f(arg);
    } catch {
      logToSnapErrors(error);
    }
  }
}
var saveUserDataWithLogging = wrapLogging(saveUserDataNoLogging);

with ํŒจํ„ด์˜ ๋‹จ์  : ๋ชจ๋“  ์ฝ”๋“œ์— ์ˆ˜๋™์œผ๋กœ withLogging() ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ด์•ผ ํ•จ. ์–ด๋–ค ๋ถ€๋ถ„์€ ๊นŒ๋จน๊ณ  ์ ์šฉ ์•ˆํ•  ์ˆ˜ ๋„ ์žˆ์Œ.
wrap ํŒจํ„ด์€ ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ(factory) ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ. ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ.

๐Ÿ˜‡ ๊ณ ์ฐจ ํ•จ์ˆ˜ ์ •๋ฆฌ

  • ๊ณ ์ฐจ ํ•จ์ˆ˜๋กœ ํŒจํ„ด์ด๋‚˜ ์›์น™์„ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํ•œ ๋ฒˆ ์ •์˜ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ณณ์— ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉ. ์ˆ˜์ž‘์—…์„ ์ค„์ž„.
  • ๊ณ ์ฐจ ํ•จ์ˆ˜๋กœ "ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜"๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์žˆ๋‹ค. ๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ๋งŽ์€ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์—†์• ์ฃผ์ง€๋งŒ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค.

๐Ÿ˜‡ ํ•จ์ˆ˜ํ˜• ๋ฐ˜๋ณต

  1. map
    • ์–ด๋–ค ๊ฐ’(x)์˜ ์ง‘ํ•ฉ์ด ์žˆ๋Š” ๋ฐฐ์—ด์„ ๋˜ ๋‹ค๋ฅธ ๊ฐ’(y)์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜.
    • x๋ฅผ y๋กœ ๋ฐ”๊พธ๋Š” ๊ณ„์‚ฐ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.
// ์›๋ณธ ํ•จ์ˆ˜
function emailsForCustomers(customers, goods, bests) {
  var emails = [];
  forEach(customers, function(customer) {
    var email = emailForCustomer(customer, goods, bests);
    emails.push(email);
  });
  return emails;   
}

// map ํ™œ์šฉ
function emailsForCustomers(customers, goods, bests) {
  return map(customers, function(customer) {
    return emailForCustomer(customer, goods, bests);
  });
}
  1. filter
    • ๋ฐฐ์—ด์—์„œ ์ผ๋ถ€ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜๋Š” ํ•จ์ˆ˜.
    • ์›์†Œ x๋ฅผ ๋ฐ›์•„ boolean ํƒ€์ž…์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜(predicate)๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.
// ์›๋ณธ ํ•จ์ˆ˜
function selectBestCustomers(customers) {
  var newArray = [];
  forEach(customers, function(customer) {
    if (customer.purchases.length >= 3)
      newArray.push(customer);
  });
  return newArray;   
}

// filter ํ™œ์šฉ
function selectBestCustomers(customers) {
  return filter(customers, function(customer) {
    return customer.purchases.length >= 3;
  });
}

<๋ฐœ์ทŒ>

ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ํŒฉํ† ๋ฆฌ factory ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ž๋™์œผ๋กœ ์ •ํ˜•ํ™”๋œ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ๊ณต์žฅ.

๋งŽ์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ณผ๋„ํ•˜๊ฒŒ ๋ชฐ๋‘ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
... (์ค‘๋žต) ...
๊ณ ์ฐจ ํ•จ์ˆ˜๋กœ ๋งŒ๋“  ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๋‹ค๋ฉด, ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•๊ณผ ํ•ญ์ƒ ๋น„๊ตํ•ด ๋ณด์„ธ์š”. ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ๋” ์ข‹์„๊นŒ์š”?

  • ์ฝ”๋“œ๊ฐ€ ๋” ์ฝ๊ธฐ ์‰ฌ์šด๊ฐ€์š”?
  • ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ๋‚˜์š”?
  • ์ฝ”๋“œ๊ฐ€ ํ•˜๋Š” ์ผ์ด ๋ฌด์—‡์ธ์ง€ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‚˜์š”?

์ด๋Ÿฐ ์งˆ๋ฌธ๋“ค์„ ๋†“์น˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๊ณผ๋ชฐ์ž… ์ฃผ์˜. ํ•ญ์ƒ ์‹ค์ „์ฃผ์˜, ์‹ค์šฉ์ฃผ์˜.

<๋ฉ”๋ชจ>

ํ•จ์ˆ˜ํ˜• ๋ฐ˜๋ณต ๋งˆ๋ฌด๋ฆฌ, ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ ์ฒด์ด๋‹

303p ~ 326p
<์š”์•ฝ>
๐Ÿ˜‡
reduce()
: ๋ฐฐ์—ด์„ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ "reduce"

// origin
function countAllPurchases(customers) {
  var total = 0;
  forEach(customers, function(cutomer) {
    total = total + customer.purchases.length;
  }
        );
};
  });
  return total;
}

// with reduce
function countAllPurchases(customers) {
  return reduce (customers, 0, function(total, customer) {
      return total + customer.purchases.length;
    }
  );
}

function reduce(array, init, f) {
  var accum = init;
  forEach(array, function(elem) {
    accum = f(accum, elem);
  });
  return accum;
}
  • ํ˜„์žฌ ๋ˆ„์ ๋œ ๊ฐ’๊ณผ ๋ฐฐ์—ด์˜ ํ˜„์žฌ ํ•ญ๋ชฉ์„ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ๋ˆ„์ ๊ฐ’์„ ๊ณ„์‚ฐ.
  • ์ƒˆ๋กœ์šด ๋ˆ„์ ๊ฐ’์„ ๊ธฐ์กด ๋ˆ„์ ๊ฐ’์ด ๋‹ด๊ธด ๋ณ€์ˆ˜์— ํ• ๋‹น.

๐Ÿ˜‡ reduce ์ดˆ๊ธฐ๊ฐ’ ์ฃผ์˜ํ•  ์ 

  1. ๊ณ„์‚ฐ์ด ์–ด๋–ค ๊ฐ’์—์„œ ์‹œ์ž‘๋˜๋Š”๊ฐ€?
    • ์˜ˆ๋ฅผ ๋“ค์–ด ๋”ํ•˜๊ธฐ๋Š” 0, ๊ณฑํ•˜๊ธฐ๋Š” 1.
  2. ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ๋‹ค๋ฉด ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•  ๊ฒƒ์ธ๊ฐ€?
    • ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์ด๋ฅผ ๊ฒฐ์ •. ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ๋‹ค๋ฉด forEach ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ด๋  ๊ฒƒ.

๐Ÿ˜‡ ์„ธ ๊ฐ€์ง€ ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ ๋น„๊ต

  1. map
    : ์–ด๋–ค ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์— ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ด, ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋ฐ”๊พผ๋‹ค.

  2. filter
    : ์–ด๋–ค ๋ฐฐ์—ด์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์„ ํƒํ•ด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋งŒ๋“ ๋‹ค.

  3. reduce
    : ์–ด๋–ค ๋ฐฐ์—ด์˜ ํ•ญ๋ชฉ์„ ์กฐํ•ฉํ•ด ์ตœ์ข…๊ฐ’์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์š”์•ฝ or ์‹œํ€€์Šค๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ๋งŒ๋“ค ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ.

๐Ÿ˜‡ ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ ์ฒด์ธ
: ๋‹จ๊ณ„๋“ค์„ ์กฐํ•ฉํ•ด ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ. ์ด ๊ณผ์ •์—์„œ ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ.

๐Ÿ˜‡ ์ฒด์ธ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ โžก๏ธ "์ฝœ๋ฐฑ์— ์ด๋ฆ„ ๋ถ™์ด๊ธฐ" ๋ฅผ ์„ ํ˜ธ.

  • ์ธ๋ผ์ธ ๋Œ€์‹  ์ด๋ฆ„์„ ๋ถ™์—ฌ ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
    • ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ข‹๋‹ค.
    • ๋‹จ๊ณ„๊ฐ€ ์ค‘์ฒฉ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.
// ์›๋ž˜ ์ฝ”๋“œ
function biggestPurchasesBestCustomers(customers) {
  var bestCustomers = filter(customers, function(customer) {	// 1๋‹จ๊ณ„
    return customer.purchases.length >= 3;
  });
  var biggestPurchases = map(bestCustomers, function(customer) {	// 2๋‹จ๊ณ„
    return maxKey(customer.purchases, {total: 0}, function(purchase) {
      return purchase.total;
    });
  });
  return biggestPurchases;
}

// 1. ๋‹จ๊ณ„์— ์ด๋ฆ„ ๋ถ™์ด๊ธฐ
function biggestPurchasesBestCustomers(customers) {
  var bestCustomers    = selectBestCustomers(customers);		// 1๋‹จ๊ณ„
  var biggestPurchases = getBiggestPurchases(bestCustomers);	// 2๋‹จ๊ณ„
  return biggestPurchases;
}

function selectBestCustomers(customers) {
  return filter(customers, function(customer) {		// ๊ทธ๋Œ€๋กœ ๋ถ„๋ฆฌ
    return customer.purchases.length >= 3;
  });
}

function getBiggestPurchases(customers) {		// ๊ทธ๋Œ€๋กœ ๋ถ„๋ฆฌ
  return map(customers, getBiggestPurchase);
}

function getBiggestPurchase(customer) {		// ๊ทธ๋Œ€๋กœ ๋ถ„๋ฆฌ
  return maxKey(customer.purchases, {total: 0}, function(purchase) {	// ์ค‘์ฒฉ
    return purchase.total;												// ์ค‘์ฒฉ
  });
}

// 2. ์ฝœ๋ฐฑ์— ์ด๋ฆ„ ๋ถ™์ด๊ธฐ
/// extracted and named callbacks
function biggestPurchasesBestCustomers(customers) {
  var bestCustomers    = filter(customers, isGoodCustomer);			// ์ด๋ฆ„๋ถ™์ธ ์ฝœ๋ฐฑ ์ „๋‹ฌ
  var biggestPurchases = map(bestCustomers, getBiggestPurchase);	// ์ด๋ฆ„๋ถ™์ธ ์ฝœ๋ฐฑ ์ „๋‹ฌ
  return biggestPurchases;
}

function isGoodCustomer(customer) {
  return customer.purchases.length >= 3;
}

function getBiggestPurchase(customer) {
  return maxKey(customer.purchases, {total: 0}, getPurchaseTotal);
}

function getPurchaseTotal(purchase) {
  return purchase.total;
}

<๋ฐœ์ทŒ>

<๋ฉ”๋ชจ>

ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ ์ฒด์ด๋‹ : ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ ํ™œ์šฉํ•ด ๋ฆฌํŒฉํ„ฐ๋ง ํ•ด๋ณด๊ธฐ

327p ~ 346p
<์š”์•ฝ>
๐Ÿ˜‡ ์ŠคํŠธ๋ฆผ ๊ฒฐํ•ฉ (stream fusion)

  • map(), filter(), reduce() ์ฒด์ธ์„ ์ตœ์ ํ™” ํ•˜๋Š” ๊ฒƒ.

  • ์ตœ์ ํ™”์ผ ๋ฟ์ด๊ณ  ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๋‹ค.

    • map
    /// Two map() steps in a row
    
    var names = map(customers, getFullName);
    var nameLengths = map(names, stringLength);
    
    /// Equivalent as a single map() step
    
    var nameLengths = map(customers, function(customer) {
      return stringLength(getFullName(customer));
    });
    • filter
    /// Two filter() steps in a row
    
    var goodCustomers = filter(customers, isGoodCustomer);
    var withAddresses = filter(goodCustomers, hasAddress);
    
    /// Equivalent as a single filter() step
    
    var withAddresses = filter(customers, function(customer) {
      return isGoodCustomer(customer) && hasAddress(customer);
    });
    • reduce
    /// map() step followed by reduce() step
    
    var purchaseTotals = map(purchases, getPurchaseTotal);
    var purchaseSum = reduce(purchaseTotals, 0, plus);
    
    /// Equivalent as a single reduce() step
    
    var purchaseSum = reduce(purchases, 0, function(total, purchase) {
      return total + getPurchaseTotal(purchase);
    });

๐Ÿ˜‡ ๋ฐ˜๋ณต๋ฌธ์„ ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๊ธฐ

๋ฆฌํŒฉํ„ฐ๋ง ํ•  ์ฝ”๋“œ.
๋ฐฐ์—ด ํŠน์ • ๋ถ€๋ถ„์˜ ์—ฐ์†๋œ ๋ฐ์ดํ„ฐ์ธ window์˜ ํ‰๊ท ์„ ๊ตฌํ•˜๊ณ , ๊ฒฐ๊ณผ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
์ด๋ฅผ ๋ฐฐ์—ด์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋ฐ˜๋ณต.

var answer = [];
var window = 5;
for(var i = 0; i < array.length; i++) {
  var sum = 0;
  var count = 0;
  for(var w = 0; w < window; w++) {		// 1
    var idx = i + w;					// 2
    if(idx < array.length) {
      sum += array[idx];				// 3
      count += 1;
    }
  }
  answer.push(sum/count);
}

Tip 1. ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด์— ๋‹ด๊ธฐ

  • ์ฃผ์„ 1, 2, 3 ์„ ๋ณด๋ฉด, ๊ฐ’์ด ๊ณ„์† ๋ฐ”๋€Œ์ง€๋งŒ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์ง€๋Š” ์•Š๊ณ  ์žˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด์— ๋„ฃ์œผ๋ฉด ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

  • ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ window๋ผ๋Š” ๋ฒ”์œ„๋ฅผ ์ถ”์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋ช…์‹œ์ ์ธ ๋ฐฐ์—ด๋กœ ์ถ”์ถœํ•˜๋ฉด ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

    /// make subarray
    var answer = [];
    var window = 5;
    
    for(var i = 0; i < array.length; i++) {
      var sum = 0;
      var count = 0;
      var subarray = array.slice(i, i + window);  //here
      for(var w = 0; w < subarray.length; w++) {
        sum += subarray[w];
        count += 1;
      }
      answer.push(sum/count);
    }

Tip 2. ํ•œ ๋ฒˆ์— ์ „์ฒด ๋ฐฐ์—ด์„ ์กฐ์ž‘ํ•˜๊ธฐ

  • ์œ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด๋กœ ๋งŒ๋“  ๊ฒƒ์„, ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด 'ํ•œ ๋ฒˆ์—' ์กฐ์ž‘ํ•œ๋‹ค.

    /// Using average
    var answer = [];
    var window = 5;
    
    for(var i = 0; i < array.length; i++) {
      var subarray = array.slice(i, i + window);
      answer.push(average(subarray));
    }
  • ๊ฐ€์žฅ ์ƒ์œ„์˜ for๋ฌธ ์—์„œ๋„, i๊ฐ’์ด ๊ณ„์† ๋ฐ”๋€Œ๋ฉด์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€๋งŒ, ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ง€์ง€๋Š” ์•Š๊ณ  ์žˆ๋‹ค.

  • ์ด ๋˜ํ•œ 1) ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด์— ๋„ฃ๊ณ , 2) ํ•œ ๋ฒˆ์— ์กฐ์ž‘ํ•˜๋„๋ก ๊ฐœ์„ ํ•œ๋‹ค.

    // make range (set of indices)
    function range(start, end) {
      var ret = [];
      for(var i = start; i < end; i++)
        ret.push(i);
      return ret;
    }
    var indices = range(0, array.length);
    var window = 5;
    
    var answer = map(indices, function(i) {
      var subarray = array.slice(i, i + window);
      return average(subarray);
    });

Tip 3. ์ž‘์€ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„๊ธฐ

  • ํ˜„์žฌ map()์— ๋„˜๊ธฐ๋Š” ์ฝœ๋ฐฑ์—์„œ ๋‘ ๊ฐ€์ง€์˜ ์ผ์„ ํ•˜๊ณ  ์žˆ๋‹ค.

    • ํ•˜์œ„ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
    • ํ‰๊ท ์„ ๊ณ„์‚ฐํ•˜๊ธฐ
  • ์ด๋ฅผ ์ž‘์€ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ž‘์—…์ด ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ํ•œ๋‹ค.

    /// in two steps
    var indices = range(0, array.length);
    var window = 5;
    
    var windows = map(indices, function(i) {	// make subset
      return array.slice(i, i + window);
    });
    
    var answer = map(windows, average);		// calculate average

๐Ÿ˜‡ ๊ฒฐ๊ณผ

  • ์ฒ˜์Œ์—๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ์ค‘์ฒฉ๋˜๊ณ , ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉฐ, ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ๋ฐ”๊พธ๋Š” ์ฝ”๋“œ.
  • ์ด ๊ณผ์ •์„ ๊ฐ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Œ. ๊ธ€๋กœ๋„ ๊ทธ๋Œ€๋กœ ๋ฐ”๊ฟ” ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฐ์—ด์„ ์ด๋™ํ•˜๋ฉฐ ํ‰๊ท  ๊ตฌํ•˜๊ธฐ
1. ์ˆซ์ž ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ์„ ๋•Œ ๊ฐ ์ˆซ์ž์— ๋Œ€ํ•œ window๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
2. ๊ทธ๋ฆฌ๊ณ  ๊ฐ window์˜ ํ‰๊ท ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ˜‡ ์ฒด์ด๋‹ ํŒ ์š”์•ฝ

  • ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ๋Š” ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ž˜ ๋™์ž‘ํ•œ๋‹ค.
  • ๋ฐฐ์—ด ์ผ๋ถ€์— ๋Œ€ํ•ด ๋™์ž‘ํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฐ์—ด ์ผ๋ถ€๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
  • map(), filter(), reduce()๋Š” ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ์˜ ์ „๋ถ€๊ฐ€ ์•„๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์ข‹์€ ์ด๋ฆ„์„ ๋ถ™์—ฌ ์‚ฌ์šฉํ•˜์ž!
    <๋ฐœ์ทŒ>

    ์ฒด์ด๋‹ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ํŒ

  1. ๋ณ€์ˆ˜๋ช… ์ž˜ ์ง“๊ธฐ.
    ๊ฐ ๋‹จ๊ณ„์—์„œ ์–ด๋–ค ๊ฒƒ์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์ด๋ฆ„์„ ์ž˜ ์ง€์–ด์•ผ ํ•œ๋‹ค.
  2. ์ถœ๋ ฅํ•ด๋ณด๊ธฐ.
    ์ตœ๊ณ ์˜ ๊ทผ๋ณธ ๋””๋ฒ„๊ทธ print๋ฌธ. ๊ฐ ๋‹จ๊ณ„๋ฅผ ์ถœ๋ ฅํ•ด ๋ณด๋ฉด์„œ ํ™•์ธ.
  3. ํƒ€์ž…์„ ๋”ฐ๋ผ๊ฐ€ ๋ณด๊ธฐ.
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ฒ˜๋Ÿผ ํƒ€์ž…์ด ์—†๋Š” ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋„ ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ๋Š” ํƒ€์ž…์ด ์žˆ๋‹ค. ๋‹ค๋งŒ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์„ ๋ฟ.
    • map()์ด ๋ฆฌํ„ดํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์—๋Š”, ์ฝœ๋ฐฑ์ด ๋ฆฌํ„ดํ•˜๋Š” ํƒ€์ž…์˜ ๊ฐ’.
    • reduce()์˜ ๊ฒฐ๊ณผ๊ฐ’์˜ ํƒ€์ž…์€, ์ดˆ๊ธฐ๊ฐ’์˜ ํƒ€์ž… ๊ทธ๋ฆฌ๊ณ  ์ฝœ๋ฐฑ์ด ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ’์˜ ํƒ€์ž…๊ณผ ๊ฐ™๋‹ค.

<๋ฉ”๋ชจ>
๋ฆฌํŒฉํ† ๋ง ๋œ ๋ชจ์Šต์„ ๋ณด๋‹ˆ ๊น”๋”ํ•˜๊ธด ํ•˜๋„ค...

ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ ์ฒด์ด๋‹ ๋งˆ๋ฌด๋ฆฌ. ์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ์— ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ ์‚ฌ์šฉํ•˜๊ธฐ : update()

347p ~ 370p
<์š”์•ฝ>
๐Ÿ˜‡ reduce() ๋Š” ๊ฐ’์„ ์š”์•ฝํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ๊ฐ’์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

์œ ์ €๊ฐ€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ์žƒ์–ด๋ฒ„๋ ธ์ง€๋งŒ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ถ”๊ฐ€ํ•œ ์ œํ’ˆ์„ ๋ชจ๋‘ ๋ฐฐ์—ด๋กœ ๋กœ๊น…ํ•˜๊ณ  ์žˆ์—ˆ์„ ๋•Œ,
reduce()๋ฅผ ํ™œ์šฉํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๊ณ ,

var itemsAdded = ["shirt", "shoes", "shirt", "socks", "...."];

var shoppingCart = reduce(itemsAdded, {}, addOne);

function addOne(cart, item) {
  if(!cart[item])
    return add_item(cart, {name: item, quantity: 1, price: priceLookup(item)});
  else {
    var quantity = cart[item].quantity;
    return setFieldByName(cart, item, 'quantity', quantity + 1)
  }
}

์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์ฒด์ ์ธ ๋™์ž‘๋„ ์ถ”๊ฐ€ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

var itemOps = [['add', "shirt"], 
               ['add', "shoes"],
               ['remove', "shirt"],
               ['add', "socks"],
               ['remove', "hat"],
              ];

var shoppingCart = reduce(itemOps, {}, function(cart, itemOp) {
  var op = itemOp[0];
  var item = itemOp[1];
  if(op === 'add')    return addOne(cart, item);
  if(op === 'remove') return removeOne(cart, item);
});

function removeOne(cart, item) {
  if(!cart[item])
    return cart;
  else {
    var quantity = cart[item].quantity;
    if(quantity === 1)
      return remove_item_by_name(cart, item);
    else
      return setFieldByName(cart, item, 'quantity', quantity - 1)
  }
}

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ž์ฒ˜๋Ÿผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์œ ์šฉํ•˜๋‹ค.

๐Ÿ˜‡ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ณ ์ฐจํ•จ์ˆ˜ : update()

์ด์ „๊นŒ์ง€์˜ map(), filter(), reduce() ๋Š” ๋ฐฐ์—ด์„ ๋‹ค๋ฃจ๋Š” ๊ณ ์ฐจํ•จ์ˆ˜.
๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด๋ฉด์„œ update()๋ฅผ ๋„์ถœํ•ด๋ณด์ž.

// ์›๋ž˜ ์ฝ”๋“œ
function incrementSize(item) {
  var size = item['size'];
  var newSize = size + 1;
  var newItem = objectSet(item, 'size', newSize);
  return newItem;
}
  1. ์•”๋ฌต์  ์ธ์ž ๋“œ๋Ÿฌ๋‚ด๊ธฐ (์ฝ”๋“œ์˜ ๋ƒ„์ƒˆ)
/// After expressing argument

function incrementField(item, field) {
  var value = item[field];
  var newValue = value + 1;
  var newItem = objectSet(item, field, newValue);
  return newItem;
}
  1. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
/// Extracted

function incrementField(item, field) {
  return updateField(item, field, function(value) {
  return value + 1;
  });
}
  1. ์งœ์ž”.
function updateField(item, field, modify) {
  var value = item[field];
  var newValue = modify(value);
  var newItem = objectSet(item, field, newValue);
  return newItem;
}

// ์ข€ ๋” ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋กœ ๋ณ€๊ฒฝ
/// Called update()

function update(object, key, modify) {
  var value = object[key];
  var newValue = modify(value);
  var newObject = objectSet(object, key, newValue);
  return newObject;
}

๐Ÿ˜‡ ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ update()

function update(object, key, modify) {
  var value = object[key];
  var newValue = modify(value);
  var newObject = objectSet(object, key, newValue);
  return newObject;
}

๊ฐ์ฒด์˜ ํ•˜๋‚˜์˜ ํ‚ค์— ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค. like ์™ธ๊ณผ ์ˆ˜์ˆ 

{
  key1: X1,
  key2: Y1,
  key3: Z1,
}

โฌ‡๏ธ
modifyY()
โฌ‡๏ธ

{
  key1: X1,
  key2: Y2,	// here
  key3: Z1,
}

<๋ฐœ์ทŒ>

<๋ฉ”๋ชจ>
๋‹ค์Œ ์‹œ๊ฐ„์—” update()๋ฅผ ํ™œ์šฉํ•ด์„œ,
์กฐํšŒํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ update()๋กœ ๊ต์ฒดํ•˜๊ธฐ ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•ด๋ณด์ž.

ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ ์ฒด์ด๋‹ ๋งˆ๋ฌด๋ฆฌ. ์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ์— ํ•จ์ˆ˜ํ˜• ๋„๊ตฌ ์‚ฌ์šฉํ•˜๊ธฐ : update(), nestedUpdate(), ๋งˆ๋ฌด๋ฆฌ

371p ~ 394p
<์š”์•ฝ>
๐Ÿ˜‡ "์กฐํšŒํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ update()๋กœ ๊ต์ฒดํ•˜๊ธฐ" ๋ฆฌํŒฉํ„ฐ๋ง

/// Step 1: Identify get, modify, set

function halveField(item, field) {
  var value = item[field];		// get
  var newValue = value / 2;		// modify
  var newItem = objectSet(item, field, newValue);	// set
  return newItem;
}

/// Step 2: Replace with call to update()

function halveField(item, field) {
  return update(item, field, function(value) {
    return value / 2;
  });
}

๐Ÿ˜‡ ์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ์— update() ์‚ฌ์šฉํ•˜๊ธฐ

  • ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•˜๋ฉด ๋œ๋‹ค.
function incrementSize(item) {
  var options = item.options;	// 1. ์กฐํšŒ
  var size = options.size;		// 2. ์กฐํšŒ
  var newSize = size + 1;		// 2. ๋ณ€๊ฒฝ
  var newOptions = objectSet(options, 'size', newSize);	// 2. ์„ค์ • // 1. ๋ณ€๊ฒฝ
  var newItem = objectSet(item, 'options', newOptions);	// 1. ์„ค์ •
  return newItem;
}

/// Refactored

function incrementSize(item) {
  var options = item.options;	// 1. ์กฐํšŒ
  var newOptions = update(options, 'size', increment);	// here // 1. ๋ณ€๊ฒฝ
  var newItem = objectSet(item, 'options', newOptions);	// 1. ์„ค์ •
  return newItem;
}

/// Refactored twice

function incrementSize(item) {
  return update(item, 'options', function(options) {	// here
    return update(options, 'size', increment);
  });
}

๐Ÿ˜‡ update2() ๋„์ถœํ•˜๊ธฐ

  • ์œ„์˜ ๊ฒฐ๊ณผ์™€, ์•”๋ฌต์  ์ธ์ž๋ฅผ ๋“œ๋Ÿฌ๋‚ด๊ธฐ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ด์šฉํ•ด,
    2๋ฒˆ ์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ update2()๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
function incrementSize(item) {	// 1. "Size" -> (option)
  return update(item, 'options', function(options) {
    return update(options, 'size', increment);	// 1. "'size'" -> (option)
  });
}

/// 1. With explicit option argument

function incrementOption(item, option) {	// 2. "increment" -> (modify)
  return update(item, 'options', function(options) {
    return update(options, option, increment);	// 2. "increment" -> (modify)
  });
}

/// 2. With explicit modify argument

function updateOption(item, option, modify) {	// 3-1. "Option" -> (key1)	// 3-2. "option" -> (key2)
  return update(item, 'options', function(options) {	// 3-1. "'options'" -> (key1)		
    return update(options, option, modify);		// 3-2. "option" -> (key2)
  });
}

/// 3. With explicit argument

function update2(object, key1, key2, modify) {
  return update(object, key1, function(value1) {
    return update(value1, key2, modify);
  });
}

/// cc. Original

function incrementSize(item) {
  var options = item.options;
  var size = options.size;
  var newSize = size + 1;
  var newOptions = objectSet(options, 'size', newSize);
  var newItem = objectSet(item, 'options', newOptions);
  return newItem;
}

๐Ÿ˜‡ update3() ๋„์ถœํ•˜๊ธฐ

  • ์—ญ์‹œ๋‚˜ ๊ฐ™์€ ๋ฐฉ๋ฒ•.
function update3(object, key1, key2, key3, modify) {
  return update(object, key1, function(object2) {
    return update2(object2, key2, key3, modify);
  });
}

๐Ÿ˜‡ nestedUpdate() ๋„์ถœํ•˜๊ธฐ

  • ์žฌ๊ท€ ํ˜ธ์ถœ (recursive call)์„ ํ™œ์šฉํ•œ๋‹ค.
function nestedUpdate(object, keys, modify) {
  if(keys.length === 0)	// base case
    return modify(object);
  
  var key1 = keys[0];
  var restOfKeys = drop_first(keys);
  return update(object, key1, function(value1) {
    return nestedUpdate(value1, restOfKeys, modify);
  });
}

๐Ÿ˜‡ ๊นŠ์ด ์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ์— ์ถ”์ƒํ™” ๋ฒฝ ์‚ฌ์šฉํ•˜๊ธฐ

  • ๊นŠ์ด ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ์— nestedUpdate()๋ฅผ ์“ฐ๋ ค๋ฉด ๊ธด key ๊ฒฝ๋กœ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋‹ค.

  • ์ด๊ฒƒ์ด ๋„ˆ๋ฌด ๊ธธ๋ฉด ์ค‘๊ฐ„์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค์ด ์–ด๋–ค ํ‚ค๋ฅผ ๊ฐ€์กŒ๋Š”์ง€, ๊ตฌ์กฐ๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.

    httpGet("http://my-blog.com/api/category/blog", function(blogCategory) {
      renderCategory(nestedUpdate(blogCategory, ['posts', '12', 'author', 'name'], capitalize));
    });

    api๋กœ ๊ฐ€์ ธ์˜จ ๊ฐ’ blogCategory ๋ฅผ ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
    ์ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ดํ•ด๋ฅผ ํ•จ์ถ•ํ•˜๊ณ  ์žˆ๋‹ค.

    1. blogCategory๋Š” posts key ์•„๋ž˜ "๋ธ”๋กœ๊ทธ ๊ธ€"์„ ๋‹ด๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.
    2. ๊ฐ "๋ธ”๋กœ๊ทธ ๊ธ€"์€ ID(12) ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
    3. "๋ธ”๋กœ๊ทธ ๊ธ€"์€ author key ์•„๋ž˜ "๊ธ€์“ด์ด"๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.
    4. "๊ธ€์“ด์ด"๋Š” name key ์•„๋ž˜ "์‚ฌ์šฉ์ž ์ด๋ฆ„"์„ ๋‹ด๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.

    ๊ฒฝ๋กœ๋งŒ ๋ณด๊ณ , ์ด ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค.

  • ๊ทธ๋ž˜์„œ, ์ถ”์ƒํ™” ๋ฒฝ์„ ๋งŒ๋“ค๊ณ  ์˜๋ฏธ์žˆ๋Š” ์ด๋ฆ„์„ ๋ถ™์—ฌ, ๊ตฌํ˜„์„ ๊ฐ์ถ”๊ณ  ๊ธฐ์–ตํ•ด์•ผ ํ•  ์ ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹ค์‹œ ๋งํ•ด, ์ถ”์ƒํ™” ๋ฒฝ์— ์กด์žฌํ•˜๋Š” ํ•จ์ˆ˜ ์ž์‹ ์ด ํ•ด๋‹น ๊ตฌํ˜„์„ ๋ณธ๋ฌธ์— ํ’ˆ๊ณ  ์žˆ์œผ๋ฉด ๋œ๋‹ค.

    1. ์ฃผ์–ด์ง„ ID๋กœ "๋ธ”๋กœ๊ทธ ๊ธ€"์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.
    function updatePostById(category, id, modifyPost) {
      return nestedUpdate(category, ['posts', id], modifyPost);	// modifyPost // ๋ธ”๋กœ๊ทธ ๊ธ€ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ฝœ๋ฐฑ์— ๋งก๊ธด๋‹ค. -> 2.
      				     // key ๊ฒฝ๋กœ ๋ฐฐ์—ด์— ํ•จ์ถ•๋œ category์˜ ๊ตฌ์กฐ๋Š” ์ถ”์ƒํ™” ๋ฒฝ ๋’ค๋กœ ์ˆจ๊ธด๋‹ค.
                         // ์ฆ‰, ์ด ํ•จ์ˆ˜ ์ž์‹ ์ด ์—ฌ๊ธฐ(๋ณธ๋ฌธ)์— ํ’ˆ๋Š”๋‹ค.
    }
    1. ๊ธ€์“ด์ด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.
    function updateAuthor(post, modifyUser) {
      return update(post, 'author', modifyUser);	// modifyUser // ์‚ฌ์šฉ์ž ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋Š” ์ฝœ๋ฐฑ์— ๋งก๊ธด๋‹ค. -> 3.
                 // ๋ธ”๋กœ๊ทธ ๊ธ€์˜ ๊ตฌ์กฐ๋Š” ์ด ํ•จ์ˆ˜ ์ž์‹ ์ด ์—ฌ๊ธฐ(๋ณธ๋ฌธ)์— ํ’ˆ๋Š”๋‹ค.
    }
    1. ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.
    function capitalizeName(user) {
      return update(user, 'name', capitalize);
                 // ์‚ฌ์šฉ์ž์˜ ๊ตฌ์กฐ๋Š” ์ด ํ•จ์ˆ˜ ์ž์‹ ์ด ์—ฌ๊ธฐ(๋ณธ๋ฌธ)์— ํ’ˆ๋Š”๋‹ค.    
    }
    1. ํ•ฉ์น˜๊ธฐ
    updatePostById(blogCategory, '12', function(post) {
      return updateAuthor(post, capitalizeUserName);
    });
  • ๊ธฐ์–ตํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๊ฐ„๋‹จํ•ด ์กŒ๋‹ค.

    • category ์•ˆ์— ๋ธ”๋กœ๊ทธ ๊ธ€์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ ์•Œ์•„๋„ ๋œ๋‹ค. ์–ด๋–ค ํ‚ค์— ์–ด๋–ป๊ฒŒ ๋“ค์–ด์žˆ๋Š”์ง€ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.
    • ๋ธ”๋กœ๊ทธ ๊ธ€์— ๊ธ€์“ด์ด๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ ์•Œ์•„๋„ ๋œ๋‹ค. ์–ด๋–ค ํ‚ค์— ์–ด๋–ป๊ฒŒ ๋“ค์–ด์žˆ๋Š”์ง€ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.

๐Ÿ˜‡ ๊ณ ์ฐจ ํ•จ์ˆ˜ ์ฒญ๋ฆฌ

  • ๋ฐฐ์—ด ์ฒ˜๋ฆฌ
    • forEach(), map(), filter(), reduce()
  • ์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
    • update(), nestedUpdate()
  • copy-on-write ์›์น™ ์ ์šฉ
    • withArrayCopy(), withObjectCopy()
  • try-catch ๋กœ๊น… ๊ทœ์น™ ์ฝ”๋“œํ™”
    • wrapLogging()
      <๋ฐœ์ทŒ>

<๋ฉ”๋ชจ>
๋‹ค์Œ ์‹œ๊ฐ„๋ถ€ํ„ด ๋“œ๋””์–ด ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

ํƒ€์ž„๋ผ์ธ ๊ฒฉ๋ฆฌํ•˜๊ธฐ

395p ~ 419p
<์š”์•ฝ>

ํƒ€์ž„๋ผ์ธ

  • ํƒ€์ž„๋ผ์ธ : "์•ก์…˜์„ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•œ ๊ฒƒ"
  • ํƒ€์ž„๋ผ์ธ ๋‹ค์ด์–ด๊ทธ๋žจ : "์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ์•ก์…˜ ์ˆœ์„œ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œํ•œ ๊ฒƒ"

ํƒ€์ž„๋ผ์ธ ๊ธฐ๋ณธ ๊ทœ์น™

  1. ํƒ€์ž„๋ผ์ธ์—๋Š” ์•ก์…˜๋งŒ ๊ทธ๋ฆฐ๋‹ค.

    • ๊ณ„์‚ฐ์€ ์‹คํ–‰์‹œ์ ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
  2. ๋‘ ์•ก์…˜์ด ์ˆœ์„œ๋Œ€๋กœ ๋‚˜ํƒ€๋‚˜๋ฉด ๊ฐ™์€ ํƒ€์ž„๋ผ์ธ์— ๋„ฃ๋Š”๋‹ค.

sendEmail1();
sendEmail2();
  1. ๋‘ ์•ก์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ˆœ์„œ๋ฅผ ์˜ˆ์ƒํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋ถ„๋ฆฌ๋œ ํƒ€์ž„๋ผ์ธ์— ๋„ฃ๋Š”๋‹ค.
setTimeout(sendEmail1, Math.random()*10000);
setTimeout(sendEmail2, Math.random()*10000);

โžก๏ธ ์•ก์…˜์ด ์„œ๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ, ํ”„๋กœ์„ธ์Šค, ๊ธฐ๊ณ„, ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ ์—์„œ ์‹คํ–‰๋˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž„๋ผ์ธ์— ํ‘œ์‹œํ•œ๋‹ค.

์•ก์…˜ ์ˆœ์„œ์—์„œ ์ฃผ์˜ํ•  ์ 

  1. ++์™€ += ๋Š” ์„ธ ๋‹จ๊ณ„์ด๋‹ค.

    total++
    
    // origin
    var temp = total;	// ์ฝ๊ธฐ (์•ก์…˜)
    temp = temp + 1;	// ๋”ํ•˜๊ธฐ (๊ณ„์‚ฐ)
    total = temp;		// ์“ฐ๊ธฐ (์•ก์…˜)

    โžก๏ธ ๋”ฐ๋ผ์„œ ๋‘ ๊ฐœ์˜ ์•ก์…˜์œผ๋กœ ๋‹ค์ด์–ด๊ทธ๋žจ์— ํ‘œ์‹œํ•ด์•ผ ํ•จ.

  2. ์ธ์ž๋Š” ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด๊ธฐ ์ „์— ์‹คํ–‰ํ•œ๋‹ค.

    console.log(total);
    
    // origin
    temp = total;
    console.log(temp);

    โžก๏ธ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ฝ๋Š” ๊ฒƒ๋„ ์•ก์…˜์ž„์„ ๊ธฐ์–ต.

๋‹ค์ด์–ด๊ทธ๋žจ์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ์„ธ ๋‹จ๊ณ„

  1. ์•ก์…˜์„ ํ™•์ธํ•œ๋‹ค.
    • ๊ณ„์‚ฐ์€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
function add_item_to_cart(name, price, quantity) {
  cart = add_item(cart, name, price, quantity);		// cart ์ฝ๊ธฐ, ์“ฐ๊ธฐ
  calc_cart_total();
}

function calc_cart_total() {
  total = 0;	// total ์“ฐ๊ธฐ
  cost_ajax(cart, function(cost) {	// cart ์ฝ๊ธฐ	// cost_ajax ํ˜ธ์ถœํ•˜๊ธฐ
    total += cost;	// total ์ฝ๊ธฐ, ์“ฐ๊ธฐ
    shipping_ajax(cart, function(shipping) {	// cart ์ฝ๊ธฐ	// shipping_ajax ํ˜ธ์ถœํ•˜๊ธฐ
      total += shipping;	// total ์ฝ๊ธฐ, ์“ฐ๊ธฐ
      update_total_dom(total);	// total ์ฝ๊ธฐ	// update_total_dom ํ˜ธ์ถœํ•˜๊ธฐ
    });
  });
}
  1. ๊ฐ ์•ก์…˜์„ ๊ทธ๋ฆฐ๋‹ค.

    • ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์€ ์ƒˆ๋กœ์šด ํƒ€์ž„๋ผ์ธ์— ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค.

    • ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์ ์„ ์„ ์‚ฌ์šฉํ•œ๋‹ค. (ajax ์ฝœ๋ฐฑ์€ ajax ์š”์ฒญ ์ „์— ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค)

      ๋‹ค๋ฅธ ์˜ˆ์‹œ>

      saveUserAjax(user, function() {
        setUserLoadingDOM(false);	// ์ฝœ๋ฐฑ ๋‚ด์šฉ
      });
      
      setUserLoadingDOM(true);
      
      saveDocumentAjax(document, function() {
        setDocLoadingDOM(false);	// ์ฝœ๋ฐฑ ๋‚ด์šฉ
      });
      
      setDocLoadingDOM(true);

    • ์ฝœ๋ฐฑ์€ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ์ด ๋๋‚˜๋Š” ์‹œ์ ์— ์–ธ์  ๊ฐ€ ์‹คํ–‰๋  ๊ฒƒ์ž„์„ ์œ ์˜.

  2. ๋‹จ์ˆœํ™”ํ•œ๋‹ค.

    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(ํ”Œ๋žซํผ)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ˆœํ™” ๊ทœ์น™ 2๊ฐ€์ง€
      1. ํ•˜๋‚˜์˜ ํƒ€์ž„๋ผ์ธ์— ์žˆ๋Š” ๋ชจ๋“  ์•ก์…˜์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•œ๋‹ค / ์ ์„ ์„ ํƒ€์ž„๋ผ์ธ ๋์œผ๋กœ ์˜ฎ๊ธด๋‹ค.
        (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.)
      2. ํƒ€์ž„๋ผ์ธ์ด ๋๋‚˜๋Š” ๊ณณ์—์„œ ์ƒˆ๋กœ์šด ํƒ€์ž„๋ผ์ธ์ด ํ•˜๋‚˜๋งŒ ์ƒ๊ธด๋‹ค๋ฉด ํ†ตํ•ฉํ•œ๋‹ค.
        (๋‹จ, ํ†ตํ•ฉ ํ›„์—๋Š” ์ฒซ ๋ฒˆ์งธ ๊ทœ์น™์„ ๋‹ค์‹œ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ํƒ€์ž„๋ผ์ธ์— ์•ก์…˜์ด ์ƒ๊ธฐ๋ฉด ๊ฐ ๋ฐ•์Šค๋Š” ์ˆœ์„œ๊ฐ€ ์„ž์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ.)

๋‹ค๋ฅธ ์˜ˆ์‹œ>
์•„๋ž˜๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž„๋ผ์ธ์ด ๋‘ ๊ฐœ ์ƒ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— ํ†ตํ•ฉํ•  ์ˆ˜ ์—†๋‹ค.

์ข‹์€ ํƒ€์ž„๋ผ์ธ์˜ ์›์น™

  1. ์ „์ฒด ํƒ€์ž„๋ผ์ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

    • ํƒ€์ž„๋ผ์ธ ํ•˜๋‚˜๋ผ๋ฉด ์ œ์ผ ์ข‹๊ฒ ์ง€๋งŒ,
    • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ, ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ, ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹  ๋“ฑ์—๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž„๋ผ์ธ์ด ํ•„์š”.
  2. ํƒ€์ž„๋ผ์ธ ๋‚ด ๋‹จ๊ณ„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

    • ๋‹ค๋ฅธ ํƒ€์ž„๋ผ์ธ ๋‹จ๊ณ„์™€์˜ ์‹คํ–‰ ์ˆœ์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  3. ๊ณต์œ ํ•˜๋Š” ์ž์›์ด ์ ์„์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  4. ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค๋ฉด ์„œ๋กœ ์กฐ์œจํ•ด์•ผ ํ•œ๋‹ค.

  5. ์‹œ๊ฐ„์„ ์ผ๊ธ‰์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŠน์„ฑ

  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ.
    • ๋‘ ์•ก์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋  ์ผ์ด ์—†๋‹ค.
    • ๋‹จ ๋น„๋™๊ธฐ ํ˜ธ์ถœ์€, ๋ฏธ๋ž˜์— ์•Œ ์ˆ˜ ์—†๋Š” ์‹œ์ ์— ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ์‹คํ–‰๋˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ.
  • ์ด๋ฒคํŠธ ๋ฃจํ”„ (event loop) ์™€ ์ž‘์—… ํ (job queue)
    - ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ž‘์—… ํ์—์„œ ์ž‘์—… ํ•˜๋‚˜๋ฅผ ๊บผ๋‚ด ์‹คํ–‰ ์™„๋ฃŒํ•˜๊ณ , ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ์ž‘์—…์„ ๊บผ๋‚ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฌดํ•œํžˆ ๋ฐ˜๋ณต.
    - ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ๊ฐœ์˜ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์—†๋‹ค.
    - ์ž‘์—… = ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ + ์ฝœ๋ฐฑ
    - ์ด๋ฒคํŠธ : ๋งˆ์šฐ์Šค ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ, AJAX ์ด๋ฒคํŠธ ๊ฐ™์€ ๊ฒƒ
    - ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ : ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด (e.g. ํด๋ฆญ์— ๋Œ€ํ•œ ์ •๋ณด)
    - ์ฝœ๋ฐฑ : ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜. ์ข€ ๋” ์ž์„ธํžˆ๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰ํ•  ํ•จ์ˆ˜.
    - click ์ด๋ฒคํŠธ ๋™์ž‘ ๊ณผ์ • :
    ์ด๋ฒคํŠธ์— ์ฝœ๋ฐฑ์„ ๋“ฑ๋ก -> ์ด๋ฒคํŠธ ๋ฐœ์ƒ -> ์ž‘์—… ํ์— ์ž‘์—…( ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ(click) + ์ฝœ๋ฐฑ ) ์ถ”๊ฐ€ -> ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ฝœ๋ฐฑ ์‹คํ–‰
    - AJAX ์š”์ฒญ ๋™์ž‘ ๊ณผ์ • :
    AJAX ์š”์ฒญ ํ˜ธ์ถœ -> ๋„คํŠธ์›Œํฌ ์—”์ง„์ด ๊ด€๋ฆฌํ•˜๋Š” ์š”์ฒญ ํ์— ์ถ”๊ฐ€ -> load ๋˜๋Š” error ์ด๋ฒคํŠธ์— ์ฝœ๋ฐฑ์ด ๋“ฑ๋ก ๋จ -> ์ด๋ฒคํŠธ ๋ฐœ์ƒ(์‘๋‹ต ๋„์ฐฉ or ์—๋Ÿฌ) -> ์ž‘์—… ํ์— ์ž‘์—…( ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ(loadorerror) + ์ฝœ๋ฐฑ ) ์ถ”๊ฐ€ -> ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ฝœ๋ฐฑ ์‹คํ–‰
    <๋ฐœ์ทŒ>

์–ธ์–ด๋ณ„ ์‚ฌ์šฉํ•˜๋Š” ์Šค๋ ˆ๋“œ ๋ชจ๋ธ

  1. ๋‹จ์ผ ์Šค๋ ˆ๋“œ, ๋™๊ธฐ
    • ๋ชจ๋“  ๊ฒƒ์ด ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ณ  ์ž…์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•จ.
    • ์‹œ์Šคํ…œ์ด ๋‹จ์ˆœํ•˜๋‹ค๋Š” ์žฅ์  ์žˆ๊ธฐ๋„.
    • ์˜ˆ) PHP
  2. ๋‹จ์ผ ์Šค๋ ˆ๋“œ, ๋น„๋™๊ธฐ
    • ๋น„๋™๊ธฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์ธ๋ฐ๋„ ์ž…์ถœ๋ ฅ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์•„๋„ ๋จ.
    • ๋‹จ, ์ฝœ๋ฐฑ์ด ์–ธ์ œ ์‹คํ–‰๋  ์ง€ ๋ณด์žฅํ•  ์ˆ˜ ์—†์Œ. ๊ทธ๋ž˜์„œ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ๋‹ค๋ฅธ ํƒ€์ž„๋ผ์ธ์œผ๋กœ ํ‘œํ˜„.
    • ์˜ˆ) JavaScript
  3. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ
    • ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์•„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋งค์šฐ ์–ด๋ ค์›€
    • ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž„๋ผ์ธ์„ ์˜๋ฏธ
    • ์˜ˆ) Java, Python, Ruby, C, C#
  4. ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ(message-passing) ํ”„๋กœ์„ธ์Šค
    • ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์‹œ์— ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ ๋ชจ๋ธ ์ง€์›ํ•˜๋ฉด์„œ๋„,
    • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์‹œ์ง€๋กœ ํ†ต์‹ .
    • ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž„๋ผ์ธ์— ์žˆ๋Š” ์•ก์…˜์€ ์ˆœ์„œ๊ฐ€ ์„ž์—ฌ๋„ ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ ํ•˜์ง€ ์•Š์•„ ๋ฌธ์ œ๊ฐ€ ๋ณ„๋กœ ์•ˆ๋จ
    • ์˜ˆ) Elixir(์—˜๋ฆญ์„œ), Erlang(์–ผ๋žญ)
      <๋ฉ”๋ชจ>

ํƒ€์ž„๋ผ์ธ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ๋งˆ๋ฌด๋ฆฌ

420p ~ 440p
<์š”์•ฝ>

ํƒ€์ž„๋ผ์ธ ๋ณด๊ธฐ

  • ํƒ€์ž„๋ผ์ธ์„ ๋‚˜๋ž€ํžˆ ๋†“๊ณ  ๋ณด๋ฉด, ๊ฐ€๋Šฅํ•œ ์‹คํ–‰ ์ˆœ์„œ๋“ค์˜ ์กฐํ•ฉ์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์ž์›์„ ๊ณต์œ ํ•˜๋Š” ํƒ€์ž„๋ผ์ธ

  • ํƒ€์ž„๋ผ์ธ์ด ๋‹ค๋ฅธ ํƒ€์ž„๋ผ์ธ๊ณผ ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค๋ฉด, ๊ทธ ์ž์›์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ๊ณ„๋ผ๋ฆฌ์˜ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.
  • ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ถ€๋ถ„์„ ํ™•์ธํ•˜๊ณ  ์ตœ๋Œ€ํ•œ ์—†์• ์ž.
    1. ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜
    2. ์•”๋ฌต์  ์ธ์ž๋ฅผ ์—†์• ๊ณ  ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
  • ์ ์„ ์œผ๋กœ ์ธํ•ด ํ•ญ์ƒ ๊ฐ™์€ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋˜๋ฉด, ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•œ ์ž์› ๊ณต์œ ๋ฅผ ๋ฒ„๊ทธ์—†์ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ํ™•๋ฅ ์ด ๋†’๋‹ค.

๋น„๋™๊ธฐ ํ˜ธ์ถœ์—์„œ์˜ ๋ช…์‹œ์ ์ธ ์ถœ๋ ฅ

  • ๋น„๋™๊ธฐ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๊ฐ’์€, ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์ž์ฒด์˜ '๋ฆฌํ„ด๊ฐ’'์œผ๋กœ๋Š” ์–ป์„ ์ˆ˜ ์—†๋‹ค.
  • ๋น„๋™๊ธฐ ํ˜ธ์ถœ์€ ๋ฐ”๋กœ ๋ฆฌํ„ด์ด ๋˜์ง€๋งŒ, ์‹ค์งˆ์ ์ธ ๊ฒฐ๊ณผ๊ฐ’์€ ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋˜์–ด์•ผ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๊ทธ๋ž˜์„œ, ์›๋ž˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ํ•˜๋ ค๋˜ ์•ก์…˜์„ ๋น„๋™๊ธฐ ํ˜ธ์ถœ์˜ ์ฝœ๋ฐฑ์œผ๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์‹ค์ œ๋กœ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ›์•„ ์•ก์…˜์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๋‚ด๋ฏ€๋กœ, ๋ช…์‹œ์ ์ธ ์ถœ๋ ฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ๋”๋ถˆ์–ด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์—, "ํ•จ์ˆ˜ ๋ณธ๋ฌธ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ" ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•˜๋Š” ํšจ๊ณผ๋„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
/// Original

function calc_cart_total(cart) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      update_total_dom(total);	// here
    });
  });
}

function add_item_to_cart(name, price, quant) {
  cart = add_item(cart, name, price, quant);
  calc_cart_total(cart);
}

/// With extracted callback

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);	// here
    });
  });
}

function add_item_to_cart(name, price, quant) {
  cart = add_item(cart, name, price, quant);
  calc_cart_total(cart, update_total_dom);
}

<๋ฐœ์ทŒ>

<๋ฉ”๋ชจ>

ํƒ€์ž„๋ผ์ธ ์‚ฌ์ด์— ์ž์› ๊ณต์œ ํ•˜๊ธฐ

441p ~ 468p
<์š”์•ฝ>

๋‹ค์‹œ๋ณด๋Š” ์ข‹์€ ํƒ€์ž„๋ผ์ธ์˜ ์›์น™

  1. ์ „์ฒด ํƒ€์ž„๋ผ์ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  2. ํƒ€์ž„๋ผ์ธ ๋‚ด ๋‹จ๊ณ„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  3. ๊ณต์œ ํ•˜๋Š” ์ž์›์ด ์ ์„์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  4. ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค๋ฉด ์„œ๋กœ ์กฐ์œจํ•ด์•ผ ํ•œ๋‹ค.

    • ํƒ€์ž„๋ผ์ธ์€ ๊ณต์œ  ์ž์›์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•œ๋‹ค === ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ์ž์›์„ ์“ฐ๊ณ  ๋Œ๋ ค์ค€๋‹ค.
  5. ์‹œ๊ฐ„์„ ์ผ๊ธ‰์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค.

Queue() ๋ฅผ ํ†ตํ•ด ๊ณต์œ  ์ž์› ์กฐ์œจํ•˜๊ธฐ

์ž์›์„ ๊ณต์œ ํ•˜๋Š” "์•ก์…˜"๋“ค์ด ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

  • ์กฐ์œจ ์ „ ์ฝ”๋“œ
function add_item_to_cart(item) {
  cart = add_item(cart, item);
  calc_cart_total(cart, update_total_dom);
}

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);
    });
  });
}
  • ํ์—์„œ ์ฒ˜๋ฆฌํ•  ์ž‘์—…์„ ํ์— ๋„ฃ๊ณ , ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ์‹คํ–‰ํ•˜๊ธฐ
function add_item_to_cart(item) {
  cart = add_item(cart, item);
  update_total_queue(cart);		// action
}

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);
    });
  });
}

var queue_items = [];

function runNext() {
  var cart = queue_items.shift();
  calc_cart_total(cart, update_total_dom);
}

function update_total_queue(cart) {		// action
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • ๋‘ ๋ฒˆ์งธ ํƒ€์ž„๋ผ์ธ์ด ์ฒซ ๋ฒˆ์งธ ํƒ€์ž„๋ผ์ธ๊ณผ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๋ง‰๊ธฐ

function add_item_to_cart(item) {
  cart = add_item(cart, item);
  update_total_queue(cart);
}

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);
    });
  });
}

var queue_items = [];
var working = false;	////

function runNext() {
  if(working)			////
    return;				////
  working = true;		////
  var cart = queue_items.shift();
  calc_cart_total(cart, update_total_dom);
}

function update_total_queue(cart) {
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • ๋‹ค์Œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์น˜๊ธฐ.
var queue_items = [];
var working = false;

function runNext() {
  if(working)
    return;
  working = true;
  var cart = queue_items.shift();
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    working = false;	////
    runNext();			////
  });
}

function update_total_queue(cart) {
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • ํ๊ฐ€ ๋น„์—ˆ์„ ๋•Œ ๋ฉˆ์ถ”๊ฒŒ ํ•˜๊ธฐ
var queue_items = [];
var working = false;

function runNext() {
  if(working)
    return;
  if(queue_items.length === 0)	////
    return;						////
  working = true;
  var cart = queue_items.shift();
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    working = false;
    runNext();
  });
}

function update_total_queue(cart) {
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ๋ฒ”์œ„ ์•ˆ์— ๋„ฃ๊ธฐ
function Queue() {		////
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var cart = queue_items.shift();
    calc_cart_total(cart, function(total) {
      update_total_dom(total);
      working = false;
      runNext();
    });
  }

  return function(cart) {		////
    queue_items.push(cart);
    setTimeout(runNext, 0);
  };
}

var update_total_queue = Queue();	////
  • Queue() ์ฝ”๋“œ๋ฅผ ์ผ๋ฐ˜ํ™” - "ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ" ๋ฆฌํŒฉํ„ฐ๋ง.
function Queue(worker) {
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var cart = queue_items.shift();
    worker(cart, function() {		//// done()
      working = false;
      runNext();
    });
  }

  return function(cart) {
    queue_items.push(cart);
    setTimeout(runNext, 0);
  };
}

function calc_cart_worker(cart, done) {		////
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    done(total);	//// done()
  });
}

var update_total_queue = Queue(calc_cart_worker);
  • ์ž‘์—…์ด ๋๋‚ฌ์„ ๋•Œ ์‹คํ–‰ํ•˜๋Š” ์ฝœ๋ฐฑ์„ ๋ฐ›์•„์„œ ์‹คํ–‰ํ•˜๊ธฐ. (queue ์ž์ฒด์˜ ์ž‘๋™์„ ์œ„ํ•œ ๋™์ž‘์„ ํฌํ•จ์‹œ์ผœ์„œ.)
function Queue(worker) {
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var item = queue_items.shift();
    worker(item.data, function(val) {			////
      working = false;
      setTimeout(item.callback, 0, val);		////
      runNext();
    });
  }

  return function(data, callback) {
    queue_items.push({
      data: data,								////
      callback: callback || function(){}		////
    });
    setTimeout(runNext, 0);
  };
}

function calc_cart_worker(cart, done) {
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    done(total);
  });
}

var update_total_queue = Queue(calc_cart_worker);
  • ์œ„์˜ ํ๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ฆด ๋•Œ ์“ฐ๋Š” droppingQueue()
/// Dropping Queue

function DroppingQueue(max, worker) {
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var item = queue_items.shift();
    worker(item.data, function(val) {
      working = false;
      setTimeout(item.callback, 0, val);
      runNext();
    });
  }

  return function(data, callback) {
    queue_items.push({
      data: data,
      callback: callback || function(){}
    });
    while(queue_items.length > max)
      queue_items.shift();
    setTimeout(runNext, 0);
  };
}

function calc_cart_worker(cart, done) {
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    done(total);
  });
}

var update_total_queue = DroppingQueue(1, calc_cart_worker);

์ •๋ฆฌ

  • Queue() ๋Š” ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • Queue() ๋Š” ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ์šด ํƒ€์ž„๋ผ์ธ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ํ•œ ๋ฒˆ์— ํ•œ ํƒ€์ž„๋ผ์ธ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ณ ์ฐจํ•จ์ˆ˜์ด๋‹ค.
  • Queue() ๋Š” ์•ก์…˜์— '์ˆœ์„œ ๋ณด์žฅ' ์ŠˆํผํŒŒ์›Œ๋ฅผ ์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.
  • Queue() ๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋ณธํ˜•(concurrency primitive) ์ด๋‹ค.
    <๋ฐœ์ทŒ>

    ๐Ÿ’ก ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ˜„์‹ค์—์„œ ์ฐฉ์•ˆํ•˜๊ธฐ
    ์ธ๊ฐ„์€ ์–ธ์ œ๋‚˜ ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค. ์ด๋ฅผ ์ฐฉ์•ˆํ•˜์—ฌ, ์ปดํ“จํ„ฐ์—๊ฒŒ๋„ ์ธ๊ฐ„์˜ ๋ฐฉ๋ฒ•๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ž์›์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ํ˜„์‹ค์—์„œ ์–ด๋–ค ์ผ์ด ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ํ•˜๋‚˜๋Š” ์ค„์„ ์„œ๋Š” ๊ฒƒ -> queue๋ฅผ ๋งŒ๋“ค์–ด ์ปดํ“จํ„ฐ๊ฐ€ ์ž‘์—…์„ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ํ•˜๋„๋ก ํ•œ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ
1. ํ•œ ๋ฒˆ์— ํ•œ ๋ช…์”ฉ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ™”์žฅ์‹ค ๋ฌธ์„ ์ž ๊ธ€ ์ˆ˜ ์žˆ๋‹ค.
2. ๊ณต๊ณต ๋„์„œ๊ด€์€ ์ง€์—ญ์‚ฌํšŒ๊ฐ€ ๋งŽ์€ ์ฑ…์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋‹ค.
3. ์น ํŒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ ์ƒ๋‹˜(๊ธฐ๋ก์ž) ํ•œ๋ช…์ด ๊ต์‹ค ์ „์ฒด(์—ด๋žŒ์ž)์— ์ •๋ณด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์‹œ์„ฑ ๊ธฐ๋ณธํ˜•(concurrency primitive)์€ ์ž์›์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

<๋ฉ”๋ชจ>
์ ์  ๋‚จ์€ ํŽ˜์ด์ง€๊ฐ€ ์ค„์–ด๋“ค๊ณ  ์žˆ๋‹ค.

ํƒ€์ž„๋ผ์ธ ์กฐ์œจํ•˜๊ธฐ

469p ~ 490p
<์š”์•ฝ>

๋‹ค์‹œ๋ณด๋Š” ์ข‹์€ ํƒ€์ž„๋ผ์ธ์˜ ์›์น™

  1. ์ „์ฒด ํƒ€์ž„๋ผ์ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  2. ํƒ€์ž„๋ผ์ธ ๋‚ด ๋‹จ๊ณ„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  3. ๊ณต์œ ํ•˜๋Š” ์ž์›์ด ์ ์„์ˆ˜๋ก ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

  4. ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค๋ฉด ์„œ๋กœ ์กฐ์œจํ•ด์•ผ ํ•œ๋‹ค.

    • ํƒ€์ž„๋ผ์ธ์€ ๊ณต์œ  ์ž์›์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•œ๋‹ค === ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ์ž์›์„ ์“ฐ๊ณ  ๋Œ๋ ค์ค€๋‹ค.
  5. ์‹œ๊ฐ„์„ ์ผ๊ธ‰์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค.

Queue() ๋ฅผ ํ†ตํ•ด ๊ณต์œ  ์ž์› ์กฐ์œจํ•˜๊ธฐ

์ž์›์„ ๊ณต์œ ํ•˜๋Š” "์•ก์…˜"๋“ค์ด ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

  • ์กฐ์œจ ์ „ ์ฝ”๋“œ
function add_item_to_cart(item) {
  cart = add_item(cart, item);
  calc_cart_total(cart, update_total_dom);
}

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);
    });
  });
}
  • ํ์—์„œ ์ฒ˜๋ฆฌํ•  ์ž‘์—…์„ ํ์— ๋„ฃ๊ณ , ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ์‹คํ–‰ํ•˜๊ธฐ
function add_item_to_cart(item) {
  cart = add_item(cart, item);
  update_total_queue(cart);		// action
}

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);
    });
  });
}

var queue_items = [];

function runNext() {
  var cart = queue_items.shift();
  calc_cart_total(cart, update_total_dom);
}

function update_total_queue(cart) {		// action
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • ๋‘ ๋ฒˆ์งธ ํƒ€์ž„๋ผ์ธ์ด ์ฒซ ๋ฒˆ์งธ ํƒ€์ž„๋ผ์ธ๊ณผ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๋ง‰๊ธฐ

function add_item_to_cart(item) {
  cart = add_item(cart, item);
  update_total_queue(cart);
}

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);
    });
  });
}

var queue_items = [];
var working = false;	////

function runNext() {
  if(working)			////
    return;				////
  working = true;		////
  var cart = queue_items.shift();
  calc_cart_total(cart, update_total_dom);
}

function update_total_queue(cart) {
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • ๋‹ค์Œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์น˜๊ธฐ.
var queue_items = [];
var working = false;

function runNext() {
  if(working)
    return;
  working = true;
  var cart = queue_items.shift();
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    working = false;	////
    runNext();			////
  });
}

function update_total_queue(cart) {
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • ํ๊ฐ€ ๋น„์—ˆ์„ ๋•Œ ๋ฉˆ์ถ”๊ฒŒ ํ•˜๊ธฐ
var queue_items = [];
var working = false;

function runNext() {
  if(working)
    return;
  if(queue_items.length === 0)	////
    return;						////
  working = true;
  var cart = queue_items.shift();
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    working = false;
    runNext();
  });
}

function update_total_queue(cart) {
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ๋ฒ”์œ„ ์•ˆ์— ๋„ฃ๊ธฐ
function Queue() {		////
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var cart = queue_items.shift();
    calc_cart_total(cart, function(total) {
      update_total_dom(total);
      working = false;
      runNext();
    });
  }

  return function(cart) {		////
    queue_items.push(cart);
    setTimeout(runNext, 0);
  };
}

var update_total_queue = Queue();	////
  • Queue() ์ฝ”๋“œ๋ฅผ ์ผ๋ฐ˜ํ™” - "ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ" ๋ฆฌํŒฉํ„ฐ๋ง.
function Queue(worker) {
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var cart = queue_items.shift();
    worker(cart, function() {		//// done()
      working = false;
      runNext();
    });
  }

  return function(cart) {
    queue_items.push(cart);
    setTimeout(runNext, 0);
  };
}

function calc_cart_worker(cart, done) {		////
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    done(total);	//// done()
  });
}

var update_total_queue = Queue(calc_cart_worker);
  • ์ž‘์—…์ด ๋๋‚ฌ์„ ๋•Œ ์‹คํ–‰ํ•˜๋Š” ์ฝœ๋ฐฑ์„ ๋ฐ›์•„์„œ ์‹คํ–‰ํ•˜๊ธฐ. (queue ์ž์ฒด์˜ ์ž‘๋™์„ ์œ„ํ•œ ๋™์ž‘์„ ํฌํ•จ์‹œ์ผœ์„œ.)
function Queue(worker) {
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var item = queue_items.shift();
    worker(item.data, function(val) {			////
      working = false;
      setTimeout(item.callback, 0, val);		////
      runNext();
    });
  }

  return function(data, callback) {
    queue_items.push({
      data: data,								////
      callback: callback || function(){}		////
    });
    setTimeout(runNext, 0);
  };
}

function calc_cart_worker(cart, done) {
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    done(total);
  });
}

var update_total_queue = Queue(calc_cart_worker);
  • ์œ„์˜ ํ๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ฆด ๋•Œ ์“ฐ๋Š” droppingQueue()
/// Dropping Queue

function DroppingQueue(max, worker) {
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var item = queue_items.shift();
    worker(item.data, function(val) {
      working = false;
      setTimeout(item.callback, 0, val);
      runNext();
    });
  }

  return function(data, callback) {
    queue_items.push({
      data: data,
      callback: callback || function(){}
    });
    while(queue_items.length > max)
      queue_items.shift();
    setTimeout(runNext, 0);
  };
}

function calc_cart_worker(cart, done) {
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    done(total);
  });
}

var update_total_queue = DroppingQueue(1, calc_cart_worker);

์ •๋ฆฌ

  • Queue() ๋Š” ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„ ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • Queue() ๋Š” ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ์šด ํƒ€์ž„๋ผ์ธ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ํ•œ ๋ฒˆ์— ํ•œ ํƒ€์ž„๋ผ์ธ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ณ ์ฐจํ•จ์ˆ˜์ด๋‹ค.
  • Queue() ๋Š” ์•ก์…˜์— '์ˆœ์„œ ๋ณด์žฅ' ์ŠˆํผํŒŒ์›Œ๋ฅผ ์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.
  • Queue() ๋Š” ๋™์‹œ์„ฑ ๊ธฐ๋ณธํ˜•(concurrency primitive) ์ด๋‹ค.
    <๋ฐœ์ทŒ>

    ๐Ÿ’ก ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ˜„์‹ค์—์„œ ์ฐฉ์•ˆํ•˜๊ธฐ
    ์ธ๊ฐ„์€ ์–ธ์ œ๋‚˜ ์ž์›์„ ๊ณต์œ ํ•œ๋‹ค. ์ด๋ฅผ ์ฐฉ์•ˆํ•˜์—ฌ, ์ปดํ“จํ„ฐ์—๊ฒŒ๋„ ์ธ๊ฐ„์˜ ๋ฐฉ๋ฒ•๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ž์›์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ํ˜„์‹ค์—์„œ ์–ด๋–ค ์ผ์ด ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ํ•˜๋‚˜๋Š” ์ค„์„ ์„œ๋Š” ๊ฒƒ -> queue๋ฅผ ๋งŒ๋“ค์–ด ์ปดํ“จํ„ฐ๊ฐ€ ์ž‘์—…์„ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ํ•˜๋„๋ก ํ•œ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ
1. ํ•œ ๋ฒˆ์— ํ•œ ๋ช…์”ฉ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ™”์žฅ์‹ค ๋ฌธ์„ ์ž ๊ธ€ ์ˆ˜ ์žˆ๋‹ค.
2. ๊ณต๊ณต ๋„์„œ๊ด€์€ ์ง€์—ญ์‚ฌํšŒ๊ฐ€ ๋งŽ์€ ์ฑ…์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋‹ค.
3. ์น ํŒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ ์ƒ๋‹˜(๊ธฐ๋ก์ž) ํ•œ๋ช…์ด ๊ต์‹ค ์ „์ฒด(์—ด๋žŒ์ž)์— ์ •๋ณด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์‹œ์„ฑ ๊ธฐ๋ณธํ˜•(concurrency primitive)์€ ์ž์›์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

<๋ฉ”๋ชจ>
์ ์  ๋‚จ์€ ํŽ˜์ด์ง€๊ฐ€ ์ค„์–ด๋“ค๊ณ  ์žˆ๋‹ค.

profile
I think I think too much.

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

comment-user-thumbnail
2023๋…„ 3์›” 13์ผ

๋๊นŒ์ง€ ํŒŒ์ดํŒ…!

1๊ฐœ์˜ ๋‹ต๊ธ€