멀티캐스트(multi-cast) 델리게이트는 싱글캐스트 델리게이트의 기능 대부분을 그대로 갖고 있습니다. 오브젝트로의 약 레퍼런스만 갖고 있으며, 구조체와 함께 사용 가능하고, 쉽게 복사할 수 있고, 등등입니다. 보통의 델리게이트와 마찬가지로 멀티캐스트 델리게이트 역시 로드/세이브 가능하며 원격으로 트리거되나, 멀티캐스트 델리게이트 함수는 반환값을 사용할 수는 없습니다. 델리게이트 컬렉션을 쉽사리 옮기는 데 사용하기에 좋습니다.
이벤트는 특수한 유형의 멀티캐스트 델리게이트로, 제한적이나마 Broadcast()
, IsBound()
, Clear()
함수에 접근 가능합니다.
멀티캐스트 델리게이트 선언
멀티캐스트 델리게이트는 표준 델리게이트 선언 방법과 똑같은 방법으로 선언되나, 멀티캐스트 델리게이트 전용 매크로를 사용한다는 점이 다릅니다.
선언 매크로 | 설명 |
---|---|
DECLARE_MULTICAST_DELEGATE[_RetVal, ...]\( DelegateName \) |
멀티캐스트 델리게이트를 생성합니다. |
DECLARE_DYNAMIC_MULTICAST_DELEGATE[_RetVal, ...]\( DelegateName \) |
다이내믹 멀티캐스트 델리게이트를 생성합니다. |
멀티캐스트 델리게이트 바인딩
멀티캐스트 델리게이트는 여러 개의 함수를 바인딩시켜 델리게이트가 발동되면 모두 호출되도록 할 수 있습니다. 그 결과, 의미론적으로 함수 바인딩이 변수같은 식에 좀 더 가깝습니다.
함수 | 설명 |
---|---|
Add() |
이 멀티캐스트 델리게이트의 실행 목록에 함수 델리게이트를 추가합니다. |
AddStatic() |
raw C++ 포인터 글로벌 함수 델리게이트를 추가합니다. |
AddRaw() |
raw C++ 포인터 델리게이트를 추가합니다. raw 포인터는 어떠한 레퍼런스도 사용하지 않기에, 오브젝트가 자신의 델리게이트 하에서 삭제된 경우 호출시 안전하지 않을 수 있습니다. Execute() 호출시 주의하세요! |
AddSP() |
공유 포인터 기반 (빠르지만 스레드 안전성은 떨어지는) 멤버 함수 델리게이트를 추가합니다. 공유 포인터 델리게이트는 자신의 오브젝트에 대한 약 레퍼런스를 유지합니다. |
AddUObject() |
UObject 기반 멤버 함수 델리게이트를 추가합니다. UObject 델리게이트는 자신의 오브젝트에 대한 약 레퍼런스를 유지합니다. |
Remove() |
이 멀티캐스트 델리게이트의 실행 목록에서 함수를 제거합니다 (퍼포먼스는 O(N) 입니다). 참고로 델리게이트 순서는 유지되지 않을 수 있습니다! |
RemoveAll() |
지정된 UserObject 에 바인딩된 이 멀티캐스트 델리게이트의 실행 목록에서 모든 함수를 제거합니다. 참고로 델리게이트 순서는 유지되지 않을 수 있습니다! |
RemoveAll()
은 제공된 포인터에 바인딩된 모든 등록 델리게이트를 제거합니다. 염두에 둘 것은, 오브젝트 포인터에 바인딩되지 않은 raw 델리게이트는 이 함수로 제거되지 않습니다!
이 함수의 변종, 인수, 구현 관련 자세한 내용은 ..\UE4\Engine\Source\Runtime\Core\Public\Delegates\
에 있는 DelegateSignatureImpl.inl
을 참고하시기 바랍니다.
멀티캐스트 실행
멀티캐스트 델리게이트를 통해 여러 함수 델리게이트를 붙인(attach) 다음, 멀티캐스트 델리게이트의 Broadcast()
함수를 호출하여 그 모두를 동시에 실행시킬 수 있습니다. 멀티캐스트 델리게이트 시그너처에는 반환값을 사용할 수 없습니다.
멀티캐스트 델리게이트에서의 Broadcast()
호출은 아무것도 바인딩되어 있지 않더라도 항상 안전합니다. 딱 한 가지 경우 조심해야 할 때가 있는데, 델리게이트를 사용하여 출력 변수를 초기화시킬 때로 보통은 매우 좋지 않은 일입니다.
Broadcast()
호출시 바인딩된 함수의 실행 순서는 정의되지 않습니다. 함수가 추가된 순서대로 실행되지 않을 수가 있습니다.
함수 | 설명 |
---|---|
Broadcast() |
이 델리게이트를 만료되었을 수도 있는 것을 제외하고, 바인딩된 모든 오브젝트에 뿌립니다. |