**커링(currying)**은 N개의 인수를 받는 함수를, 각각 하나의 인수를 받는 N개 함수의 체인으로 변환합니다. **부분 적용(partial application)**은 지금 일부 인수를 고정하고 나머지를 기다리는 함수를 반환합니다.
js
= () => a + b + c;
= a => a + b + c;
()()();
add10 = ();
()();
**커링(currying)**은 N개의 인수를 받는 함수를, 각각 하나의 인수를 받는 N개 함수의 체인으로 변환합니다. **부분 적용(partial application)**은 지금 일부 인수를 고정하고 나머지를 기다리는 함수를 반환합니다.
= () => a + b + c;
= a => a + b + c;
()()();
add10 = ();
()();
각 단계는 클로저를 사용해 모든 인수가 제공될 때까지 앞선 인수들을 기억합니다.
const log = level => message => console.log(`[${level}] ${message}`);
const error = log("ERROR"); // 재사용 가능한, 미리 설정된 로거
const info = log("INFO");
error("disk full"); // [ERROR] disk full
레벨을 곳곳에서 반복하는 대신, 설정된 함수를 한 번 만듭니다. 이는 함수형 파이프라인과 이벤트 핸들러에서 빛을 발합니다:
const onChange = field => e => setForm(f => ({ ...f, [field]: e.target.value }));
<input onChange={onChange("email")} /> // "email"에 특화된 핸들러
라이브러리(Ramda, lodash curry)는 모든 함수를 자동 커링하여 인수를 유연한 그룹으로 제공할 수 있게 합니다.
커링은 깔끔한 함수 합성(function composition), 재사용 가능한 설정된 콜백, 그리고 포인트-프리(point-free) 스타일을 가능하게 합니다.
함수형 코드베이스에서 흔하며, 클로저 이해도를 시험하는 빈번한 면접 주제입니다.