함수형 프로그래밍에서는 여러 인수가 있는 함수를 일련의 중첩 함수로 변환하는
형태를 커링(currying) 이라고 부른다.
모든 인수가 소진되기 전까지 새함수를 계속 반환하는데, 인수는 클로저 함수에 최종 반환이 된다.
코드를 통해 커링의 특징에 대해 더욱 자세히 알아 보자.
function multifunc(a, b, c) {
return a * b * c;
}
multifunc(1, 2, 3) // 6
multifunc
함수는 세 개의 인자를 통해 곱하여 결과를 반환 한다.
함수 호출을 하면 전달 인자들이 각각 위치에 지정되어 6이 출력 된다.
function multifunc(a) {
return (b) => {
return (c) => {
return a * b * c
}
}
}
multifunc (1) (2) (3) // 6
이번에는 여러 함수를 나누어 클로저 함수 형식으로 변경해 보았다.
1-1와 똑같으나 하나의 기능이 일련의 기능으로 바뀌게 되었는데, 이는 세 수의 곱셈 결과를 얻기 위해
1, 2, 3 모두 하나씩 과정을 거쳐서 출력된다.
1-1의 경우 상황에 따라 전달인자를 변경을 해줘야하는 번거로움이 있지만,
1-2의 경우 재사용이 용이하여 인자를 여러번 활용할 수가 있다.
이를 커링(currying) 이라고 부른다.
커링이 왜 재사용성이 좋은지에 대해 응용된 코드로 보여주겠다.
function multifunc(x) {
return function(y) {
return function(z){
return x * y * z;
}
}
}
let multifunc5 = multifunc(5); // 5 고정 x
let multifunc5Add9 = multifunc5(9); // 5와 9 고정 y
let multifunc5Add3 = multifunc5(3); // 5와 3 고정 y
multifunc5Add9(7); // 5(x) * 9(y) * 7(z)
multifunc5Add9(8); // 5(x) * 9(y) * 8(z)
multifunc5Add3(1); // 5(x) * 3(y) * 1(z)
multifunc5Add9
함수가 5 9 7 반환되어도 다시 한번 호출하면 5 9 1의 값으로 다르게 반환된다.
이로 인해 z 변수만 변경하고, 나머지 x, y 변수는 여러번 변수 선언을 통해
재사용이 가능하다는 것을 볼 수 있다.
종합적으로 커링에 대해 간단히 설명하자면
커링은 여러개의 인자(parameter)를 갖는 함수를
단일 인자 갖는 함수들로 바꾸는 특화된 기능을 가지고 있다.
결국 단일 인자로 갖는 함수들이 서로 연쇄적으로 반응하는 과정을 통해
클로저 함수의 특징을 지니고 있는 것 또한 볼 수가 있었다.
커링은 기존 함수를 보다 더 재사용성 및 가독성을 높여주는데 큰 효율을 보이므로
잘 활용한다면 수준 높은 코드로 만들어 줄 것이다.