Delegate / Event
Delegate
정의
같은 형식의 [단일 / 복수] 함수를 대신하여 호출해주는 대리자
- 메서드만 호출 가능
- 외부에서도 호출 가능 (단, private / protected 메서드는 호출 불가)
형식
// [접근 한정자] delegate [반환형] [델리게이트 타입 이름](메서드 매개변수) public delegate int MyIntDelegate(string name);
사용
(c# 1.0 이상)
// [델리게이트 타입 이름] [델리게이트 변수 이름] = new [델리게이트 타입 이름](메서드 이름); MyIntDelegate myIntDelegate = new MyIntDelegate(MyFunction); myIntDelegate(5); // 델리게이트에 등록된 함수들에 매개변수 5가 전달되어 호출
(c# 2.0 이상)
// [델리게이트 타입 이름] [델리게이트 변수 이름] = 메서드 이름; MyIntDelegate myIntDelegate = MyFunction; myIntDelegate(5);
Multicast Delegate
‘다수’의 메서드를 호출
- 포함
myIntDelegate += MyFunction1; myIntDelegate += MyFunction2;
- 제거
myIntDelegate -= MyFunction1; myIntDelegate -= MyFunction2;
- 포함
Evenet
정의
특정 상황이 발생했을 때, 알리고자하는 용도 (호출 + 데이터 전달)
특징
Event는 해당 Event를 포함하는 class 의 method 내부에서만 실행 가능
형식
public class Test : MonoBehaviour
{
// [접근 한정자] event [델리게이트 타입 이름] [이벤트 변수 이름]
public static event MyIntDelegate MyIntEvent;
public void CallEvent() // 이 함수를 실행하면
{
MyIntEvent("test"); // 이 이벤트에 "test"라는 매개변수를 넣어 호출하겠다.
}
}
public class Test2 : MonoBehaviour
{
private void Start()
{
Test.MyIntEvent += TestFunction; // static 으로 event를 선언해서 별도의 객체 없이 접근, += 로 추가 / -= 로 제거
}
private int TestFunction(string name) // delegate와 형식이 일치한다.
{
print(name);
return 0;
}
}