본문 바로가기

자바스크립트 끄적끄적

커링 함수

728x90

커링(Currying)은 함수를 여러 인자를 받는 일련의 함수들로 변환하는 프로그래밍 기법입니다. 커링을 사용하는 이유는 여러 가지가 있습니다:

// 주어진 함수
function sum(a, b, c) {
  return a + b + c;
}

// 커링 함수 정의
function curry(func, ...zeroth) {
  return function(...wunth) {
    return func(...zeroth, ...wunth);
  };
}

// 커링 함수를 사용하여 부분적으로 값을 지정한 함수 생성
const curriedSum = curry(sum, 1);

// 커링된 함수 호출
const result = curriedSum(2, 3);
console.log(result); // 6

 

 

해당 커링 함수를 보면, 

curry(...)를 선언하면서 일반적인 함수랑은 느낌이 다른걸 알 수 있습니다. 보통 함수를 호출할 때는 인자를 나눠준다거나 함수의 로직을 줘서 함수를 실행하는 로직같은건 없었습니다.

 

하지만 여기를 보면 curry안에 sum을 줘서 내부 func 에 sum이라는 함수로직을 주고, 그 다음 인자로 1을 줍니다.

const curriedSum = curry(sum, 1);

 

 

이런식으로 인자를 따로 보내서 저장 시킬 수 있습니다.

그렇게 되면 내부 익명함수 반환되게 됩니다.

...wunth 값으로 전달되는 값은!!

return function(...wunth) {
    return func(...zeroth, ...wunth);
  };

 

바로..!

const result = curriedSum(2, 3);

 

 

2, 3 을 줌으로서 ...wunth에 2,3이 들어가게 되고, 결로적으로

 

func(...zeroth, ...wunth) ===> sum(1,    2, 3) 이 전달되게 됨으로써 result 값은 6이 되는 원리입니다.

이러한 구현이 되기 위해서는 자바스크립트의 근본적인 원리인 클로저 개념을 알아야 합니다. 하지만 조금 어려운 개념이기 때문에 그것으 잘설명해준 사이트를 몇 개 소개하겠습니다. 이만 마치도록 하겠습니다.  (*ˊᵕˋ*)ノ 

 

클로저 설명

https://ko.javascript.info/closure

 

변수의 유효범위와 클로저

 

ko.javascript.info

 

커링 설명

https://ko.javascript.info/currying-partials

 

커링

 

ko.javascript.info

 

 

마지막으로..! 또 다른 커링 함수를 보면서 제대로 이해했는지 확인해보자

 

function curry(func) {

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

}

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

let curriedSum = curry(sum);


alert( curriedSum(1)(2)(3) ); // 6, 모두 커링하기
728x90