ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Func와 Action으로 델리게이트를 더 간단히 만들기
    C# 예제 공부일기 2020. 7. 22. 19:44

    이제는 델리게이트 선언 부분도 필요가 없다고 한다.

    //delegate bool MemberTest(int x); 

     

    앞에서 배열에서 짝수와 홀수의 개수를 출력하는 프로그램을 무명 델리게이트를 사용하여 작성했는데, 델리게이트를 사용하려면 우선 delegate를 선언해야 하는데 이것도 사실은 번거로운 일이다. .Net에서는 Func와 Action 델리게이트를 미리 만들어서 제공한다. 이 두개를 사용하면 delegate 를 선언할 필요가 없다. Func 델리게이트는 결과를 반환하는 메소드를 참조하기 위해서, Action 델리게이트는 반환 값이 없는 메소드를 참조한다.

     

    Func와 Action은 제네릭 매개변수를 사용한다.

     

    Func<int,bool> 은 매개변수가 int란 뜻이고 반환타입이 bool이란 뜻이다. 매개변수 리스트 중에서 가장 뒤에 있는 것이 리턴 값이고 그 앞에 있는 매개변수들은 델리게이트 메소드의 매개변수 타입이다. 매개변수가 없는 것부터 16개가 있는 것까지를 제공하므로 거의 모든 델리게이트를 Func와 Action으로 사용이 가능하다.

     

    class Program
        {
            //delegate bool MemberTest(int a); 요거 없어도 된다. Func쓸거니까
            static void Main(string[] args)
            {
                int[] arr = new int[] { 3, 5, 4, 2, 6, 4, 6, 8, 54, 23, 4, 6, 4 };
                Console.WriteLine("짝수의 개수 : " + Count(arr,delegate(int x) { return x % 2 == 0; }));
                                                             //이름 없이 인라인으로 정의
                Console.WriteLine("홀수의 개수 : " + Count(arr,delegate(int x) { return x % 2 == 1; }));
                                                            //이름 없이 인라인으로 정의
            }
            static int Count(int[] a, Func<int,bool> testMethod)
            {                                               
                                                           
                int cnt = 0;
                foreach (var n in a)
                {
                    if (testMethod(n)) //밑의 Is메소드에서는 반환이 bool이다.
                        cnt++;
                }
                return cnt;
            }

    Count 메소드의 매개변수 testMethod가 원래는 위에서 정의한 delegate 형의 MemberTest였으나 Func를 사용해서 정의했다. 매개변수는 int 반환타입은 bool인 매개변수 testMethod가 된 것이다.  여기서 delegate(int x){return x%2==2;}가 매개변수는 int 하나이고 반환타입은 bool인 델리게이트 이므로 testMethod자리에 들어가는데 문제가 없다. 

     

    델리게이트 처음엔 다 정의하고 했는데 하나씩 빼고 간단하게 사용이 가능한 것을 보여주는 느낌이다.

Designed by Tistory.