개요
커링 Currying은 여러 개의 인자를 받는 함수를 단일 인자 함수들의 연속으로 변환하는 기법 n개의 인자를 받는 함수 → n번에 걸쳐 한 개 인자씩 받는 함수 체인으로 분해 함수형 프로그래밍 맥락에서 재사용성과 조합성 향상 목적
핵심 개념
- 커링 currying: f(a, b, c) 형태를 f(a)(b)(c)로 바꾸는 변환
- 부분 적용 partial application: 전체 인자 중 일부를 고정해 새로운 함수를 만드는 기법
- 관계: 커링된 함수는 부분 적용을 자연스럽게 지원함
동작 원리와 간단 예시
일반 함수
function add(a: number, b: number): number {
return a + b;
}
add(1, 2); // 3
커링 적용
function curriedAdd(a: number) {
return (b: number): number => a + b;
}
const addOne = curriedAdd(1);
addOne(2); // 3
addOne(5); // 6
첫 번째 인자 고정 후 나머지 인자를 나중에 적용 가능
Ramda로 보는 자동 커링
Ramda의 함수는 기본적으로 자동 커링 동작 부분 적용이 일관되게 가능
import * as R from "ramda";
const add = R.add(1); // 첫 번째 인자 1 고정
add(2); // 3
함수 조합 파이프라인과 결합 시 표현 간결
커링과 부분 적용의 차이
- 커링: 다인자 함수를 단일 인자 함수들의 연속으로 변환하는 과정
- 부분 적용: 전체 인자 중 일부만 먼저 채워 새 함수를 만드는 기법
간단 예시
const multiply = (a: number, b: number) => a * b;
const double = multiply.bind(null, 2); // 첫 인자 2 고정
double(5); // 10
커링은 구조 변환, 부분 적용은 사용 패턴에 초점
함수 조합과의 궁합
커링된 함수는 합성 함수와 결합 시 장점 큼
import * as R from "ramda";
const increment = (x: number) => x + 1;
const double = (x: number) => x * 2;
const process = R.pipe(increment, double);
process(3); // 8
입력에서 출력까지 단계적 변환을 작게 나눠 조합 가능
장점 요약
- 재사용성 향상: 자주 쓰는 인자 고정 함수 생성 용이
- 가독성 개선: 복잡한 변환을 작은 단위로 분해 가능
- 조합성 증가: 파이프라인과 컴포지션에 자연스럽게 적합
- 테스트 용이: 부분 적용된 단일 책임 함수 단위 테스트 수월
주의 사항
- 과도한 중첩 사용 시 가독성 저하 위험 존재
- 타입스크립트에서 복잡한 커링 시 제네릭과 추론 한계 고려 필요
- bind를 이용한 부분 적용은 this 바인딩까지 관여하므로 의도한 this 문맥 확인 필요
정리
커링은 다인자 함수를 단일 인자 함수의 연속으로 바꾸는 변환이며 부분 적용은 일부 인자만 먼저 고정해 새 함수를 만드는 기법 Ramda 같은 라이브러리의 자동 커링을 활용하면 재사용성과 조합성이 높아짐 작게 쪼개고 필요할 때 부분 적용해 파이프라인으로 잇는 패턴이 핵심