커링
여러 개의 인자를 받는 함수를 단일 인자를 받는 함수들의 연쇄로 바꾸는 함수형 프로그래밍 기법입니다.
정의
커링(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"
핵심 정리
커링은 다중 인자 함수를 단일 인자 함수의 연쇄로 바꾸는 기법으로, 인자를 고정한 함수를 재사용하기 쉽게 만들고 함수형 프로그래밍의 함수 합성을 단순하게 만듭니다.