Events와 Multicast Delegates는 굉장히 흡사해보인다.
동일한 함수들을 가지고 있고, 하는 일도 같아 보인다.
공식 문서에 따르면, Events는 Multicast Delegates와 굉장히 흡사하지만, 이벤트를 선언한 클래스만이 이벤트의 Broadcast, IsBound, Clear 함수를 호출할 수 있다고 적혀 있다.
그 말인 즉슨, Event를 선언한 클래스 외에는 Event에 바인딩이 가능하지만, Event를 Clear하거나 Broadcast를 호출하는 등의 동작은 불가하게 되므로, Event를 안심하고 public 인터페이스에 노출할 수 있다는 의미가 된다.
이러한 특징은 C#이 가진 delegate와 event의 특징을 언리얼에서 그대로 가져온 것이라 할 수 있다.
과연 실제 동작도 그럴까?
class UClassA
{
public:
DECLARE_EVENT(UClassA, FSomeEvent);
FSomeEvent SomeEvent;
}
class UClassB
{
public:
void BroadCast()
{
UClassA ClassA;
// Compile Error?
ClassA.SomeEvent.Broadcast();
}
}
공식 문서대로라면,
위와 같은 코드를 작성하였을 때, UClassB에서 UClassA에 존재하는 SomeEvent에 대한 Broadcast 호출이 불가해야 맞다.
그러나 실제로 사용해보면, 위와 같은 코드는 아무 문제 없이 컴파일이 되는 것을 알 수 있다.
실제로 Event의 선언부를 보면, Event는 MulticastDelegate를 상속받고 있으며
OwningType을 friend class로 하고 있음을 알 수 있다.
그렇다는 것은 private 멤버 함수나 변수에 대한 접근을 OwningType에서만 할 수 있다는 의미인데,
Broadcast, IsBound, Clear 함수들은 전부 public 멤버이기 때문에 friend class가 딱히 의미가 없게 된다.
위와 같은 질문을 UDN에 올렸고,
위와 같은 답변을 받았다.
현재 Event에는 제약이 없는 상태라, 공식 문서와는 다르게 작동한다는 것.
즉 multicast delegate와 사실상 차이가 없다고 봐도 무방하다.
'Game Engine > Unreal' 카테고리의 다른 글
(Unreal) 블루프린트 매크로 (Blueprint Macro) (0) | 2022.11.02 |
---|---|
(Unreal) Source Code Navigation (0) | 2022.10.11 |
(Unreal) Fasoo DRM으로 망가지는 언리얼 엔진 (0) | 2022.08.14 |
(Unreal) UE4 with PhysX Visual Debugger (0) | 2022.06.03 |
(Unreal) UE5에서 Jetbrains Rider 설치, 사용하기 (0) | 2022.06.01 |