함수 커링이란
함수 커링은 여러 인수를 한 번에 받는 함수를, 인수를 하나씩 순차적으로 받아 처리하는 함수들의 연쇄로 변환하는 기법입니다. 즉,
f(a, b, c)를 f(a)(b)(c)와 같이 변환하는 것이 바로 커링입니다. 커링을 활용하면 부분 적용 (partial application) 이 가능해져, 일부 인수를 미리 고정한 새로운 함수를 쉽게 만들 수 있습니다.
커링의 장점
- 코드 재사용성 증가
- 커링을 통해 기존 함수에서 특수화된 새 함수를 만들어 함수 재사용성을 높일 수 있습니다.
- 코드 가독성 증가
단순 이진 함수 커링하기
// 이진 함수 (두 개의 인수를 받는 함수)를 커링합니다.
function curryBinary(fn) {
return function(a) {
return function(b) {
return fn(a, b);
};
};
}
// 예제 함수: 두 숫자를 곱하는 함수
function multiply(x, y) {
return x * y;
}
const curriedMultiply = curryBinary(multiply);
console.log(curriedMultiply(3)(4)); // 12
curryBinary 헬퍼 함수는 함수 fn을 인수로 사용하고 익명 함수를 반환합니다. 반환된 익명 함수는 인수 a를 사용하고 다른 익명 함수를 반환합니다. 이 두 번째 익명 함수는 인수 b를 사용하고 최종적으로 인수를 fn(a, b)로 호출하여 원래 함수 fn의 결과를 반환합니다.
위 에예서 curryBinary 헬퍼 함수를 사용하여 multiply 함수를 커링합니다.
다중 인자를 가진 헬퍼 함수 구현
function curry(fn) {
return function curried(...args) {
// 원래 함수가 요구하는 인수보다 충분히 모였다면 바로 실행
if (args.length >= fn.length) {
return fn(...args);
} else {
// 그렇지 않으면 새로운 함수 반환하여 나머지 인수를 기다림
return function(...args2) {
return curried(...args, ...args2);
};
}
};
}
// 예제 함수: 세 숫자의 합
function sum3(a, b, c) {
return a + b + c;
}
const curriedSum3 = curry(sum3);
console.log(curriedSum3(1, 2, 3)); // 6, 전부 한 번에 제공
console.log(curriedSum3(1)(2, 3)); // 6, 첫 번째 인수를 고정
console.log(curriedSum3(1)(2)(3)); // 6, 완전 커링
이 커링 함수는 함수 fn이 요구하는 인수의 수(fn.length)를 기준으로 인수가 충분히 모였을 때 바로 실행하고, 그렇지 않으면 나머지 인수를 채워줄 래퍼 함수를 반환합니다.
'JavaScript' 카테고리의 다른 글
[JavaScript] 내장 함수 eval (0) | 2025.02.19 |
---|---|
[JavaScript] Proxy를 활용한 객체 동작 제어 (0) | 2025.02.19 |
[JavaScript] 동적 모듈 가져오기 (0) | 2025.02.19 |
[JavaScript] 모듈 내보내기 및 가져오기 (0) | 2025.02.19 |
[JavaScript] 모듈 시스템 (0) | 2025.02.19 |