๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Front-end/JS

์ปค๋ง Currying ๊ณผ ํด๋กœ์ €

by ciocio 2022. 4. 11.

๐Ÿ“ ํด๋กœ์ € ๊ฐ„๋‹จ ๋ณต์Šต

ํด๋กœ์ €๋Š”,
ํ˜„์žฌ์˜ ์œ ํšจ๋ฒ”์œ„๋ฅผ ๋„˜์–ด ์Šค์ฝ”ํ”„ ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” "ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์–ดํœ˜์  ํ™˜๊ฒฝ์˜ ์กฐํ•ฉ" ์œผ๋กœ ์ •์˜๋œ๋‹ค.

โœ” ์žฅ์ 
•  ํ•จ์ˆ˜ ๋‚ด์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
•  ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์€๋‹‰ ๊ฐ€๋Šฅ

โœ” ๋‹จ์ 
•  ํด๋กœ์ € ํ•จ์ˆ˜๋ฅผ ๋‚จ๋ฐœํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

๐Ÿ“Œ ์ปค๋ง์„ ๊ณต๋ถ€ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ

 

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์€์—ฐ์ค‘์— ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑด ์•ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋ƒ๋Š” ์งˆ๋ฌธ์—๋Š” ์ž์‹ ์žˆ๊ฒŒ ๋Œ€๋‹ต์„ ๋ชปํ•˜๊ฒ ๋”๋ผ .. ใ…Ž 

๊ทธ๋ž˜์„œ ์‹ค์ œ ํด๋กœ์ € ์˜ˆ์‹œ๋ฅผ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค !-!

 

 

๐Ÿ“Œ ์ปค๋ง Currying

์ปค๋ง์€ f(a, b, c) ์ฒ˜๋Ÿผ ๋‹จ์ผ ํ˜ธ์ถœ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ
f(a)(b)(c) ์™€ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ์ธ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์„ธ์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ปค๋ง์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์ง€ ๋ณ€ํ™˜ํ•  ๋ฟ์ด๋‹ค.

 

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

// ์‹ค์ œ ํ•จ์ˆ˜
function sum(a, b){
  return a + b;
}

let curriedSum = curry(sum);     // ํ•จ์ˆ˜ ๋ณ€ํ™˜ !

console.log( curriedSum(1)(2) )  // 3

 

์ธ์ž ๋”ฐ๋กœ๋”ฐ๋กœ ์ฃผ๋ฉด ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋‚˜ ๊ถ๊ธˆํ•ด์„œ ํ•ด๋ดค๋‹ค ใ…‡ใ……ใ…‡

 

๊ทผ๋ฐ ๊ทธ๋ž˜์„œ ์ด๊ฑฐ ์™œ ์“ด๋‹ค๊ณ  ..?

๊ตณ์ด ์ด๋ ‡๊ฒŒ ์ธ์ž ๋‚˜๋ˆ ๊ฐ€๋ฉด์„œ ๊นŒ์ง€ ์ปค๋ง์„ ์จ์•ผํ•˜๋‚˜ ์‹ถ์Œ.

 


๐Ÿ”— ์‹ค์ œ (์ปค๋ง์„ ์“ฐ๋ฉด ํŽธ๋ฆฌํ•œ) ์˜ˆ์‹œ

 

// ์ •๋ณด๋ฅผ ํ˜•์‹ํ™”ํ•˜๊ณ  ์ถœ๋ ฅํ•˜๋Š” ๋กœ๊ทธ ํ•จ์ˆ˜ log(date, importance, message) ๊ฐ€์ •
// ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋Ÿฐ ํ•จ์ˆ˜๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต!-!
// (lodash์˜ curryingํ•จ์ˆ˜์˜ ๋„์›€์„ ๋ฐ›์•„ ๊ตฌํ˜„)

import _ from 'lodash';

function log(date, importance, message){
  alert(`[${date.getHours()}:${date.getMinutes()}] [${importance}] ${message}`);
}

let log = _.curry(log);

log(new Date(), "DEBUG", "some debug");  // log(a, b, c);
log(new Date())("DEBUG")("some debug");  // log(a)(b)(c);

// partially ์ ์šฉ๋œ ํ•จ์ˆ˜ === partial ํ•จ์ˆ˜

// ex. 01 ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ๋งŒ ์ถœ๋ ฅํ•˜๋Š” log ํ•จ์ˆ˜
// logNow๋Š” log์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ๊ณ ์ •๋œ partial์ด ๋œ๋‹ค.
let logNow = log(new Date());
logNow("INFO", "message");       // [HH:mm] INFO message

// ex. 02 ๋””๋ฒ„๊น… ๋กœ๊ทธ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜
let debugNow = logNow("DEBUG");
debugNow("message");             // [HH:mm] DEBUG ๋ฉ”์„ธ์ง€

// -> ์ปค๋ง, ์ด๋ ‡๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ๐Ÿ˜๐Ÿ‘๐Ÿป

 

์•„ ... ์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ์ค‘๋ณต์ ์œผ๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ ์ปค๋ง์ด๊ตฌ๋‚˜ !! ์‹ถ๋‹ค

ํด๋กœ์ €์˜ ์žฅ์ ๊ณผ๋„ ๋ถ€ํ•ฉํ•˜๋Š” ใ…‡ใ…‡ ์˜ค ์‹ ๊ธฐ ... ๐Ÿ˜ฎ๐Ÿ˜ฎ๐Ÿ˜ฎ

 

 

๐Ÿ”— (์ฐธ๊ณ ํ•ด๋‘๋ฉด ์ข‹์€) ๋‹ค์ค‘ ์ธ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์ปค๋ง ํ•จ์ˆ˜

 

function curry(func){
  
  return function curried(...args1){
    if(args1.length >= func.length){
      return func.apply(this, args1);
    } else {
      return function(...args2){
        return curried.apply(this, args.concat(args2));
      }
    }
  };
  
}

 

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

let curriedSum = curry(sum);

console.log( curriedSum(1, 2, 3) ); // 6 ๋‹จ์ผ callable ํ˜•์‹์œผ๋กœ ํ˜ธ์ถœ
console.log( curriedSum(1)(2, 3) ); // 6 ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋งŒ ์ปค๋ง
console.log( curriedSum(1)(2)(3) ); // 6 ์ธ์ˆ˜ ๋ชจ๋‘ ์ปค๋ง
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€