본문 바로가기

C# 일기

21. 일반화 대리자 Func VS Action

대리자를 사용할 때, 여러 자료형을 다루는 대리자가 필요할 수 있는데, 이를 위해, 일반화한 대리자를 제공한다

 

이에 해당하는 일반화된 대리자가 바로 Func과 Action이다. 

 

간단히 설명하자면, 반환값이 없는 모든 대리자를 만들 수 있는 것이 Action,

 

반환값이 있는 모든 대리자를 만들 수 있는 것이 Func이다.

 

Func과 Action의 사용법에 대해 알아보자.

 

class Methods
{
   public void Print() { Console.WriteLine("Void 메서드"); }
   public void PrintNum(int a, int b) { Console.WriteLine(a + b); }
   
   public int Ten() { return 10; }
   public int Num(float a) { return a; }
}
static void Main(string[] args)
{
   Methods m = new Methods();
   
   Action p = m.Print;
   Action<int, int> pN = m.PrintNum;
   
   Func<int> t = m.Ten;
   Func<float, int> n = m.Num;
}

 

Action은 반환값이 없는 메서드를 일반화하여 등록시킬 수 있는 일반화 대리자이다.

 

Action의 <> 안에 매개변수의 자료형을 매개변수의 갯수만큼 적어주면 된다. 

 

물론, 매개변수가 없는 메서드를 다룰 경우에는 공백으로 남겨두어야 한다. 그렇지 않으면,  매개변수를 전달받는 다른 메서드가 등록될 수 있기 때문이다.

 

Action pN의경우, 정수형 매개변수 두개를 받는 PrintNum을 등록받기 위해서 <>안에 int형 매개변수 두개를 받는다는 의미로 <int, int> 라고 입력했다.

 

이처럼 Action 대리자의 매개변수는 , 컴마로 갯수를 구분하여 입력해야 한다.

 

이와 달리, Action p의 경우엔 매개변수를 전달받지 않는 메서드 Print를 등록받아야하기 때문에, <>를 작성하지 않고 선언했다.

 

 

 

 

 

 

Func은 반환값이 있는 메서드를 일반화하여 등록시킬 수 있는 일반화 대리자다.

 

이는 Func 다음에 오는 <> 안에 자료형을 입력해주는 것으로 구현 가능하다.

 

Func은 Action과는 다르게, 반환값이 있는 메서드를 다루는 대리자이기 때문에, 반환값의 자료형을 반드시 <> 안에 넣어야 한다.

 

따라서, Action이 매개변수를 전달받지 않는 메서드를 등록할 때, <>를 생략한 것과 달리, Func은 <>가 생략되는 일이 없다.

 

우선, 매개변수가 없는 메서드를 등록할 때를 알아보자.

 

먼저, Func<int> t는, 매개변수가 없고, 반환값이 int인 메서드, Ten을 등록하기 위해, 반환값의 자료형인 int를 입력해주었다.

 

다음으로, Func<int, int> n은, float형 매개변수를 전달받고, int값을 반환하는 메서드 Num을 등록하기 위해,  매개변수의 자료형 float와, 반환값의 자료형 int를 , 컴마로 구분하여 입력하였다.

 

Func도 Action때와 마찬가지로 매개변수의 갯수를 컴마로 구분지어 계속 입력할 수 있다.

 

단, 여기서 주의해야 할 점은, Func은 반드시 반환값의 자료형을 입력해야 하기 때문에 이에 유의하여야 한다.

 

입력 순서에 유의하여야 하는데, 매개변수로 몇개를 전달받든 Func의 <> 마지막에는 꼭 반환값의 자료형을 입력해야한다.

 

 

 

 

 

위의 Method 함수는 매개변수로 int, string, double을 전달받고, float을 반환하는 메서드이다.

 

이 경우, 매개변수인 int, string, double을  먼저, 반환값의 자료형인 float를 가장 나중에 입력해야한다는 것이다.

 

물론, 매개변수와 반환값의 자료형 입력 순서에도 유의하여야 하지만, 매개변수의 입력 순서 역시 중요하다.

 

public static float Method(int a, string s, double b) { /* ... */}
public static float Method2(string s, int i, double b) { /* ... */}

Func<int, string, double, float> m = Method;
Func<string, int, double, float> m2 = Method2;

 

위의 Func m과 Func m2가 등록할 수 있는 메서드는 서로 다르다. 왜냐하면, 입력한 매개변수의 자료형 순서가 서로 다르기 때문이다.

 

이는 Func과 Action 모두에게 해당되는 것으로, 등록하려는 메서드가 전달받는 매개변수의 자료형을 입력하는 순서를 구분하기 때문에, 이에 유의하여 작성하여야 한다.

'C# 일기' 카테고리의 다른 글

23. IEnumerable과 yield  (0) 2024.03.12
22. this와 this생성자 this()  (0) 2024.03.12
20. 람다식(Lambda Expression)  (0) 2024.03.11
19 - 1. 이벤트 VS 대리자  (0) 2024.03.11
19. 이벤트(Event)  (0) 2024.03.11