<--! 수학 기호 --> [C#] 더 간편하게 무명 함수 만들기! : Func, Action

새소식

반응형
Language/C#

[C#] 더 간편하게 무명 함수 만들기! : Func, Action

  • -

*이 글은 <이것이 C#이다> 책을 바탕으로 공부한 글입니다.

 

 

 

익명 메소드와 무명 함수는 일회성으로만 사용할 함수 사용에 용이하며, 코드를 좀 더 간결하게 만들어 주는 요소들이다.

하지만, 둘 다 대리자(Delegate)가 필요하기 때문에 사전에 먼저 대리자를 선언해줘야 하는 번거로움이 있다.

 

귀찮지 않을 수가 없다. 한 번만 사용할 건데, 사용할 때마다 매번 대리자를 선언해야 한다니...

그래서 이런 번거로움을 해결해주기 위해, 마이크로소프트 .NET에서는 이런 익명 메소드와 무명 함수들을 위한 대리자들을 미리 선언을 해놨다. 그 대리자들이 바로 오늘 알아볼 FuncAction이다.

 

 

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);

 

 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.