-
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자리에 들어가는데 문제가 없다.
델리게이트 처음엔 다 정의하고 했는데 하나씩 빼고 간단하게 사용이 가능한 것을 보여주는 느낌이다.
'C# 예제 공부일기' 카테고리의 다른 글
Predicate<T> 델리게이트 (0) 2020.07.28 람다식(Lambda Expression) (0) 2020.07.22 이름 없는 델리게이트(Anonymous Delegate) (0) 2020.07.22 Delegate의 기본, 배열에서 홀수와 짝수 찾기 + Delegate 예제 (0) 2020.07.22 인덱서 (0) 2020.07.22