델리게이트 Delegate
C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형
특정 객체가 해야 할 로직을 다른 객체가 대신 처리할 수 있도록 만드는 보편적인 설계의 개념
델리게이트는 임의 오브젝트의 멤버함수에 동적으로 바인딩시킬 수 있으며, 그런 다음 그 오브젝트에서 함수를 호출할 수 있습니다.
또한 값으로 전달하는 경우 Heap에 메모리를 할당하게되는데, 델리게이트는 참조 전달을 위주로 하기 때문에 복사에도 안전합니다.
특징
- 특정 이벤트나 동작이 발생시에 호출할 함수를 미리 등록해주는 콜백 메커니즘
- C++의 함수포인터와 비슷한 역할
- std::function이 싱글캐스트 델리게이트와 비슷하다.
- 결합도를 낮추고 유연한 이벤트 처리를 할 수 있다.
- 델리게이트 선언시 어떤 데이터를 전달하고 받을것인지 인자의 수와 타입의 설계에 따라 사용되는 매크로가 결정된다.
델리게이트 선언 매크로
DECLARE_[델리게이트 유형]_DELEGATE_[함수 정보(RetVal_OneParam...]
- Simple : 함수 하나만 바인딩 가능
- DECLARE_DELEGATE
- Multicast : 여러개의 함수가 한 이벤트에 바인딩이 가능하다
- DECLARE_MULTICAST_DELEGATE, DECLARE_DYNAMIC_MULTICAST_DELEGATE
- Dynamic : 블루프린트에서 바인딩이 가능하며, 런타임에서 바인딩 과 언바인딩이 가능하다.
- DECLARE_DYNAMIC_DELEGATE,DECLARE_DYNAMIC_MULTICAST_DELEGATE
유형
- DECLARE_DELEGATE : 1:1 형태로 전달시에 사용하며, C++에서만 지원한다.
- DECALRE_MULTICAST : 1:N 형태로 전달시에 사용되며, C++에서만 지원한다.
- DECLARE_DYNAMIC : 1:1형태로 전달하며, 블루프린트에서도 바인딩이 가능하다.
- DECLARE_DYNAMIC_MULTICAST : 1:N형태로 전달하며, 블루프린트에서도 바인딩이 가능하다.
함수 정보
- 인자가 없고 반환값이 없는 경우 - DECLARE_DELEGATE
- 인자가 하나, 반환값이 없는 경우 - DECLARE_DELEGATE_OneParam
- 인자가 하나, 반환값이 있는 경우 - DECLARE_DELEGATE_RetVal_OneParam
- RetVal의 경우 블루프린트 형식을 지원하는 DYNAMIC에서만 선언이 가능하다.
바인딩
UObject 또는 공유 포인터 클래스 멤버에 델리게이트를 바인드 할 경우 오브젝트에 대한 레퍼런스를 낮은 응집도를 유지할 수 있으며, 오브젝트 소멸시 IsBound(), ExecuteIfBound() 함수를 호출하여 처리할 수 있다.
- Bind() : 기존 델리게이트 오브젝트에 바인딩
- BindStatic() : 정적 함수에 바인딩
- BindUObject() : UObject 멤버 함수에 바인딩
- AddStatic() : 함수 바인딩
실행
- Execute() : 바인딩 되어있는지 확인
- ExecuteIfBound() : 반환값이 없는 델리게이트의 경우
- IsBound() : 모든 바인딩된 함수를 호출한다. (MULTICAST에서만 가능하다.)
// 델리게이트 선언
DECLARE_MULTICAST_DELEGATE(FSimpleMulticastDelegate);
// 델리게이트 객체
FSimpleMulticastDelegate OnEventTriggered;
void TriggerEvent()
{
// 모든 바인딩된 함수 호출
OnEventTriggered.Broadcast();
}
};
void MyFunction1()
{
UE_LOG(LogTemp, Warning, TEXT("Function 1 Triggered!"));
}
void MyFunction2()
{
UE_LOG(LogTemp, Warning, TEXT("Function 2 Triggered!"));
}
void TestMulticastDelegate()
{
MyClass Instance;
Instance.OnEventTriggered.AddStatic(&MyFunction1); // 함수 바인딩
Instance.OnEventTriggered.AddStatic(&MyFunction2); // 또 다른 함수 바인딩
Instance.TriggerEvent(); // 두 함수 모두 호출
}
'Unreal Engine > 개념정리' 카테고리의 다른 글
[UE5] - Actor, Pawn, Character (0) | 2025.01.24 |
---|---|
[UE5] - CDO(Class Default Object), 오브젝트 생성 (0) | 2025.01.15 |
언리얼 컨테이너 라이브러리 (TMap, TSet) (0) | 2024.12.20 |
언리얼 컨테이너 라이브러리 , STL 차이점 (+ TArray) (0) | 2024.12.19 |
UE5 - 액터의 라이프사이클 (0) | 2024.12.18 |