프로그래밍/C#

C#에서 델리게이트와 이벤트의 이해와 활용

shimdh 2025. 8. 31. 09:38
728x90

C# 프로그래밍에서 델리게이트와 이벤트는 메서드 참조와 알림을 유연하게 처리할 수 있는 강력한 기능입니다. 이러한 개념을 이해하는 것은 사용자 행동이나 기타 트리거에 반응하는 이벤트 기반 애플리케이션을 개발하는 데 매우 중요합니다.

델리게이트란 무엇인가?

정의

델리게이트는 특정 매개변수 목록과 반환 형식을 가진 메서드에 대한 참조를 나타내는 형식입니다. 이는 함수 포인터와 유사하지만 타입 안전성을 제공합니다.

목적

  • 메서드 호출을 캡슐화하여 메서드를 매개변수로 전달하거나 변수에 저장하거나 다른 메서드에서 반환할 수 있게 합니다.

문법

public delegate void MyDelegate(string message);
728x90

예시

델리게이트를 정의하고 사용하는 방법은 다음과 같습니다:

// 델리게이트 정의
public delegate void Notify(string message);

// 델리게이트를 사용하는 클래스
public class ProcessBusinessLogic
{
    public Notify OnProcessCompleted;

    public void StartProcess()
    {
        // 프로세스 작업을 시뮬레이션...
        Console.WriteLine("Process Started!");

        // 완료 시 이벤트 호출
        OnProcessCompleted?.Invoke("Process Completed Successfully");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ProcessBusinessLogic businessLogic = new ProcessBusinessLogic();

        // 람다 표현식을 사용하여 이벤트 구독
        businessLogic.OnProcessCompleted += (msg) => Console.WriteLine(msg);

        businessLogic.StartProcess();
    }
}

이 예시에서 Notify는 문자열 인수를 받는 델리게이트로 정의됩니다. StartProcess 메서드는 일부 처리 로직을 시뮬레이션하고 완료되면 구독된 핸들러를 호출합니다.

이벤트란 무엇인가?

정의

이벤트는 알림을 처리하기 위해 특별히 설계된 멀티캐스트 델리게이트의 일종입니다. 이는 구독자(이벤트 리스너)가 특정 동작에 관심을 등록할 수 있게 하면서도 구성 요소 간의 결합을 느슨하게 유지합니다.

목적

  • 이벤트는 델리게이트 위에 추상화 계층을 제공하여 구독 관리를 쉽게 하면서 캡슐화 원칙을 강화합니다. 이를 통해 구독자는 이벤트를 직접 호출할 수 없으며, 구독하거나 구독 해지할 수만 있습니다.

문법

public class PublisherClass
{
    public event EventHandler<MyEventArgs> MyEvent;
}

예시

이벤트를 구현하는 방법은 다음과 같습니다:

// 추가 데이터가 필요한 경우를 위한 사용자 정의 EventArgs 클래스
public class MyEventArgs : EventArgs 
{
    public string Message { get; set; }
}

// 이벤트를 발생시키는 클래스
public class Publisher 
{
    // EventHandler<T>를 사용하여 이벤트 선언
    public event EventHandler<MyEventArgs> Notify;

    protected virtual void OnNotify(MyEventArgs e)
    {
        Notify?.Invoke(this, e); // 안전하게 이벤트 발생.
    }

    public void DoSomething()
    {
        Console.WriteLine("Doing something...");
        OnNotify(new MyEventArgs() { Message = "Operation completed!" });
    }
}

class Subscriber 
{
    private readonly Publisher _publisher;

    public Subscriber(Publisher publisher)
    {
        _publisher = publisher;
        _publisher.Notify += HandleNotification; // 알림 이벤트 구독.
    }

    private void HandleNotification(object sender, MyEventArgs e)
    {
        Console.WriteLine(e.Message);
    }
}

class Program 
{
   static void Main(string[] args) 
   {
       Publisher pub = new Publisher();
       Subscriber sub = new Subscriber(pub);

       pub.DoSomething(); // 구독자의 핸들러를 통해 알림 트리거.
   }
}

이 예시에서:

  1. Notify라는 이벤트가 사용자 정의 MyEventArgs를 사용하여 정의됩니다.
  2. Publisher는 작업이 완료될 때마다 OnNotify를 호출하여 이 알림을 발생시킵니다.
  3. Subscriber는 인스턴스화 시 자신의 핸들러(HandleNotification)를 퍼블리셔의 알림 메커니즘에 연결하여 이 알림을 구독합니다.

요약

델리게이트는 메서드 참조로서 콜백이나 코드베이스 전반에 걸쳐 동작을 전달하는 등의 유연한 프로그래밍 패턴을 가능하게 합니다. 이벤트는 델리게이트 위에 구조화된 통신을 제공하여 클래스 간의 상호작용을 관리하는 데 이상적입니다. 특히 GUI 프로그래밍과 같이 애플리케이션의 다양한 부분이 상태 변화에 대한 업데이트를 필요로 할 때 유용합니다. 이 두 가지 개념을 이해하면 C#에서 반응형 애플리케이션을 만드는 능력이 크게 향상될 것입니다.

728x90