Currying은 1970년 Christopher Strachey가 Haskell Brooks Curry의 이름에서 착안하였습니다. 여러 개의 인자를 가진 함수를 호출할 경우, 파라미터의 수보다 적은 수의 파라미터를 인자로 받으면 누락된 파라미터를 인자로 받는 기법입니다.
함수 하나가 n개의 인자를 받는 과정을 n개의 함수로 각각의 인자를 받도록 합니다. 함수를 체인으로 계속 생성해 결과적으로 값을 처리하도록 하는 것이 그 본질입니다.
예를 들어보면, f(a, b, c)처럼 단일 호출로 처리하는 함수를 f(a)(b)(c)와 같이 각각의 인수가 호출 가능한 프로세스로 호출된 후 병합되도록 변환하는 것입니다.
화살표 함수로 예시를 들겠습니다.
const sum = (a, b) => a + b;
a와 b 매개변수로 전달받은 값을 더하는 함수입니다. 이것을 커링 함수로 수정하면 다음과 같습니다.
const sum = a => b => a + b;
첫 번째 함수가 a만을 매개변수로 받고, 그 안에 있는 반환되는 내부 함수가 b를 매개변수로 받는 형태가 됩니다. 그러면 다음과 같은 로직을 생각해볼 수 있습니다.
const sum = a => b => a + b;
const plusInOne = sum(1);
plusInOne(2);
plusInOne(3);
plusInOne(4);
plusInOne이 선언된 순산, 이 함수가 리턴하는 함수는 클로저가 됩니다. a가 정의된 적은 없지만 클로저는 그 함수가 실행된 환경을 기억하고 있으므로 1을 기억하고 익명 함수에 계속해서 a = 1이라는 사실을 가지고 함수를 실행하게 됩니다. 재사용성이 높죠! 주의할 점은 인자의 순서가 중요하는 점입니다! 먼저 받는 인자일수록 변하지 않아야 하고, 나중에 받는 인자일수록 변할 가능성이 높습니다.
Ramda와 같은 일부 함수형 자바스크립트 라이브러리에는 함수에 필요한 매개변수를 구분할 수 있는 보다 유연한 커링 함수들이 있다고 합니다. 추후 프로젝트에서 커링을 활용한 함수를 만들어봐야겠다.
'JAVASCRIPT > 자바스크립트 이론' 카테고리의 다른 글
원시타입과 참조타입 (Primitive type & Reference type) (0) | 2022.11.21 |
---|---|
타입이란 (0) | 2021.02.16 |
REST API란 (2) | 2021.02.03 |
oAuth란 (0) | 2021.02.02 |
쿠키 / 세션 / 로컬스토리지 / 세션스토리지 (0) | 2021.02.01 |