๐Ÿคฟ (9) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ์ปค๋งํ•จ์ˆ˜

Kayยท2023๋…„ 5์›” 10์ผ
0

Javascript

๋ชฉ๋ก ๋ณด๊ธฐ
10/12

์ฝ”๋“œ์Šคํ…Œ์ด์ธ  ๋ถ€ํŠธ์บ ํ”„๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ "์ปค๋งํ•จ์ˆ˜"์™€ "๊ณ ์ฐจํ•จ์ˆ˜ ์‚ฌ๊ณ  ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”"์— ๋Œ€ํ•ด ํ•™์Šตํ•˜์˜€๋‹ค.

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

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ๊ฐ์ฒด์ง€ํ–ฅ ๋ชจ๋ธ ์–ธ์–ด์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ES6 ์ดํ›„ class ๋ฌธ๋ฒ•์˜ ๋“ฑ์žฅ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ํ˜•ํƒœ๋กœ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค.
React์—์„œ๋„ ํด๋ž˜์Šค ๋ฌธ๋ฒ•์„ ์ ๊ทน ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ด์—ˆ๋˜ ๋•Œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ตœ๊ทผ hook์˜ ๋“ฑ์žฅ์œผ๋กœ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ฃผ๊ฐ€ ๋˜์—ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์š”์ฆ˜ ํŠธ๋ Œ๋“œ(?)๋ผ๋Š” ์†Œ๋ฌธ์„ ์ ‘ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

์ด์— ๋Œ€ํ•ด ์ •๋ฆฌ๋œ ์œ ํŠœ๋ธŒ๊ฐ€ ์žˆ์–ด ๋ณด๊ณ  ๊ฐ„๋žตํžˆ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

๋“œ๋ฆผ์ฝ”๋”ฉ - ํ•จ์ˆ˜ํ˜•ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋Œ€์„ธ๋‹ค?! (ํ•จ์ˆ˜ํ˜• vs ๊ฐ์ฒด์ง€ํ–ฅ)

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

  • ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ํ•จ์ˆ˜ํ˜• ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

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

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ํŠนํ™”๋œ ์–ธ์–ด

  • Haskell, F#, OCaml, Erlang ...

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” ์–ธ์–ด

  • Javascript, Kotlin, Go, Python, Java, C++ ...
    • Java๋‚˜ C++๋Š” ์ตœ๊ทผ ํ•จ์ˆ˜ํ˜•์ด ์ถ”๊ฐ€๋จ

๋น ๋ฅด๊ฒŒ ๋ณด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ฐ„๋žตํ•œ ์—ญ์‚ฌ

1958๋…„ ์ฒซ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ธ LISP์˜ ๋“ฑ์žฅ์€ C์–ธ์–ด๋ณด๋‹ค๋„ 10์—ฌ๋…„ ์ด์ƒ ๋น ๋ฅด๋ฉฐ, ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ณด๋‹ค ๋“ฑ์žฅ์ด ๋น ๋ฅด๋‹ค.

ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ˆ˜ํ•™์˜ ์›๋ฆฌ์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด์žˆ๊ธฐ์— ๋ฐฐ์šฐ๊ธฐ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉฐ ๋‚œํ•ดํ•˜๊ฒŒ ์—ฌ๊ฒจ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ๋žŒ์˜ ์‚ฌ๊ณ ๋ฐฉ์‹๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค๊ณ  ์—ฌ๊ฒจ์ง€๊ธฐ์— ๋” ๋ณดํŽธ์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ตœ๊ทผ ๋“ค์–ด ๋น„ํŠธ์ฝ”์ธ, AI์˜ ๋“ฑ์žฅ์œผ๋กœ ๋ฐฉ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•ด์„œ ๋ณ‘๋ ฌ์ , ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์ง€๋ฉด์„œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋‹ค์‹œ ์ฃผ๋ชฉ์„ ๋ฐ›์•˜๋‹ค.

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

  1. ์ˆœ์ˆ˜ํ•จ์ˆ˜
  • ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ์ƒํƒœ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ์™ธ๋ถ€์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์Œ
  • ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์–ธ์ œ ์„ ์–ธ์ด ๋˜์—ˆ๋Š”์ง€, ์™ธ๋ถ€์— ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ๋ง์•„์•ผ ํ•จ
    cf) ํ•จ์ˆ˜์—์„œ ํ•จ์ˆ˜ ๋ฐ–์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ์Œ
  1. ๋ถˆ๋ณ€์„ฑ
  • ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์ธ์ž๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ƒˆ๋กœ์šด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ „๋‹ฌํ•ด์•ผ ํ•จ
    • JS Object freeze ๋‚ด์žฅํ•จ์ˆ˜
  1. Expression (if, switch, for.. ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)

  2. ์ผ๊ธ‰ ๊ฐ์ฒด์˜ ํŠน์ง•๊ณผ ๊ณ ์ฐจํ•จ์ˆ˜์˜ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•จ

[์ผ๊ธ‰ ๊ฐ์ฒด์˜ ์กฐ๊ฑด]

  • ๋ณ€์ˆ˜์— ํ• ๋‹น(assignment)ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž(argument)๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋กœ์จ ๋ฆฌํ„ด๋  ์ˆ˜ ์žˆ๋‹ค.

[๊ณ ์ฐจํ•จ์ˆ˜]

  • ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜

์ปค๋ง ํ•จ์ˆ˜

์ปค๋ง ํ•จ์ˆ˜๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์ „์— ์™œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ์•„๋ณธ ์ด์œ ๋Š” ์ปค๋ง(currying) ํ•จ์ˆ˜๋ผ๋Š” ์ด๋ฆ„์ด ํ•˜์Šค์ผˆ ์ปค๋ฆฌ(Haskell Brooks Curry)๋ผ๋Š” ๋ถ„์œผ๋กœ ๋ถ€ํ„ฐ ์œ ๋ž˜ ๋๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

tistory - ์™œ ์ปค๋ง (currying) ์ด ๋” ์ข‹์•„?
ํ•˜์Šค์ผˆ ์ปค๋ฆฌ๋Š” ํ•˜์Šค์ผˆ์ด๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฉฐ, ํ•˜์Šค์ผˆ์—์„œ๋Š” ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ 1๊ฐœ๋กœ ๊ฐ•์ œํ•˜์—ฌ ์ปค๋งํ•จ์ˆ˜(ํ•ฉ์„ฑํ•จ์ˆ˜)๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฝ๋‹ค๊ณ  ํ•œ๋‹ค.

์ฆ‰, ์ปค๋งํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปค๋ง ํ•จ์ˆ˜ ์ฝ”๋“œ

javascript info - ์ปค๋ง

์ปค๋ง ํ•จ์ˆ˜ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ

function curry(f) { // ์ปค๋ง ๋ณ€ํ™˜์„ ํ•˜๋Š” curry(f) ํ•จ์ˆ˜
  return function(a) {
    return function(b) {
      return f(a, b);
    };
  };
}

// usage
function sum(a, b) {
  return a + b;
}

let curriedSum = curry(sum);

alert( curriedSum(1)(2) ); // 3

lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉํ•˜๊ธฐ

function sum(a, b) {
  return a + b;
}

let carriedSum = _.curry(sum);

์ปค๋ง ํ•จ์ˆ˜์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

๊ฐœ์ธ๋ธ”๋กœ๊ทธ - ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ปค๋ง(Currying) ๊ธฐ๋ฒ• ์ดํ•ดํ•˜๊ธฐ(feat.์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ)
์žฅ์ 

  • ์žฌํ™œ์šฉ์„ฑ ์ฆ๊ฐ€
  • ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ (์ฝ”๋“œ ์–‘ ๊ฐ์†Œ)
  • ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

๋‹จ์ 

  • ์ปค๋ง์„ ๊ณผ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์™€ ์†๋„์— ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ

๊ทธ๋ž˜์„œ ์™œ ์ปค๋งํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ๊นŒ?

์•ž์„œ ์ •๋ฆฌํ–ˆ๋˜ ๋“œ๋ฆผ์ฝ”๋”ฉ์˜ ์˜์ƒ ๋งˆ์ง€๋ง‰ ๋‚ด์šฉ์„ ์ธ์šฉํ•˜๋ฉฐ ์ด ๊ธ€์„ ๋งˆ๋ฌด๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

UI ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŠน์„ฑ์ƒ ๋งŽ์€ ์ƒํƒœ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋งŒ์„ ์ด์šฉํ•ด์„œ๋Š” ์กฐ๊ธˆ ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๊ธฐ์—, ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์™€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ณด๋‹ค ์•ˆ์ •์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค!

์ถœ์ฒ˜
tistory - ์™œ ์ปค๋ง (currying) ์ด ๋” ์ข‹์•„?
javascript info - ์ปค๋ง
velog - [JavaScript] - ์ปค๋ง์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž
tistory - ์ปค๋ง(currying)
github - [Swift]์ปค๋ง(Currying)์ด๋ž€?
๊ฐœ์ธ๋ธ”๋กœ๊ทธ - ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ปค๋ง(Currying) ๊ธฐ๋ฒ• ์ดํ•ดํ•˜๊ธฐ(feat.์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ)

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