커링이란?
함수의 분해기법이다.
다수의 인자를 가지는 함수 대신, 하나의 인자를 가지는 연속된 함수들의 중첩이다.
부분적용 : 함수의 인자 일부를 고정한 새로운 함수를 생성한다.
우리는 기본적인 일반함수를 사용 할 때 다음과 같이 사용한다.
function fn(x,y){
return x + y
}
fn(1,2)
하지만 위 함수를 커링으로 바꾸면 함수를 쪼개는 작업이라고 보면 된다.
function curriedFn(x){
return function(y){
return x + y
}
}
함수가 함수를 리턴하고 마지막으로 최종 값을 리턴한다.
arrow로도 만들어보자.
const curriedFn2 = x => y => x + y
위와같이 x를 매개변수로 받고 함수 자체 즉 => y 부분을 리턴한다.
위 함수를 우리는 const curriedFn2 = (x) => {
return (y) => {
}
} 와 같은 형식으로 변환하여 볼 줄 알아야 한다.
위와 같은 함수를 호출할 때에는
curriedFn(1)(2)
curriedFn2(1)(2)로 호출 할 수 있다.
위에서 부분적용에 대한 설명을 보면 함수의 인자 일부를 고정한 새로운 함수를 생성한다고 적혀있다.
어떤 의미냐면 우리가 curriedFn를 호출할때에는 curriedFn(1)(2)로 호출했다.
최종 리턴을 하려면 y값인 2까지 넘어와야 리턴이 될 것이다.
또한 내가 함수에 전달하려는 인자들을 한꺼번에 제공하지 않아도 된다는 것이다 .
위 설명에서 응용한 코드를 한 번 보자
function makeCoffee(roastType){
return function(sugar){
return function(cream){
retrun log(`Coffee,${roastType},sugar:${sugar},cream:${cream}`)
}
}
}
const mediumRoast = makeCoffee("Medium Roast")
const order1 = mediumRoast(1)(2) // Coffee, MediumRoast,sugar:1,cream:2
const order1 = mediumRoast(2)(3) // Coffee, MediumRoast,sugar:2,cream:3
위와같이 커링함수를 만들었다.
mediumRoast 함수는 우리가 makeCoffee안에 roastType을 고정함 함수로 슈가랑 크림의 매개변수만 전달한다면 항상 일정하게 roastType을 유지한 함수가 만들어지는 것이다.
const order1 = mediumRoast(1)(2) // Coffee, MediumRoast,sugar:1,cream:2
위코드는 바로 커링함수를 이용해서 특정값을 고정한 부분적용 패턴을 사용한 예시코드이다.
위와같은 커링함수를 공부하면서 함수를 어떻게 더 효율적으로 사용할 수 있을지에 대한 공부가 필요할거같다.