
코드 리뷰로 다른 동료분께 커링을 사용하는 것도 좋아 보이네요!라는 이야기를 들었습니다.
부끄럽지만 그때는 커링이 무엇인지 몰랐었습니다. 커링에 대해 찾아보니 함수형 프로그래밍에 있어 보다 함수의 재사용성을 높일 수 있는 방법이라는 것을 알게 되어 이번 기회로 공유를 해보려 합니다. 😃
Currying은 모든 인수들이 사용될 때까지 계속 새로운 함수를 반환합니다.
//모든 인수를 가지고 함수를 호출
function multiply (a, b, c) {
return a * b * c;
}
multiply(1, 2, 3);
⇒
//curried된 함수의 호출
function multiply (a) {
return (b) => {
return (c) => {
return a * b * c;
};
};
}
multiply(1)(2)(3);
하나의 함수가 여러 함수의 조합으로 분해가 된 것을 볼 수 있습니다.
즉, Currying은 여러 개의 인수를 가진 함수를 각각이 하나의 인수를 갖는 일련의 함수들로 변환합니다.
그러나, 이미 반환된 외부 함수의 return 값에 어떻게 접근을 하는 것일까요? 🤔
⇒ 이 부분은 JavaScript에서는 클로저(Closure)라는 개념을 통해 이미 반환된 외부 함수의 지역 변수에 접근할 수 있었습니다.
이는 함수가 실행될 때 자신이 생성될 당시의 환경에 있는 변수들에 접근할 수 있습니다. 따라서 위 예시에서는
이 과정에서 a와 b는 각각의 클로저 내에서 "살아있는" 상태로 유지되며, 마지막 함수에서 a, b, 그리고 c의 값을 사용하여 계산을 수행할 수 있습니다.
재사용 가능하고 쉽게 구성할 수 있는 작은 코드 모듈 작성합니다.
function discountedPrice(price, discountRate) {
return price * (1 - discountRate);
}
위와 같은 코드로 할인 가격을 산출해 낼 수 있습니다.
그러나, 이는 장기적으로 매번 10%의 할인을 계산하게 됩니다.
const price = discountedPrice(1500000, 0.1); //=> 1,350,000
const price = discountedPrice(50000, 0.1); //=> 45,000
const price = discountedPrice(300000, 0.1); //=> 270,000
이때, discountedPrice 함수를 curry로 할 수 있습니다. 그러면 매번 0.1 할인율을 추가하지 않아도 됩니다!
function discountedPrice(discountRate) {
return (price) => {
return price * (1 - discountRate);
};
}
const tenPercentDiscount = discountedPrice(0.1);
tenPercentDiscount(500000); //=> 450000
curry를 이용함으로 고객이 사는 물건의 가격만 가지고 계산을 할 수 있게 되었습니다.
또한, 더욱 스페셜한 고객에게는 const twentyPercentDiscount = discountedPrice(0.2);로 활용할 수도 있습니다.
같은 인수를 가지고 자주 함수를 호출하는 것을 피할 수 있다.
function volume(length, width, height) {
return length * width * height;
}
여기서 어떤 실린더의 height가 모두 100이라고 한다면, 사용자는 반복해서 height 인수에 100을 넣어서 호출해야 합니다.
이를 해결하기 위해, volumn 함수를 curried 할 수 있습니다.
function volumn (height) {
return (width) => {
return (length) => {
return length * width * height;
};
};
}
특정한 높이에 대해서 함수를 정의할 수 있습니다.
const hundredCylinderHeight = volumn(100);
hundredCylinderHeight(200)(30);
https://blog.bitsrc.io/understanding-currying-in-javascript-ceb2188c339
위 블로그를 참고하여 작성한 글 입니다.
많이 부족하고 가독성도 떨어지지만 계속 연습하며 더 나은 글을 작성 할 수 있는 능력을 길러보려합니다.