Currying이란?

해진·2024년 3월 11일

조각 테크 공유

목록 보기
2/16
post-thumbnail

Intro

코드 리뷰로 다른 동료분께 커링을 사용하는 것도 좋아 보이네요!라는 이야기를 들었습니다.

부끄럽지만 그때는 커링이 무엇인지 몰랐었습니다. 커링에 대해 찾아보니 함수형 프로그래밍에 있어 보다 함수의 재사용성을 높일 수 있는 방법이라는 것을 알게 되어 이번 기회로 공유를 해보려 합니다. 😃

Currying(쿼링)이 무엇인가?

  • 여러 개의 인수를 함수가 중첩되는 순서대로 보내는 하나의 과정

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)라는 개념을 통해 이미 반환된 외부 함수의 지역 변수에 접근할 수 있었습니다.

이는 함수가 실행될 때 자신이 생성될 당시의 환경에 있는 변수들에 접근할 수 있습니다. 따라서 위 예시에서는

  • multiply(1)a1로 고정된 새로운 함수를 반환합니다.
  • (2)(이전 단계에서 반환된 함수에 대한 호출)는 b2로 고정되고, c 를 받는 또 다른 새로운 함수를 반환합니다.
  • (3)(두 번째 단계에서 반환된 함수에 대한 호출)은 c3으로 고정되고, 이제 모든 인자가 준비되었으므로 a b c 계산을 수행하고 그 결과를 반환합니다.

이 과정에서 ab는 각각의 클로저 내에서 "살아있는" 상태로 유지되며, 마지막 함수에서 a, b, 그리고 c의 값을 사용하여 계산을 수행할 수 있습니다.

Currying(쿼링)은 유용한가?

  1. 재사용 가능하고 쉽게 구성할 수 있는 작은 코드 모듈 작성합니다.

    • 만약, 매번 고객에게 10%의 할인을 적용해 주고자 합니다.
    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);로 활용할 수도 있습니다.

  1. 같은 인수를 가지고 자주 함수를 호출하는 것을 피할 수 있다.

    • 예시로 실린더의 부피를 계산하는 함수가 있습니다
    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);

요약

  • 쿼링이란 여러 개의 인수를 가진 함수를 각각이 하나의 인수를 갖는 일련의 함수들로 변환하는 것.
  • 쿼링을 사용할 때 클로저라는 js의 개념으로 자신이 생성될 당시의 환경에 있는 변수들에 접근 가능.
  • 쿼링의 장점으로는 재사용 가능하고 쉽게 구성할 수 있는 작은 코드 모듈 작성 가능, 같은 인수를 가지고 자주 함수를 호출하는 것 회피 가능.

https://blog.bitsrc.io/understanding-currying-in-javascript-ceb2188c339

위 블로그를 참고하여 작성한 글 입니다.

많이 부족하고 가독성도 떨어지지만 계속 연습하며 더 나은 글을 작성 할 수 있는 능력을 길러보려합니다.

profile
안녕하세요, Frontend 개발자 윤해진입니다.

0개의 댓글