개요

커링 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 같은 라이브러리의 자동 커링을 활용하면 재사용성과 조합성이 높아짐 작게 쪼개고 필요할 때 부분 적용해 파이프라인으로 잇는 패턴이 핵심

참고자료