델리게이트 소개 (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}"); } }
이 예제에서 notifyDelegate
는 DisplayMessage
와 LogMessage
메서드를 참조하고, 델리게이트가 호출될 때 두 메서드 모두 실행됩니다.
이벤트 소개 (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#에서 중요한 역할을 하며, 특히 객체 간의 통신과 메서드 호출을 효율적으로 관리하는 데 유용합니다. 델리게이트는 메서드를 참조하고 호출할 수 있는 유연한 방법을 제공하며, 멀티캐스트 델리게이트를 사용하면 여러 메서드를 한 번에 호출할 수 있습니다. 이벤트는 델리게이트를 기반으로 하며, 객체 간의 통신을 관리하는 데 더 안전하고 캡슐화된 접근을 제공합니다. 이러한 기능을 활용하여 더 유연하고 유지보수하기 쉬운 애플리케이션을 개발할 수 있습니다.