C# Delegates and Events

델리게이트 소개 (Introduction to Delegates)

델리게이트(Delegate)는 메서드의 참조를 캡슐화하는 데이터 구조입니다. C#에서 델리게이트는 메서드를 변수처럼 다룰 수 있게 해줍니다. 델리게이트를 사용하면 메서드를 인자로 전달하거나 반환값으로 받을 수 있으며, 런타임에 메서드를 호출할 수 있습니다. 이는 메서드 호출을 동적으로 설정하거나 변경할 수 있는 유연한 방법을 제공합니다.

델리게이트의 기본 개념 (Basic Concepts of Delegates)

델리게이트는 특정 반환 타입과 매개변수를 가진 메서드를 참조할 수 있습니다. 델리게이트를 정의하고 인스턴스를 생성하여 메서드와 연결할 수 있습니다.

예제: 델리게이트 정의 (Defining a Delegate)

public delegate void Notify(string message);

이 예제는 Notify라는 이름의 델리게이트를 정의합니다. 이 델리게이트는 문자열 매개변수를 받고 반환 값이 없는 메서드를 참조할 수 있습니다.

예제: 델리게이트 사용 (Using a Delegate)

public class Program
{
    public static void Main(string[] args)
    {
        Notify notifyDelegate = DisplayMessage;
        notifyDelegate("Hello, Delegates!");
    }

    public static void DisplayMessage(string message)
    {
        Console.WriteLine(message);
    }
}

이 예제는 DisplayMessage 메서드를 Notify 델리게이트에 연결하고, 델리게이트를 호출하여 메서드를 실행합니다.

멀티캐스트 델리게이트 (Multicast Delegates)

멀티캐스트 델리게이트는 여러 메서드를 참조할 수 있는 델리게이트입니다. 델리게이트 체인을 구성하여, 델리게이트가 호출될 때 연결된 모든 메서드가 실행됩니다.

예제: 멀티캐스트 델리게이트 사용 (Using Multicast Delegates)

public class Program
{
    public static void Main(string[] args)
    {
        Notify notifyDelegate = DisplayMessage;
        notifyDelegate += LogMessage;

        notifyDelegate("Hello, Multicast Delegates!");
    }

    public static void DisplayMessage(string message)
    {
        Console.WriteLine($"Display: {message}");
    }

    public static void LogMessage(string message)
    {
        Console.WriteLine($"Log: {message}");
    }
}

이 예제에서 notifyDelegateDisplayMessageLogMessage 메서드를 참조하고, 델리게이트가 호출될 때 두 메서드 모두 실행됩니다.

이벤트 소개 (Introduction to Events)

이벤트(Event)는 델리게이트를 기반으로 하는 메커니즘으로, 객체가 발생시키는 특정 사건을 다른 객체가 구독하여 처리할 수 있도록 합니다. 이벤트는 델리게이트와 달리, 객체가 이벤트를 발생시키고, 다른 객체는 이를 구독하여 응답할 수 있습니다. 이벤트는 캡슐화 및 안정성의 원칙을 지키면서 델리게이트의 기능을 확장합니다.

이벤트의 기본 개념 (Basic Concepts of Events)

이벤트는 클래스 내부에서 정의되고, 외부에서 해당 이벤트를 구독하거나 처리할 수 있습니다. 이벤트를 정의하면, 해당 이벤트가 발생했을 때 실행될 메서드를 추가할 수 있습니다.

예제: 이벤트 정의 (Defining an Event)

public class Publisher
{
    public event Notify OnNotify;

    public void RaiseEvent(string message)
    {
        OnNotify?.Invoke(message);
    }
}

이 예제에서 Publisher 클래스는 OnNotify라는 이벤트를 정의하고 있습니다. RaiseEvent 메서드는 이벤트를 발생시킵니다.

예제: 이벤트 구독 (Subscribing to an Event)

public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        publisher.OnNotify += DisplayMessage;
    }

    private void DisplayMessage(string message)
    {
        Console.WriteLine($"Subscriber received: {message}");
    }
}

이 예제에서 Subscriber 클래스는 Publisher 클래스의 OnNotify 이벤트를 구독하고 있습니다. 이벤트가 발생하면 DisplayMessage 메서드가 호출됩니다.

예제: 이벤트 발생 및 처리 (Raising and Handling an Event)

public class Program
{
    public static void Main(string[] args)
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();
        subscriber.Subscribe(publisher);

        publisher.RaiseEvent("Hello, Events!");
    }
}

이 예제에서는 Publisher 클래스에서 이벤트를 발생시키고, Subscriber 클래스에서 이벤트를 구독하여 처리합니다.

이벤트와 델리게이트의 차이 (Differences between Events and Delegates)

  • 캡슐화: 이벤트는 클래스 내부에서 델리게이트의 직접적인 접근을 제한하여 외부에서 이벤트를 발생시킬 수 없습니다. 반면, 델리게이트는 직접적으로 메서드 참조를 변경할 수 있습니다.
  • 목적: 델리게이트는 메서드 호출을 캡슐화하는 데 사용되며, 이벤트는 객체 간의 통신을 위해 발생시키고 구독하는 방식으로 사용됩니다.

결론 (Conclusion)

델리게이트와 이벤트는 C#에서 중요한 역할을 하며, 특히 객체 간의 통신과 메서드 호출을 효율적으로 관리하는 데 유용합니다. 델리게이트는 메서드를 참조하고 호출할 수 있는 유연한 방법을 제공하며, 멀티캐스트 델리게이트를 사용하면 여러 메서드를 한 번에 호출할 수 있습니다. 이벤트는 델리게이트를 기반으로 하며, 객체 간의 통신을 관리하는 데 더 안전하고 캡슐화된 접근을 제공합니다. 이러한 기능을 활용하여 더 유연하고 유지보수하기 쉬운 애플리케이션을 개발할 수 있습니다.

Posted in C#

Leave a Reply

Your email address will not be published. Required fields are marked *