익명 메소드
이벤트: 객체에 일어난 사건 알리기
람다식
람다식, 너는 어디에서 왔니?
private delegate void SecondElapsedDelegate();
// void() 타입의 함수만 보관할 수 있음.
// 타입을 정의
public SecondElapsedDelegate OnSecondElapsed;
// SecondElapsedDelegate 타입의 객체
OnSecondElapsed를 생성
// OnSecondElapsed에는 void() 타입의 함수를 넣을 수 있음
void Foo();
OnSecondElapsed += Foo;
delegate void EventHandler(string message);
// void(string) 타입의 함수를 보관할 수 있는 대리자
EventHandler 타입 정의
---
EvnetHandler eventHandler;
eventHandler += Foo; // 오류
// Foo 타입은 void()
// EventHandler 대리자 타입이 담을 수 있는 함수는 void(string).
---
public SecondElapsedDelegate : System.
MulticastDelegate
{
}
delegate int Foo();
// int() 타입의 함수만 넣을 수 있음
delegate float Boo(int, double);
// float
이벤트는 외부에서 함부로 호출할 수 없다.
대리자는 그냥 함수만 보관하는 타입이기 때문에 외부에서도 호출한든 말든 상관없다.
대리자
- 함수를 보관할 수 있는 타입
- 사용자 정의 대리자를 만들 수도 있지만 System.Action 혹은 System.Func 혹은 UnityAction을 사용한다.
- Invoke() 메소드로 보관된 모든 함수를 호출할 수 있다.
이벤트
- 옵저버 패턴을 쉽게 사용하기 위한 타입
- 선언된 대리자 타입의 함수를 보관할 수 있다.
- 대리자와 다르게 외부에서 Invoke()를 할 수 없다.
- 함수가 중복되어 추가 된다면 디버깅이 매우 어렵기 때문에 꼭 추가 전에는 삭제를 해준다.
- 이벤트 객체에 아무런 함수도 없는 경우에는 null이기 때문에 Invoke()를 호출할 때는 꼭 Null 체크를 해준다.
- Ex. OnTakenDamage?.Invoke();