[C#] Delegate, Func, Action 이해하기: 차이점 및 사용 사례

C#에서 Delegate, Func, Action은 이벤트 처리, 비동기 프로세스 처리 등을 위해 유연하고 재사용 가능한 코드를 작성하는 데 필수적인 요소다

본 포스팅에서는 Delegate, Func, Action 각각의 개념, 차이점, 사용 사례에 대해 설명한다.

1. Delegate

Delegate는 메서드를 참조하는 객체로, 메서드의 시그니처(입력 매개변수와 반환 타입)에 대한 정보를 포함한다. 이를 통해 런타임에 해당 시그니처를 갖는 메서드를 호출할 수 있다. 델리게이트는 이벤트 처리, 콜백 함수, 메서드를 매개변수로 전달하는 데 유용하다.

델리게이트는 명시적으로 정의되어야 하며, 호출하려는 메서드와 일치하는 시그니처를 가져야 한다. 예를 들어, 두 개의 int 매개변수를 사용하고 float를 반환하는 메서드를 참조하는 델리게이트를 정의하려면 다음과 같이 사용할 수 있다.

public delegate float CustomDelegate(int a, int b);

public class MyClass
{
    public static float Divide(int a, int b)
    {
        return (float)a / b;
    }
}

public class MainClass
{
    public static void Main()
    {
        CustomDelegate del = MyClass.Divide;
        float result = del(10, 5);
        Console.WriteLine("Result: " + result);
    }
}

이 경우, CustomDelegate 델리게이트는 두 개의 int 입력 매개변수를 받아들이고 float 값을 반환하는 MyClass.Divide 메서드를 참조합니다.

델리게이트는 메서드 참조를 저장하는 데 사용되며, 호출 시 해당 메서드를 실행한다. 델리게이트는 단일 메서드 참조뿐만 아니라, 동일한 시그니처를 가진 여러 메서드를 참조하는 데도 사용할 수 있다(멀티캐스팅 델리게이트).

2. Func

Func는 반환 타입이 void가 아닌 0~n개의 매개변수를 가진 함수를 나타내는 제네릭 델리게이트다. 제네릭(generic)이란 프로그래밍 언어에서 타입에 종속되지 않고, 재사용 가능한 코드를 작성하는 방법이다.

public class MyClass
{
    public static int GetNumber()
    {
        return 42;
    }

    public static string ToString(int number)
    {
        return "Number: " + number;
    }
}

public class MainClass
{
    public static void Main()
    {
        Func<int> numberFunc = MyClass.GetNumber;
        int number = numberFunc();
        Console.WriteLine("Number: " + number);

        Func<int, string> toStringFunc = MyClass.ToString;
        string result = toStringFunc(42);
        Console.WriteLine(result);
    }
}

이 경우, Func<int>는 매개변수가 없고 int 값을 반환하는 MyClass.GetNumber 메서드를 참조한다. 그리고 Func<int, string>은 하나의 int 매개변수를 받고 string을 반환하는 MyClass.ToString 메서드를 참조한다.

3. Action

Action은 반환 타입이 void인 메소드를 위해 특별히 설계된 제네릭 델리게이트다. Action은 Func와 마찬가지로 사용자 정의 델리게이트 대신 사용할 수 있어 코드를 간소화하고 표현력을 높일 수 있다.

public class MyClass
{
    public static void PrintHello()
    {
        Console.WriteLine("Hello!");
    }

    public static void PrintSum(float a, float b)
    {
        Console.WriteLine("Sum: " + (a + b));
    }
}

public class MainClass
{
    public static void Main()
    {
        Action helloAction = MyClass.PrintHello;
        helloAction();

        Action<float, float> sumAction = MyClass.PrintSum;
        sumAction(3.5f, 5.5f);
    }
}

이 경우, Action은 매개변수가 없는 MyClass.PrintHello 메서드를 참조한다. 그리고 Action<float, float>는 두 개의 float 매개변수를 받는 MyClass.PrintSum 메서드를 참조한다.

Summary

  • Delegate: 사용자가 정의한 메서드 참조를 위한 델리게이트다. 시그니처(입력 매개 변수와 반환 타입)를 명시적으로 정의하며, 이벤트 처리 및 콜백 함수에 유용하게 사용된다. 모든 타입 매개 변수는 입력 매개 변수의 타입을 나타내거나 반환 타입을 지정할 수 있다.
  • Func: 반환 값이 있는 메서드를 참조하는 제네릭 델리게이트다. 마지막 타입 매개 변수는 반환 타입을 나타내며, 나머지 매개 변수는 입력 매개 변수의 타입이다.
  • Action: 반환 값이 없는(void) 메서드를 참조하는 제네릭 델리게이트다. 모든 타입 매개 변수는 입력 매개 변수의 타입을 나타낸다.

C# Delegate, Func, Action은 코드의 유연성과 재사용성을 높이는 데 도움이 되는 도구이다. 이들의 개념과 차이점을 이해하고 적절한 상황에 사용하면 효율적인 코드를 작성할 수 있다.

이 글을 통해 각각의 개념과 사용 사례에 대해 더 잘 이해할 수 있기를 바란다.