2022. 3. 29. 12:57ㆍLanguages/C#
*이 글은 <이것이 C#이다> 책을 바탕으로 공부한 글입니다.
익명 메소드와 무명 함수는 일회성으로만 사용할 함수 사용에 용이하며, 코드를 좀 더 간결하게 만들어 주는 요소들이다.
하지만, 둘 다 대리자(Delegate)가 필요하기 때문에 사전에 먼저 대리자를 선언해줘야 하는 번거로움이 있다.
귀찮지 않을 수가 없다. 한 번만 사용할 건데, 사용할 때마다 매번 대리자를 선언해야 한다니...
그래서 이런 번거로움을 해결해주기 위해, 마이크로소프트 .NET에서는 이런 익명 메소드와 무명 함수들을 위한 대리자들을 미리 선언을 해놨다. 그 대리자들이 바로 오늘 알아볼 Func와 Action이다.
Func
결과를 반환하는 메소드를 참조하기 위해 만들어졌다. .NET에는 모두 17가지 버전의 Func 대리자가 있다.
public delegate TResult Func<out TResult>()
public delegate TResult Func<in T, out TResult>(T arg)
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)
public delegate TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3)
...
public delegate TResult Func<in T1, in T2, ..., in T16, out TResult>(T1 arg1, ..., T16 arg16)
모든 Func 대리자의 형식 매개변수 중 가장 마지막에 있는 것이 반환 형식이다.
public delegate TResult Func<out TResult>() // 그 자체가 반환 형식
public delegate TResult Func<in T, out TResult>(T arg) // 두 번째 형식이 반환
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2) // 세 번째 형식이 반환
이렇듯, 입력 매개변수가 없는 것부터 16개에 이르는 것까지 버전이 다양하게 때문에 대부분 커버를 할 수 있다. 물론 입력변수가 16개가 넘는다던가, ref나 out 한정자로 수식된 매개변수를 사용해야 하는 경우에는 별도로 만들어줘야한다.
Func 대리자 사용 예
입력 매개변수가 없는 경우이다.
Func<int> func1 = () => 10; // 입력 매개변수는 없고, 무조건 10 출력
Console.WriteLine(func1());
입력 매개변수가 하나 있는 경우이다.
Func<int, int> func2 = (x) => x*2; // 입력 매개변수는 int 형식 하나, 반환 형식도 int
Console.WriteLine(func2(3));
입력 매개변수가 두 개 있는 경우이다.
Func<int, int, int> func3 = (x, y) => x + y; // int 형식 입력 매개변수 2개, 반환 형식도 int
Console.WriteLine(func3(3, 4));
Action
Action 대리자도 Func 대리자와 거의 똑같다. 차이점이라면 Action 대리자는 반환 형식이 없다.
Action 대리자도 Func 대리자처럼 17개 버전이 선언되어 있다.
public delegate void Action<>()
public delegate void Action<in T>(T arg)
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2)
...
public delegate void Action<in T1, ..., in T16>(T1 arg1, ..., T16 arg16)
Action 대리자의 형식 매개변수는 모두 입력 매개변수를 위해 선언되어 있다. Func와 달리 어떤 결과를 반환하는 것을 목적으로 하지 않고, 일련의 작업 수행이 목적이기 때문이다.
Action 대리자 사용 예
입력 매개변수가 아무것도 없는 경우다. 위에서도 말했듯, Action은 반환 형식이 없다.
Action act1 = () => Console.WriteLine("Action()");
act1();
다음은 매개변수가 하나뿐인 경우다.
int result = 0;
Action<int> act2 = (x) => result = x * x; // 람다식 밖에서 선언한 result에 결과를 저장
act2(5);
Console.WriteLine("result : {0}", result);
다음은 매개변수가 두 개인 경우다.
Action<double, double> act3 = (x, y) =>
{
double pi = x / y;
Console.WriteLine("Action<T1, T2>({0}, {1}) : {2}", x, y, pi);
};
act3(22.0, 7.0);
'Languages > C#' 카테고리의 다른 글
[C#] 메소드를 좀 더 간결하게 만들자! : 람다식(Lambda Expression) (0) | 2022.03.28 |
---|---|
[C#] 객체에 일어난 사건 알리기! : 이벤트(Event) (0) | 2022.03.28 |
[C#] 대리자(Delegate)에 대해 좀 더 알아보기 - 2 (0) | 2022.03.27 |
[C#] 콜백 함수(Callback)는 무엇이고 대리자(Delegate)는 뭘까? (0) | 2022.03.27 |
[C#] 프로그램이 어떠한 상황에서도 잘 견딜 수 있도록! : 예외 처리(Exception Handling) (0) | 2022.03.26 |