선언된 델리게이트
- Unity와 C#에는 미리 선언된 델리게이트 형태가 존재
- 미리 선언된 델리게이트
- 0. EventHandler
- 1. Action
- 반환 타입이 없는 델리게이트
- 반환 타입이 없는 함수를 다룰 경우 사용
- 2. Func
- 3. Predicate
- 아래 조건이 성립하는 델리게이트
- 반환타입이 bool
- 매개변수가 하나로 고정
- 4. UnityAction
1. Action
- Action > Delegate
- 편의성 측면에서 액션을 델리게이트보다 많이 사용
- 매개변수와 리턴값이 없는 미리 선언된 델리게이트
Action action;
private void Sstart(){
action += () => Debug.Log("Action1");
action += () => Debug.Log("Action2");
action += () => Debug.Log("Action3");
}
1-1. Action<T>
- 제네릭<T>을 활용해 매개변수를 사용할 수 있는 Action
- 원형 형태
public delegate void Action<in T>(T obj);
Action<int> action1;
Action<int, int> action2;
Action<string, string, string> action3;
private void Start()
{
action1 += Test1;
action2 += Test2;
action3 += Test3;
action1.Invoke(1);
action2.Invoke(2, 3);
action3.Invoke("Bitcoin", "Bull", "Market");
}
public void Test1(int num1) { Debug.Log(num1); }
public void Test2(int num1, int num2) { Debug.Log(num1 + num2); }
public void Test3(string str1, string str2, string str3) { Debug.Log(str1 + str2 + str3); }
2. Func
- Func > Delegate
- 편의성 측면에서 Func를 델리게이트보다 많이 사용
- 리턴값이 있는 미리 선언된 델리게이트
- 원형 형태
public delegate TResultFunc <out TResult>();
Func<int> func;
private void Start(){
func += () => {
int num = 3;
Debug.Log(num);
return num;
};
func += () => {
int num = 1;
Debug.Log(1);
return num;
};
int num1 = func.Invoke();
}
2-1. Func<T>
- 제네릭<T>을 활용해 매개변수를 지닌 Func 정의** 가능
- [TIPS] 모든 Func 함수의 가장 마지막 인자는 반환 타입의 형태
- 가장 마지막의 앞에 위치한 모든 인자는 매개변수의 형태
- 원형 형태
public delegate TResult Func<in T1, ..., in TN, out TResult>(T1 arg1, ..., TN argN);
private void Start(){
Func<int> func1 = () =>{
return 1;
};
Func<int, int> func2 = (int num) =>{
return num;
};
Func<int, int, int> func3 = Test;
}
public int Test(int num1, int num2){
return num1 + num2;
}
2-2. Func 체인
- Func 체인의 경우 리턴 값이 여러 개 존재한다.
- 여러개를 리턴 받는 경우
void Click(){
OnStartClicked += Add;
OnStartClicked += Sub;
int result = OnStartClicked(1, 2);
print(result);
}
3. Predicate<T>
- 반환타입이 bool & 매개변수가 하나로 고정된 델리게이트
- 해당 델리게이트가 true or false를 판단할 때 사용
- 일반적인 델리게이트나 Func로 대체 가능
- 원형 형태
public delegate bool Predicate<in T>(T obj);
Predicate<int> predicate;
void Start(){
predicate = (int num) => {
if(num > 10) return true;
else return false;
};
bool b = predicate.Invoke(1);
Debug.Log(b);
}
4. UnityAction
- Unity에서 만들어놓은 델리게이트
- 버튼에 이벤트를 연결할 때 주로 사용
- 전처리 구문
using UnityEngine.Events;
public delegate void UnityAction();
UnityAction unityAction;
publicButton button;
private void Start(){
unityAction += () => Debug.Log("Button1");
button.onClick.AddListener(unityAction);
button.onClick.AddListener(() => Debug.Log("Button2"));
}
4-1. UnityAction<T>
public delegate void UnityAction<T0>(T0 arg0);
UnityAction<int> unityAction;