๐ŸŽ„ ์„ฑ์žฅ์ผ์ง€ 3.1

์ฑ… ํ–‰๋ณตํ•œ ์ด๊ธฐ์ฃผ์˜์ž(์›จ์ธ ๋‹ค์ด์–ด)์˜ ๋‚ด์šฉ์— ์ž๊ทน๋ฐ›์•„ ์‹œ์ž‘ํ•˜๋Š” ์†Œ๋ฐ•ํ•œ ์„ฑ์žฅ๊ธฐ๋ก

์‚ด์•„์žˆ๋Š” ๊ฝƒ๊ณผ ์ฃฝ์€ ๊ฝƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•˜๋Š”๊ฐ€?
์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์‚ด์•„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
์ƒ๋ช…์˜ ์œ ์ผํ•œ ์ฆ๊ฑฐ๋Š” ์„ฑ์žฅ์ด๋‹ค!

๐ŸŒณ ํ‚ค์›Œ๋“œ (1.0)
์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌ, ์ถ”ํ›„์— ๋ณด๋ฉด์„œ ์Šค์Šค๋กœ ์„ค๋ช…
๐Ÿ‰ ๊ฒฝํ—˜ ์œ„์ฃผ๋กœ (2.0)
๋‹จ์ˆœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹ค ๋ฌด์—‡์„ ๋ฐฐ์› ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์งง๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ
โ„๏ธ ์ •ํ•ด์ง„ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ์„œ (3.0)
ํ‚ค์›Œ๋“œ, ๊ฒฝํ—˜ ๋ชจ๋‘ ์ข‹๋‹ค. ๋‹ค๋งŒ ๋งค์ผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๋งˆ์Œ ๋จน์€๋งŒํผ ํ•ต์‹ฌ๋งŒ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑ (3.1) 230102๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ํ•™์Šต์— ๊ด€ํ•œ ๋‚ด์šฉ ์ถ”๊ฐ€

๐Ÿ”‘ ์˜ค๋Š˜์˜ ํ‚ค์›Œ๋“œ

ํ•จ์ˆ˜ ํ•ฉ์„ฑ

  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ž˜๊ฒŒ ๋‚˜๋ˆ„์–ด์ง„ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋“ค์„ ์กฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๊ณ ์ฐจํ•จ์ˆ˜

  • ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›๋Š” ํ•จ์ˆ˜
  • ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  • ์ธ์ž๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ํ•„์š”ํ•œ ์‹œ์ ์— ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํด๋กœ์ €๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด์ด๊ธฐ์— ๊ฐ€๋Šฅํ•˜๋‹ค!

์ปค๋ง(Currying)

  • ์ปค๋ง์€ f(a, b, c)์ฒ˜๋Ÿผ ๋‹จ์ผ ํ˜ธ์ถœ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ f(a)(b)(c)์™€ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ์ธ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์„ธ์Šค๋กœ ํ˜ธ์ถœ๋œ ํ›„ ๋ณ‘ํ•ฉ๋˜๋„๋ก ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ด์•ผํ•  ๊ฐ’์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ์ถ”๋Š” ์—ญํ• ๋กœ ์“ฐ์ด๋Š” ๋Š๋‚Œ!(ํด๋กœ์ €๋กœ ์ €์žฅํ•ด๋‘๋Š” ๋Š๋‚Œ)

๋ถˆ๋ณ€์„ฑ(Immutability)

  • ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์„ฑ์งˆ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์›์‹œ ํƒ€์ž…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ–๋Š”๋‹ค.
  • ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€๋ณ€์„ฑ์„ ๊ฐ–๋Š”๋‹ค.
  • ๋ถˆ๋ณ€ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Object.freeze(), rest parameter์„ ํ†ตํ•œ ๊ฐ์ฒด ๋ฐ˜ํ™˜ ๋“ฑ์˜ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์ˆœ์ˆ˜ํ•จ์ˆ˜(Pure Function)

  • ๋ถ€์ˆ˜ ํšจ๊ณผ(side effect)๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜.
  • ์–ด๋–ค ํ•จ์ˆ˜์— ๋™์ผํ•œ ์ธ์ž๋ฅผ ์ฃผ์—ˆ์„ ๋•Œ, ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
  • ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜ํ•™์—์„œ ๋ฐฐ์šฐ๋˜ ํ•จ์ˆ˜์˜ ๊ฐœ๋…

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ๋ถ€์ˆ˜ ํšจ๊ณผ(side effect)๋ฅผ ์—†์• ๊ณ  ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ชจ๋“ˆํ™” ์ˆ˜์ค€์„ ๋†’์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

์ฐธ์กฐ ํˆฌ๋ช…์„ฑ(Referential Transparency)

  • ํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜์˜ ์™ธ๋ถ€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๊ฒƒ
  • ๋™์ผํ•œ ์ž…๋ ฅ์— ๋Œ€ํ•ด ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„ฑ์งˆ

์ฐธ๊ณ ์ž๋ฃŒ

๐Ÿ“ ์š”์•ฝ ๋ฐ ํ•˜๋ฃจ ๊ฐ„๋‹จ ํšŒ๊ณ 

์™€โ€ฆ ๊ทธ๋ž˜๋„ ์ด์ œ ์–ด๋Š์ •๋„ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์“ฐ๋Š” ๋ฒ•์„ ์•Œ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌผ๋ก  ์•„์ง ๋‹จ์ˆœํ•˜๊ฒŒ ๊ฐ์ฒด ํ•˜๋‚˜์˜ ํ–‰๋™์„ ์ •์˜ํ•˜๊ณ  ๊ทธ ์ƒํƒœ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ •๋„๋‹ค. ์ข€๋” ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋‚ด๊ฐ€ ์š”์ฒญํ•˜๊ณ ์žํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ž˜ ๋‚˜๋ˆ„๊ณ  ๊ทธ์— ๋Œ€ํ•œ ์ฑ…์ž„ ๋ถ„๋ฐฐ๋ฅผ ์ž˜ํ•ด์„œ ์ข€๋” ์œ ์—ฐํ•œ ๊ฐ์ฒด ๊ฐ„ ํ˜‘๋ ฅ์ด ์ด๋ฃจ์–ด์ง€๋„๋ก ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค!
๊ฐ์ฒด์ง€ํ–ฅ์œผ๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ์ž‘์„ฑํ•ด๋ณด๋ คํ•˜๋Š”๋ฐ, ์‰ฝ์ง€๊ฐ€ ์•Š๋‹ค. ๊ทธ๋‚˜๋งˆ ํ…Œ์˜ค์˜ ๊ธ€๋“ค ๋•๋ถ„์— ์กฐ๊ธˆ์”ฉ ์ง„๋„๊ฐ€ ๋‚˜๊ฐ€๊ณ  ์žˆ๋‹ค! ํ—Œ๋ฐ ์Šต๊ด€์ ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ๊ฐ–๋Š” ์ƒํƒœ๋‚˜ ํ–‰๋™๋“ค์„ ํ•จ์ˆ˜ํ˜•์— ํด๋กœ์ €๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜์–ด์„œ ์ปค๋ง ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฒŒ ์˜ณ์€ ๊ฑด์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ๋ญ”๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ€๋…์„ฑ์€ ๊ทธ๋‹ฅ ์•ˆ์ข‹์€ ๋Š๋‚Œ..? ๋‚ด์ผ์€ ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋„ ์ฐพ์•„๋ณด๋ ค ํ•œ๋‹ค. ์ถ”๊ฐ€๋กœ ์ˆœ์ˆ˜ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์•„์ง ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด ์ด๋ ‡๊ฒŒ ๊ธฐ๋กํ•ด๋‘”๋‹ค.(์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค, ์ปค๋ฎค๋‹ˆํ‹ฐ์—๋„ ์˜ฌ๋ ธ์ง€๋งŒ ์•„์ง ๋ช…๋ฐฑํ•œ ๋‹ต์€ ๋ชป๋ฐ›์•˜๋‹ค..!)

์•„๋ž˜์—์„œ ํ•จ์ˆ˜ b๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์ธ๊ฐ€?!

const a = (x) => x;

const b = (y) => {
  const outerValue = a(1);
  return y + outerValue;
};

์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์˜ฌ๋ฆฐ ๋‚˜์˜ ์ƒ๊ฐ..!

๋‹จ์ˆœํ•˜๊ฒŒ a๋ผ๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด ์‚ฌ์šฉํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ˆœ์ˆ˜ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ์–ด์š”! 
๋‹ค๋งŒ, a๊ฐ€ const๋กœ ์„ ์–ธ๋˜์—ˆ๊ธฐ์— ๋‹ค์‹œ ์ดˆ๊ธฐํ™”๋  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๊ณ  b ๋‚ด๋ถ€์—์„œ ๊ณ ์ •๋œ 1์ด๋ผ๋Š” ์ธ์ž๋ฅผ ์ „๋‹ฌ ์ค‘์ด๋‹ˆ,
b๋Š” ์–ธ์ œ๋‚˜ ๊ฐ™์€ input์— ๋Œ€ํ•ด  ๊ฐ™์€ output์ด ๋‚˜์˜ค๋‹ˆ๊นŒ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ผ๊ณ  ํ•  ์ˆ˜๋„ ์žˆ๋‚˜ ์‹ถ์–ด์„œ์š”..!

์ถ”๊ฐ€)

์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์•Œ๊ฒŒ ๋˜์–ด ์‹ค์ œ๋กœ ๋ต™๊ณ  ์ •๋ง ์ •๋ง ์กด๊ฒฝํ•˜๊ฒŒ ๋œ ์‹œ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋ถ„๊ป˜ ๋“ค์€ ๋Œ€๋‹ต!!!(๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ํ…Œ์˜ค!)

์ˆœ์ˆ˜ํ•จ์ˆ˜์˜ ์ •์˜์— ๋”ฐ๋ผ ๋ชจ๋“  ์™ธ๋ถ€์ธ์ž๋“ค์„ ๋ช…์‹œ์ ์ธ ์ธ์ž๋กœ ๋งŒ๋“ค๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ์‹ค๋ฌด์—๋Š” ๊ดœํ•œ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๊ฒŒ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ง€๊ธˆ์ฒ˜๋Ÿผ ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์žˆ๋Š” ๊ฐ’์„ ๋ช…์‹œ์ ์ธ ์ธ์ž๊ฐ€ ์•„๋‹Œ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ณดํ†ต์ด๊ณ  ๊ณ ๋ฏผ์ด ๋ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์™ธ๋ถ€์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์ˆ˜๋ผ๋ฉด ์‚ฌ์‹ค ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋ฉด ์—ญ์‹œ ์ˆœ์ˆ˜ํ•จ์ˆ˜๊ฐ€ ๋ ํ…Œ๋‹ˆ๊นŒ์š”.
๊ทธ๋ž˜์„œ ์ง€๊ธˆ์˜ ์ฝ”๋“œ์ƒ์—์„œ๋Š” aํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์€ ๋ฌธ์ œ๋ ๊ฒŒ ์—†์Šต๋‹ˆ๋‹ค. aํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์ด๋ฏ€๋กœ a(1)์˜ ๊ฐ’์€ ์–ธ์ œ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ์— ์ƒ์ˆ˜๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜คํžˆ๋ ค ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ outerValue๋ผ๊ณ  ํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. outerValue๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ๊ฐ™์€ bํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋ผ๋„ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
outerValue๊ฐ€ ์ƒ์ˆ˜๋ผ๋ฉด ๋ฌธ์ œ๋ ๊ฒƒ ์—†์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์˜ ์ž˜ํ•œ ์ 

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

์˜ค๋Š˜์˜ ์•„์‰ฌ์šด ์ 

  • ๊ตฌํ˜„ํ•˜๋Š๋ผ ์ธ๊ฐ•์„ ๋ชป๋“ค์—ˆ๋‹ค ใ… 
  • ์‹ ๋ฌธ์„ ์š” ๋ช‡์ผ ๊ฑด๋„ˆ๋›ฐ์—ˆ๋‹คโ€ฆ ๋น ๋ฅด๊ฒŒ ํ›‘์ž!
  • ์ƒˆ๋ฒฝ 6์‹œ ํ—ฌ์Šค์žฅ ๋„˜๋‚˜ ๊ฐ€๊ธฐ ํž˜๋“ค๋”โ€ฆ ์กฐ๊ธˆ๋งŒ ๋”ฐ๋œปํ•ด์ง€๋ฉด ๋” ์‰ฌ์šธ ๊ฑฐ ๊ฐ™์œผ๋‹ˆ ๊ดœ์ฐฎ๋‹ค!