[Unity/C#]선언된 델리게이트

강동현·2024년 1월 23일
0

Unity/C#

목록 보기
15/26

선언된 델리게이트

  • UnityC#에는 미리 선언된 델리게이트 형태가 존재
  • 미리 선언된 델리게이트
    • 0. EventHandler
    • 1. Action
      • 반환 타입이 없는 델리게이트
      • 반환 타입이 없는 함수를 다룰 경우 사용
    • 2. Func
      • 반환 타입이 있는 델리게이트
        • 반환 타입이 있는 함수를 다룰 경우 사용
    • 3. Predicate
      • 아래 조건이 성립하는 델리게이트
      • 반환타입bool
      • 매개변수하나고정
    • 4. UnityAction
      • Unity에서 만들어 놓은 델리게이트

1. Action

  • Action > Delegate
    • 편의성 측면에서 액션을 델리게이트보다 많이 사용
  • 매개변수리턴값이 없는 미리 선언된 델리게이트
Action action;
private void Sstart(){
	action += () => Debug.Log("Action1");
    action += () => Debug.Log("Action2");
    action += () => Debug.Log("Action3");
}
  • Action의 장점
    • 델리게이트의 복잡한 선언 과정을 간소화

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();
}
  • Func의 장점
    • 델리게이트의 복잡한 선언 과정을 간소화

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); // 1 - 2 = -1;
}

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>

  • 인자가 있는 UnityAction
    • 인자4개까지 사용 가능
public delegate void UnityAction<T0>(T0 arg0);
UnityAction<int> unityAction;
profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글