본문 바로가기
Game Engine/Unreal

(Unreal) Events와 Multicast Delegates의 차이점에 대하여

by MeisterTJ 2022. 8. 6.
 

Events

Delegates that can be bound to multiple functions and execute them all at once.

docs.unrealengine.com

EventsMulticast 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와 사실상 차이가 없다고 봐도 무방하다.