커링

여러 개의 인자를 받는 함수를 단일 인자를 받는 함수들의 연쇄로 바꾸는 함수형 프로그래밍 기법입니다.

정의

커링(Currying)은 여러 개의 인자를 한 번에 받지 않고, 인자를 하나씩 받아 다음 함수를 반환하는 형태로 변환하는 기법입니다. 고차 함수가 함수를 반환할 수 있기 때문에 가능합니다.

function add(a) {
  return function(b) {
    return a + b;
  };
}

add(2)(3); // 5

const addTwo = add(2);
addTwo(3); // 5

예를 들어 두 수를 더하는 함수를 일반적으로 작성하면 add(2, 3)처럼 두 인자를 동시에 전달해야 하지만, 커링을 적용하면 add(2)(3)처럼 하나씩 나눠서 전달하거나 const addTwo = add(2)처럼 함수를 선언해두고 필요할 때 재사용할 수 있습니다.

장점

재사용성 증가: 자주 사용하는 인자를 고정한 함수를 미리 만들어 재사용할 수 있습니다.

// ❌ 커링 미적용
const numbers = [10, 20, 30, 40, 50];

const greaterThan30 = numbers.filter(n => n > 30);
const greaterThan20 = numbers.filter(n => n > 20);

// ✅ 커링 적용
const isGreaterThan = (min) => (value) => value > min;

const greaterThan30 = numbers.filter(isGreaterThan(30));
const greaterThan20 = numbers.filter(isGreaterThan(20));

함수 합성이 쉬워짐: 함수형 프로그래밍에서 함수 합성을 위해 compose()나 pipe()를 활용하는데, 커링을 적용하면 단일 인자 함수로 변환되기 때문에 이런 합성 함수에 끼워 넣어 활용할 수 있습니다.

const add = a => b => a + b;

const square = x => x * x;
const toString = x => x.toString();

const pipe = (...fns) => input =>
  fns.reduce((acc, fn) => fn(acc), input);

const process = pipe(
  add(2),
  square,
  toString
);

console.log(process(3)); // "25"

핵심 정리

커링은 다중 인자 함수를 단일 인자 함수의 연쇄로 바꾸는 기법으로, 인자를 고정한 함수를 재사용하기 쉽게 만들고 함수형 프로그래밍의 함수 합성을 단순하게 만듭니다.

→ 커링(currying)이란 무엇인지 설명하고, 활용 예시를 들어줄 수 있나요?

CSLOG에서 보기