수학과 컴퓨터 과학에서 커링(currying)이란 다중 인수 (혹은 여러 인수의 튜플)을 갖는 함수를 단일 인수를 갖는 함수들의 함수열로 바꾸는 것을 말한다.
커링의 사용 예시
- 커리 함수는 '함수를 매개 변수로' 받는다.
- 커리 함수는 실행 시점에 매개 변수로 받은 함수의 인자를 사용하는 함수를 다시 반환한다.
- 반환되는 함수는 Lexical scope 개념에 의해 커리 함수에 전달된 함수를 기억한다.(= 클로저)
Step 1. 커링 대상 함수 선언
- 커링 대상 함수인 sum은 매개 변수로 num1, num2 두 개를 받는다.
function sum(num1, num2) {
return num1 + num2;
}
console.log(sum(10, 20)); // 30
Step 2. 커링 함수 선언
- 커리 함수 또한 두 개의 매개 변수를 각각 받는 함수로 나뉘도록 구현한다.
function currying(func) { // --- ㄱ.
return function(a) { // --- ㄴ.
return function(b) { // --- ㄷ.
return func(a, b); // --- ㄹ.
}
}
}
// 화살표 함수로 표현시
const currying = func => a => b => func(a,b);
ㄱ. 커리 함수는 함수(func)를 매개 변수로 받아 커링 기법을 적용하여야 한다.
ㄴ. 커리 함수는 호출 시점에 새로운 함수 A를 반환하며, 반환되는 함수 A는 매개 변수를 하나 전달 받아야 한다. 또한, 이 함수 A는 클로저 로서 커리 함수가 전달 받은 매개 변수 func를 기억하고 있다.
ㄷ. 커리 함수의 결과로 반환된 함수 A는 호출 시점에 새로운 함수 B를 반환하며, 반환되는 함수 B 역시 매개 변수 a를 필요로 한다. 마찬가지로, 함수 B 역시 클로저로서 커리 함수가 전달 받은 매개 변수 func와 함수 A가 전달 받은 매개 변수 a를 기억하고 있다.
ㄹ. 함수 A의 결과로 반환 함수 B는 호출 시점에 매개 변수 b를 입력 받아 실행되며, func(a, b)를 비로소 호출한다. 함수인 func와 변수인 a는 Lexical scope 개념에 의해 식별자 해결이 가능하며, 결과 커링 대상 함수를 실행할 수 있게 된다.
Step 3. 커링을 이용하여 함수 호출
const curriedSum = currying(sum);
console.log(curriedSum(10)(20)); // 30
커링을 왜 사용하는가
코드의 양이 많아지게되면 오류가 발생하였을 시 디버깅하는 과정이 매우 어려워 질 것이다. 또한 여러 함수가 존재하거나, 추상화가 큰 함수가 존재하는 경우 안에서 여러 일을 할 가능성이 높기 때문에 함수 내부의 코드의 복잡도가 증가하여 이 함수가 무슨 함수인지 이해하는 시간이 오래걸릴 것이다. 이 때, 커링은 함수형 프로그래밍에서 로직을 구현하기 위해, 함수와 함수를 조합하는 과정에서 가독성 / 확장성에 이점을 가진다.
'Javascript' 카테고리의 다른 글
[Javascript] Lazy evaluation(지연 평가) (0) | 2023.01.19 |
---|---|
[Javascript] Generator Function (0) | 2023.01.19 |
[Javascript] require 와 import 비교 (0) | 2023.01.09 |
[JS] 중복되지 않는 알파벳으로 이루어진 가장 긴 문자열 찾기 (0) | 2022.12.31 |
[Javascript] Closure (0) | 2022.10.17 |