λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/Javascript & NodeJS

[Javascript] ν•¨μˆ˜ : Currying (컀링)

by vodkassi 2021. 5. 9.
728x90

✨ Curry ν•¨μˆ˜λž€?

 

ν•¨μˆ˜λ₯Ό λ°˜ν™˜(return)ν•˜λŠ” κ³ μ°¨ν•¨μˆ˜μ˜ 일쒅이닀.

μ΄λ•Œ, λ°˜ν™˜λ˜λŠ” ν•¨μˆ˜λ₯Ό ν΄λ‘œμ €(Closure)라고 μΉ­ν•˜κΈ°λ„ ν•œλ‹€.

 

function curry(func) {  // curry() λŠ” μ»€λ¦¬ν•¨μˆ˜μ΄λ‹€
  return (function closure(something){  // callback() λŠ” ν΄λ‘œμ €μ΄λ‹€
      return (console.log(something))
  })
}

 

✨ Currying(컀링)μ΄λž€?

μ—¬λŸ¬ 개의 λ§€κ°œλ³€μˆ˜λ₯Ό 단일 ν˜ΈμΆœμ— μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό, 각각의 λ§€κ°œλ³€μˆ˜κ°€ κ°œλ³„λ‘œ 호좜될 수 μžˆλ„λ‘ λ³€ν™˜ν•˜λŠ” μž‘μ—…μ„ 컀링(Currying)이라고 ν•œλ‹€.

 

function sum(a, b) {  // 일반 ν•¨μˆ˜ sum() 을 μ»€λ§ν•˜μ—¬ λ³€ν™˜ν•΄λ³΄λ„λ‘ ν•œλ‹€.
  return a + b;
}

function curry(func) { // func μ•ˆμ—λŠ” 컀링을 ν•  ν•¨μˆ˜κ°€ λ“€μ–΄μ˜€κ²Œ λœλ‹€.
  return function(a) {
    return function(b){
    	return func(a, b);
    }
  }
}

let curriedSum = curry(sum);
// curriedSum 의 ν™˜κ²½ μ•ˆμ—λŠ” sum 이 μ €μž₯λ˜μ—ˆλ‹€.
// curriedSumμ—λŠ” curry(sum)의 ν˜ΈμΆœκ°’μΈ function(a)κ°€ μ €μž₯λ˜μ–΄ μžˆλ‹€.

let firstNum = curriedSum(1);
// a λΌλŠ” λ§€κ°œλ³€μˆ˜ μ•ˆμ— 1이 인자둜 λ“€μ–΄κ°€κ²Œ λ˜μ—ˆλ‹€.
// firstNum의 ν™˜κ²½ μ•ˆμ—λŠ” sum κ³Ό 1 이 μ €μž₯λ˜μ—ˆλ‹€.
// firstNumμ—λŠ” function(a) 의 ν˜ΈμΆœκ°’μΈ function(b)κ°€ μ €μž₯λ˜μ–΄ μžˆλ‹€.

let secondNum = firstNum(2);
// b λΌλŠ” λ§€κ°œλ³€μˆ˜ μ•ˆμ— 2κ°€ 인자둜 λ“€μ–΄κ°€κ²Œ λ˜μ—ˆλ‹€.
// function(b) 의 ν˜ΈμΆœκ°’μ€ func(a, b) μ˜€μœΌλ―€λ‘œ, sum(1, 2)κ°€ μ‹€ν–‰λ˜μ–΄ λ°˜ν™˜λœλ‹€.
// sum(1, 2) 의 결과값은 3이닀.

console.log(secondNum) // 3

// 이 과정은 λ‹€μŒκ³Όλ„ κ°™λ‹€.
console.log(curriedSum(1)(2) // 3

 

μœ„μ˜ μ˜ˆμ œμ—μ„œ curriedSum λ˜λŠ” firstNum 처럼 μ΅œμ’…κ°’μ΄ λ°˜ν™˜λ˜κΈ° 이전, μΈμžκ°€ κ³ μ •λœ ν™˜κ²½μ— μ ‘κ·Όν•  수 μžˆλŠ” ν΄λ‘œμ €λ₯Ό "partial" 이라고 μΉ­ν•œλ‹€.

 

✨ 컀링의 μž₯점

ν•¨μˆ˜μ— μ—¬λŸ¬ 개의 μΈμžκ°€ 전달될 경우, νŠΉμ • 값을 "κ³ μ •"μ‹œν‚΄μœΌλ‘œμ¨ ν•¨μˆ˜μ˜ 변동성을 쀄이고 μ•ˆμ „μ„±μ„ 높일 수 μžˆλ‹€. λ˜ν•œ, κΈ° μž‘μ„±λœ ν•¨μˆ˜λ₯Ό μ‰½κ²Œ μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

✨ 마무리 

μ—¬λŸ¬ 개의 ν•¨μˆ˜λ₯Ό μ€‘μ²©ν•΄μ„œ μ‚¬μš©ν•˜λ©΄ κ΅¬ν˜„ν•˜κ³ μž ν•˜λŠ” κΈ°λŠ₯ λ˜λŠ” μ½”λ“œμ˜ νš¨μœ¨μ„±μ„ 높일 수 μžˆμ„ 것이닀.

μ•Œκ³ λ¦¬μ¦˜μ„ ν’€ λ•Œ μž‘μ„±ν•˜λŠ” ν•¨μˆ˜μ™€λŠ” λ‹€μ†Œ λ‹€λ₯Έ 접근이 ν•„μš”ν•˜λ©°, 전달될 κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜λŠ” 인자의 변동성을 νŠΉνžˆλ‚˜ 더 κ³ λ €ν•΄μ•Ό ν•  것이닀.

 

참고자료

μ½”μ–΄ μžλ°”μŠ€ν¬λ¦½νŠΈ - 컀링

λŒ“κΈ€