Game Development, 게임개발/개발

C#에서의 Func, Action [Unity]

게임이 더 좋아 2022. 4. 4. 23:28
반응형
728x170

메서드와 Action이 같을까?

 

한 번쯤 Action을 써봤을 수도 있다.

그렇다면 Action을 쓰면 메서드가 실행되는 것을 안다.

하지만 메서드와 실행방식이 다르다.

등록의 과정이 필요하다.

또한 Func이나 Action은 일반 메서드가 아닌 무명메서드도 등록이 된다.

 

???흠.. 무명메서드가 되는 이유가 무엇일까??

 

사실 무명 메서드를 사용하기 위헤서는 델리게이트 변수가 있어야하고

델리게이트 타입의 변수를 선언해야한다.

 

그렇다면 각기 다른 타입의 무명 메서드를 여러개 만들 때는 어떻게 해야할까?

당연히 무명 메소드마다 그 타입에 맞는 델리게이트 타입과 변수를 따로 따로 선언해야 할 것이다.

 

 

하지만 비효율적인 작업이기 때문에 C#에서는 Func과 Action이라는 델리게이트를 제공한다.

 

Func와 Action은 키워드다.

미리 선언된 델리게이트 변수다.

따로 우리가 선언하지 않다도 된다는 말이다.

 

Func는 반환값이 있는 메서드를 참조하는 델리게이트 변수고

Action은 반환값이 없는 메서드를 참조하는 델리게이트변수다.

 


Action - 매개 변수를 0~16개 가질 수 있는 값을 반환하지 않는 메서드를 캡슐화
Func - 매개 변수를 0~16개를 가질 수 있는 값을 반환하는 메서드를 캡슐화

 

조금 쓰임이 다르다.

알아보자

 


 

우선 2가지의 형태는 이렇다.


Action
public delegate void Action<입력 매개변수> (매개변수);


Func
public delegate 반환형 Func<입력 매개변수,반환형> (매개변수);

 


 

먼저 Func 델리게이트를 알아보자.

 

.NET Framework에는 총 17가지의 Func 델리게이트가 준비되어 있다.

즉, 매개변수가 없는 메서드부터 매개변수가 16개까지 총 17개의 메서드 사용가능.

 

사실 우리는 이 미리 정의된 델리게이트 키워드 덕분에 굳이 델리게이트를 선언하지 않고도 

빌려다 쓴다.

 

아래의 예에서는 int를 반환하는 Func의 쓰임이다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    delegate void DelegateParameterTwo(int n1, int n2);
 
    class Program
    {
        static void Main(string[] args)
        {
            Func<int> value = () => 2+8;
            Console.WriteLine(value());
            Func<int, int, int> plus = (n1, n2) => n1 + n2;    
            Console.WriteLine(plus(2, 7));
            Func<int, int, float> minus = (n1, n2) => n1 * n2 * 0.5f; 
            Console.WriteLine(minus(6, 7));
        }
    }
}

 

 

보다피 매개변수는 앞에서 지정하고, 반환값은 맨 뒤에 지정하는 것을 확인할 수 있다.

**Func는 반환값을 가진 메서드를 참조하는 델리게이트이기 때문에, 반환형을 반드시 지정해주어야 한다.

 

위와 같이 Func 델리게이트로 메소드를 참조하면 델리게이트 타입을 선언하는 과정을 생략한다.

그래서 아주 간결하게 코드를 작성할 수 있다.

 


 

다음으로는 Action 델리게이트

 

Action 델리게이트는 Func와 똑같다.

다만 참조하는 메소드의 반환값이 없을 뿐이다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
 
    class Program
    {
        static void Main(string[] args)
        {
            Action output1 = () => Console.WriteLine("AAAA");
            output1();
 
            Action<int> output2 = (v) => Console.WriteLine(v);
            output2(2);
        }
    }
}

 

 

 

 

728x90
반응형
그리드형