본문 바로가기
프로그래밍/함수형 프로그래밍

C#의 커링(Curring)

by bantomak 2024. 3. 25.

커링(Curring)이란?

커링이란 순서에 따라 인수의 구조를 변경하는 간단한 구조화 기법이다. 커링은 n개의 인수를 가지는 함수를 단일 인수를 가지는 n개의 함수로 변환하는 것으로, 단일 인수만 가질 수 있는 람다 함수의 한계를 극복하기 위해서 탄생했다.

 

비 커링(Non-Curring) 예제

NonCurried Method 파일에 포함된 다음 코드를 살펴보자.

 

public partial class Program
{
    public static int NonCurriedAdd(int a, int b) => a + b;
}

 

이 함수는 인수로 전달받은 a와 b의 합을 반환한다. 이와 같은 함수는 굉장히 자주 사용하는 유형인데, 이 함수를 사용하는 예는 다음과 같다.

 

public partial class Program
{
    static void main(string[] args)
    {
        int add = NonCurriedAdd(2, 3);
        Console.WirteLine(add);
    }
}

 

커링(Curring) 예제

이제 커링을 적용해 보자. 함수 안에 함수가 존재하는 구조라고 생각하면 이해가 쉽다.

 

public partial class Program
{
    public static Func<int, int> CurriedAdd(int a) => b => a + b;
}

 

Func<> 대리자를 이용해서 CurriedAdd() 메서드를 생성하고 있다. 이 메서드를 호출하는 방법에는 두 가지가 있다.

 

public partial class Program
{
   public static void CurriedStyle1()
   {
       int add = CurriedAdd(2)(3);
       // int add = CurriedAdd(2).invoke(3); invoke로 호출하는 방법도 가능!
       
       Console.WriteLine(add);
   }
}

 

이 방법은 다소 익숙하지 않을 수도 있는데, 두 개의 괄호를 이용해서 CurriedAdd() 메서드를 호출한다.

 

public partial class Program
{
   public static void CurriedStyle2()
   {
       var addition = CurriedAdd(2);
       
       var x = addition(3);
       Console.WriteLine(x);
   }
}

 

이쪽이 그나마 익숙한 모습일 것이다. 2가지 방법 모두 익숙해지도록 연습해보자.

정리하자면

커링은 여러 인자를 가지는 함수를 1개의 인자만을 가지는 여러개의 함수로 변환한다.

 

이는 단일 인수만을 사용하는 람다 함수의 한계를 극복하기 위해서 개발된 테크닉이다. 함수형 프로그래밍을 사용하지 않는다면 필요하지 않을 수도 있지만 함수형 프로그래밍을 배우기 위해서는 숙지하고 가야 하는 부분이다. 그리고 ()() 괄호가 2개 나오는 코드는 익숙해지도록 해보자.

출처

 

Functional C# - 예스24

C# 개발자를 위한 함수형 프로그래밍 학습서다. 명령형 프로그래밍 방식과 함수형 프로그래밍을 비교하고, 함수형 프로그래밍을 위한 C#의 언어적 지원과 이를 이용한 실제 구현 예를 살펴보면

www.yes24.com

댓글