🔗 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
반환 타입이 없고, (매개변수가 없는) 델리게이트이다.
코드를 보면 이 역시 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의 한계는 매개변수가 있는 델리게이트에 한해서는 사용이 불가하다는 점이다.
그래서 나온 개념이 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; }
}
반환 타입(제네릭)이 있고 매개변수가 없는 델리게이트이다.
코드를 보면 다음과 같다.
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도 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;
}
}