여러 개의 인자를 받는 함수를 단일 인자를 받는 함수들의 함수열로 바꾸는 기법
다시 말해, 여러 개의 인자를 한번에 받지 않고, 하나씩 여러 차례 받는 형태로 변환
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) 와 같이 함수를 선언해둔 후, 필요할 때 재사용할 수도 있음
커링을 적용하면 코드의 재사용성이 증가함
ex -
// X 커링 미적용
const numbers = [10,20,30,40,50]
const greaterThan30 = numbers.filter(n=>n > 30)
const greaterThan20 = numbers.filter(n=>n > 20)
이제 커링을 적용하면?
// O 커링 적용
const isGreaterThan = (min: number) => (value: number) => value > min
const numbers = [10,20,30,40,50]
const greaterThan30 = numbers.filter(isGreaterThan(30))
const greaterThan20 = numbers.filter(isGreaterThan(20))
커링을 적용하면 함수 합성이 쉬워짐.
함수형 프로그래밍에서 함수 합성을 위해 compose() 나 pipe() 와 같은 함수를 활용함
이때 커링 적용시 단일 인자 함수로 변환할 수 있기 때문에 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'
가독성 저하
단순한 함수를 커링하면, 코드 가독성이 떨어짐
디버깅 어려움
중첩 함수 형태로 변환하기 때문에 위치 파악이 어려울 수 있음
유연성 저하
모든 인자를 한번에 받아야 하는 경우 불편함
성능 저하
많은 중첩 함수 생성으로 인해 메모리 사용량 증가
ts에서 타입지정 번거로움