Event와 Delegate의 차이가 무엇일까?

박승우·2024년 6월 21일

자 쉰 한 번째 키워드인 'Event와 Delegate의 차이'를 알아 볼 것이다.

C# 언어에서 사용되는 언어이기 때문에 이론과 코드로 알아보았다.

Delegate가 뭐에요?

Delegate는 C#에서 메서드 참조를 캡슐화하는 형식이다. Delegate를 사용하면 메서드를 변수처럼 저장하고 실행할 수 있다. Delegate는 다음과 같은 특징을 가진다.

  1. 형식 안전: Delegate는 특정 메서드 서명을 정의하여, 해당 서명과 일치하는 메서드만 참조할 수 있다.

  2. 멀티캐스트: 하나의 Delegate 인스턴스에 여러 메서드를 등록할 수 있으며, 호출 시 등록된 모든 메서드를 순차적으로 실행한다.

Delegate Code

using UnityEngine;

// Delegate 선언
public delegate void MyDelegate(string message);

public class DelegateExample : MonoBehaviour
{
    // Delegate 인스턴스
    public MyDelegate myDelegate;

    void Start()
    {
        // Delegate에 메서드 등록
        myDelegate += DisplayMessage;
        myDelegate += DisplayUpperCaseMessage;

        // Delegate를 통해 메서드 호출
        if (myDelegate != null)
        {
            myDelegate("Hello, Delegates in Unity!");
        }
    }

    void DisplayMessage(string message)
    {
        Debug.Log(message);
    }

    void DisplayUpperCaseMessage(string message)
    {
        Debug.Log(message.ToUpper());
    }
}

DelegateExample 스크립트는 유니티의 MonoBehaviour를 상속받아 사용된다.
myDelegate는 DisplayMessage와 DisplayUpperCaseMessage 메서드를 등록하여, Start 메서드에서 호출 시 두 메서드가 순차적으로 실행된다.

Event가 뭐에요?

Event는 특정 사건이 발생할 때 실행할 메서드를 정의할 수 있게 해준다. Event는 주로 Observer 패턴을 구현할 때 사용된다. Event는 다음과 같은 특징을 가진다.

  1. Delegate를 기반: Event는 Delegate를 기반으로 하며, Delegate를 통해 이벤트 핸들러를 등록하고 이벤트가 발생하면 해당 핸들러가 호출된다.

  2. 접근 제어: Event는 기본적으로 외부에서 직접 호출할 수 없고, 이벤트를 발생시키는 메서드를 통해서만 호출 가능하다. 이는 이벤트 구독자들이 이벤트를 임의로 발생시키는 것을 방지한다.

  3. 구독 및 발행: 이벤트는 구독(Subscribe) 및 발행(Publish) 모델을 따른다. 이벤트를 구독한 메서드(핸들러)는 이벤트가 발생할 때 호출된다.

Event Code

using UnityEngine;

// Delegate 선언
public delegate void MyEventHandler(string message);

// Event를 포함하는 클래스 (Publisher 역할)
public class Publisher : MonoBehaviour
{
    // Event 선언
    public event MyEventHandler RaiseCustomEvent;

    void Update()
    {
        // 스페이스 키를 누르면 이벤트 발생
        if (Input.GetKeyDown(KeyCode.Space))
        {
            OnRaiseCustomEvent("Space key pressed!");
        }
    }

    protected virtual void OnRaiseCustomEvent(string message)
    {
        // 이벤트가 null이 아닌 경우 호출
        RaiseCustomEvent?.Invoke(message);
    }
}

// Event를 구독하는 클래스 (Subscriber 역할)
public class Subscriber : MonoBehaviour
{
    public Publisher publisher;

    void OnEnable()
    {
        // 이벤트 구독
        publisher.RaiseCustomEvent += HandleCustomEvent;
    }

    void OnDisable()
    {
        // 이벤트 구독 해제
        publisher.RaiseCustomEvent -= HandleCustomEvent;
    }

    void HandleCustomEvent(string message)
    {
        Debug.Log(message);
    }
}

Publisher 클래스는 이벤트를 발생시키는 역할을 하고, Subscriber 클래스는 이벤트를 구독하여 처리한다.
Publisher 클래스는 스페이스 키가 눌리면 RaiseCustomEvent 이벤트를 발생시키고, Subscriber 클래스는 이를 구독하여 HandleCustomEvent 메서드를 통해 메시지를 출력한다.

Delegate와 Event차이가 뭐에요?

1, 선언 방식

  • Delegate는 자체적으로 선언되고 인스턴스화된다.
  • Event는 Delegate를 기반으로 선언되며, 이벤트 구독자들을 관리한다.
  1. 접근 제어
  • Delegate는 public이기 때문에, 외부에서 직접 호출이 가능하다.
  • Event는 기본적으로 외부에서 직접 호출할 수 없고, 이벤트를 발생시키는 메서드를 통해서만 호출 가능하다.
  1. 용도
  • Delegate는 콜백 메서드를 정의할 때 주로 사용된다.
  • Event는 특정 사건 발생 시 알림을 받을 수 있는 구조를 만들 때 사용된다.
  1. 다중 메서드 참조
  • Delegate는 하나의 인스턴스에 여러 메서드를 등록할 수 있으며, 등록된 모든 메서드를 순차적으로 호출할 수 있다.
  • Event도 Delegate를 사용하여 여러 메서드를 등록할 수 있지만, 이벤트를 발생시키는 주체가 이벤트를 호출한다.

결론 - 느낀 점

전투기능 구현을 할때 쓰는 기능중하나인데 역시 이런 차이점을 가지고 있다는 것을 미리 알고 있으니 이해가 쉬웠다.

profile
게임을 좋아하는 사람 입니다!

0개의 댓글