C# 문법 | Action, Func 반환타입 유무에 따른 델리게이트 + Generic

seunghyun·2024년 9월 16일
0

🔗 Action 대리자 출처 : https://learn.microsoft.com/ko-kr/dotnet/api/system.action?view=net-8.0

🔗 Func 대리자 출처 : https://learn.microsoft.com/ko-kr/dotnet/api/system.func-2?view=net-7.0

Action

반환 타입이 없고, (매개변수가 없는) 델리게이트이다.

코드를 보면 이 역시 using System; 선언이 필요하며,

이벤트 핸들러처럼 Action, Func도 System에 미리 선언된 델리게이트라고 할 수 있다.

namespace System
{
	public delegate void Action();
}

사용법

활용하는 예를 간단히 보자!

...
using System;

public class TestDelegate : MonoBehaviour
{
	Action action;
    
    private void Start()
    {
    	action = () => Debug.Log("Action1");
        action += () => Debug.Log("Action2");
        action += () => Debug.Log("Action3");
    
    	action.Invoke();
    }
}

Action Generic

하지만 이 Action의 한계는 매개변수가 있는 델리게이트에 한해서는 사용이 불가하다는 점이다.
그래서 나온 개념이 Action<T> 라는 제네릭 델리게이트 (=일반화 대리자) 이다. 이를 사용하면 Action에서도 매개변수를 사용할 수 있다.

namespace System
{
	public delegate void Action<in T>(T obj);
}

매개변수를 16개나 쓸 수 있도록 이미 만들어져 있어서 개수는 걱정할 필요가 없을 것 같다 ㅎㅎ..

사용 예는 다음과 같다.

public class TestAction : MonoBehaviour
{
	Action<int> action1;
    Action<int, int> action2;
    Action<string, string, string> action3;
    
    void Start()
    {
    	action1 = Test1;
        action2 = Test2;
        action3 = Test3;
        
        action1.Invoke(1);
        action2.Invoke(2, 3);
        action3.Invoke("four", "five", "six");
    }
    
    public void Test1(int num){ Debug.Log(num); }
	public void Test2(int num1, int num2){ Debug.Log(num1+num2); }   
    public void Test3(string str1, string str2, strint str3){ Debug.Log(str1 + str2 + str3; }
}

Func

반환 타입(제네릭)이 있고 매개변수가 없는 델리게이트이다.

코드를 보면 다음과 같다.

namespace System
{
	public delegate TResult Func<out TResult>();  
}

사용 예시를 보자!


public class TestFunc : MonoBehaviour
{
	Func<int> func;
    
    void Start()
    {
    	func = () => 
        {
        	int num2 = 3;
            return num2;
        };
        
        // chain 
        func += () =>
        {
        	return int.MinValue;
        };
        
        // chain
        func += Test1;
        
        int num1 = func.Invoke();
    }
    
    public int Test1()
    {
    	int num2 = 3;
        return num2;
    }
}

Func Generic

Func도 Action처럼 흡사하게 제네릭이 있고 매개변수도 16개까지 넣어줄 수 있다.
차이점은 반환타입이 있다는 것!!

namespace System
{
	public delegate TResult Func<in T, out TResult>(T arg);
}

namespace System
{
	public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
}

...

사용 예시를 보자!

public class TestFuncGeneric : MonoBehaviour
{
	void Start()
    {
    	Func<int> func1 = () =>
        {
        	return 1;
        };
        
        Func<int, int> func2 = (int num) =>
        {
        	return num;
        };
        
        Func<int, int, int> func3 = Test;
        
        int result1 = func1.Invoke();
        int result2 = func1.Invoke(2);
        int result3 = func1.Invoke(3,4);
    }
    
    public int Test(int num2, num3)
    {
    	return num2 + num3;
    }
}
profile
game client programmer

0개의 댓글