델리게이트 선언 시 주로 쓰는 게 4가지 있다.
DECLARE_DYNAMIC_MULTICAST_DELEGATE
DECLARE_MULTICAST_DELEGATE
DECLARE_DYNAMIC_DELEGATE
DECLARE_DELEGATE
이 뒤에 추가적으로 _OnParam, _TwoParams 등을 붙여 필요하다면 매개변수를 줄 수도 있다.
// A.h
DECLARE_DELEGATE_OneParam(FOnTestComplete, bool bWasSuccessful);
FOnTestComplete OnTestComplete;
// A.cpp
OnTestComplete.Broadcast(true);
클래스 A가 매개변수로 bool 하나를 갖는 델리게이트를 선언, 호출하고 있다.
// B.cpp
void UB::Setup()
{
A->OnTestComplete.AddUObject(this, &ThisClass::OnTest);
}
void UB::OnTest(bool bWasSuccessful)
{
...
}
클래스 B는 A를 참조하고 있으며, A의 델리게이트인 OnTestComplete에 자신의 OnTest 함수를 바인딩한다.
A는 B를 참조할 필요가 없다. B에서 이벤트 발생 시(버튼 클릭 등) A의 함수를 호출하고, A는 적절한 처리를 거친 뒤 OnTest를 호출할 타이밍이 되면 OnTestComplete를 브로드캐스트하면 된다.
함수 포인터와 같은 기능을 하는 것으로 보이지만 언리얼에선 델리게이트를 쓰는 이유가 있다.
먼저 MULTICAST는 함수 여러 개를 바인딩해줄 수 있다.
또 DYNAMIC을 통해 블루프린트와 연동도 가능하다.(콜백함수에 UFUNCTION 꼭 필요)
무엇보다 함수 포인터는 컴파일 타임에 고정되어 변경 불가능하다. 하지만 델리게이트는 런타임중에도 동적으로 바인딩된 함수를 변경하거나, 완전히 제거해줄 수도 있다.
MULTICAST를 붙이지 않은 경우 새로 바인딩을 시도하면 자동으로 기존 함수를 버리고 바인딩하기 때문에 편리하다.
콜백함수가 자주 쓰이는 MVC 패턴이나 서버와의 상호작용 등을 구현하려면 반드시 알아야 하는 기능이다.