C#

[C#]Func, Action

이경로 2023. 7. 14. 10:05

이전 글에서 Delegate라는 문법을 설명했다. 간단히 복습하자면 delegate는 함수 변수처럼 선언하거나 인자로 사용할 수 있는 타입이다.

Delegate역시 클래스처럼 일반화가 가능하다.

class Program
{
    delegate Return print<Return>();
    delegate Return print<T, Return>(T t);
    delegate Return print<T1, T2, Return>(T1 t1, T2 t2);

    static int callFunction(print<int, int> function, int i)
    {
        return function(i);
    }

    static int printNum(int i)
    {
        return i*10;
    }

    static void Main(string[] args)
    {
        print<int, int> p = printNum;
        int i = callFunction(printNum, 10);
        Console.WriteLine(i);
    }
}

위와 같이 generic type선언이 가능해 타입별로 함수 선언을 따로 하지 않아도 무방하다. 하지만 인자의 수에 따라 delegate를 매번 새로 선언해주어야 한다는 불편함이 있다. 이런 generic type의 delegate를 인자의 수에 따라 새로 선언하지 않고 하나의 메소드로 사용할 수 있는 것이 Func와 Action이다.

 

1. Func

class Program
{
    static int printNum(int i)
    {
        return i*10;
    }

    static void Main(string[] args)
    {
        Func<int, int> p = printNum;
        int i = p(10);
        Console.WriteLine(i);
    }
}

 

Func는 리턴값이 있는 delegate함수를 미리 정의해 놓은 형태이다. 꺾쇠(<>)안에 인자의 타입을 선언한다. 첫번째 인자는 반환 타입이고, 두 번째부터 마지막 인자까지는 입력 타입이다.

 

2. Action

class Program
{
    static void printNum(int i)
    {
        Console.WriteLine(i * 5);
    }

    static void Main(string[] args)
    {
        Action<int> p = printNum;
        p(10);
    }
}

Action은 Func와 기능은 같고, 반환값이 없는 함수의 대리자이다.