델리게이트란 메서드를 하나의 값처럼 다루기 위해 사용하는 C#의 타입이다.
함수를 직접 호출하는 대신, 나중에 실행할 동작을 미리 등록해 두는 용도로 사용된다.
주로 이벤트 처리, 상태 변화 알림, UI, 시스템 간 연결과 같이 어떤 일이 발생했음을 전달하는 구조에서 활용된다.
델리게이트는 “특정 형태의 메서드를 참조할 수 있는 타입” 이다.
즉, 어떤 매개변수를 받고 어떤 값을 반환하는지가 동일한 메서드만 연결할 수 있다.
델리게이트는 delegate 키워드를 사용해 선언한다.
public delegate void SimpleDelegate();
위 델리게이트는 반환값이 없고 매개변수가 없는 메서드만 참조할 수 있다.
델리게이트에는 메서드의 실행이 아닌 참조를 할당한다.
void PrintLog()
{
Debug.Log("Hello");
}
SimpleDelegate myDelegate = PrintLog;
myDelegate();
메서드 이름 뒤에 ()를 붙이지 않는 이유는 즉시 실행이 아니라, 나중에 실행하기 위한 연결이기 때문이다.
매개변수가 있는 델리게이트 델리게이트는 매개변수도 가질 수 있다.
public delegate void DamageDelegate(int damage);
void TakeDamage(int damage)
{
Debug.Log(damage);
}
DamageDelegate onDamage = TakeDamage;
onDamage(10);
델리게이트에 연결된 메서드는 선언 시 정의한 시그니처와 반드시 동일해야 한다.
델리게이트를 사용하면
호출하는 쪽과 실행되는 로직을 분리할 수 있다.
버튼은 눌렸다는 사실만 알리기에 실제 동작은 외부에서 결정
이 구조를 통해 결합도가 낮아지고, 확장성과 유지보수가 좋아진다.
C#에서는 자주 사용하는 델리게이트를
미리 정의해 둔 타입을 제공한다.
Action
반환값이 없는 델리게이트이다.
Action onClick;
Action<int> onDamage;
Func
반환값이 있는 델리게이트이다.
Func<int, bool> isAlive;
마지막 타입이 반환값을 의미한다.
델리게이트는 외부에서 직접 호출할 수 있다는 문제가 있다.
이를 보완하기 위해 event 키워드를 사용한다.
delegate는 외부에서 Invoke 가능 event는 외부에서 Invoke 불가능 등록과 해제만 허용