프로그래밍 세계에서 이벤트(Event)는 매우 중요한 역할을 합니다. 특히 C#에서는 이벤트를 사용하여 다양한 동작을 쉽게 연결하고 처리할 수 있습니다. 이번 글에서는 C#에서 이벤트 시스템을 어떻게 구축할 수 있는지, 그리고 실전에서 어떻게 활용할 수 있는지에 대해 알아보겠습니다.

이벤트 시스템 시작하기

이벤트는 기본적으로 특정 액션이 발생했을 때 이를 다루기 위한 메커니즘입니다. C#에서는 이벤트를 선언하고, 발생시키고, 구독하고, 처리하는 방법을 제공합니다. 이러한 구조는 관찰자 패턴(Observer Pattern)과 유사합니다.

기본적으로 이벤트를 선언하려면 EventHandler 또는 EventHandler<T>를 사용할 수 있습니다. 간단한 예제를 통해 시작해보죠.

using System;

public class NewsPublisher
{
    // 이벤트 선언
    public event EventHandler<string> NewsPublished;

    public void PublishNews(string news)
    {
        Console.WriteLine("Publishing news...");
        OnNewsPublished(news);
    }

    // 이벤트 발생
    protected virtual void OnNewsPublished(string news)
    {
        NewsPublished?.Invoke(this, news);
    }
}

위 예제에서는 NewsPublisher 클래스가 있으며, NewsPublished라는 이벤트를 선언하고 있습니다. PublishNews 메서드는 뉴스를 발행할 때마다 이벤트를 발생시킵니다.

이벤트 구독과 처리

이벤트를 구독하고 처리하는 것은 매우 간단합니다. 이제 NewsPublisher의 이벤트를 구독하는 클래스를 만들어 봅시다.

public class NewsSubscriber
{
    private readonly string _subscriberName;
    
    public NewsSubscriber(string name)
    {
        _subscriberName = name;
    }

    public void Subscribe(NewsPublisher publisher)
    {
        publisher.NewsPublished += OnNewsReceived;
    }

    // 이벤트 처리 메서드
    private void OnNewsReceived(object sender, string news)
    {
        Console.WriteLine($"{_subscriberName} received news: {news}");
    }
}

NewsSubscriber 클래스는 NewsPublisher의 이벤트를 구독하여 발생한 뉴스를 처리합니다. 이로써 이벤트 시스템이 완성되었습니다.

유용한 팁

  1. 이벤트 해제: 구독한 이벤트는 반드시 해제해야 메모리 누수를 방지할 수 있습니다. +=로 구독한 이벤트는 -=로 해제할 수 있습니다.

  2. 자주 사용하는 델리게이트: ActionFunc 델리게이트는 이벤트 핸들러를 정의할 때 유용합니다. 이들을 활용하면 코드를 더 간결하게 유지할 수 있습니다.

  3. 비동기 이벤트: asyncawait를 사용하여 비동기 방식으로 이벤트를 처리할 수 있습니다. 이는 긴 작업을 수행하는 이벤트 핸들러에서 유용합니다.

결론

C#에서 이벤트 시스템을 구축하는 것은 비교적 직관적이지만, 강력한 기능을 제공합니다. 위에서 소개한 간단한 예제와 팁을 활용하면 보다 효율적인 이벤트 기반 프로그램을 구축할 수 있을 것입니다. 이벤트를 잘 활용하여 코드의 재사용성을 높이고, 더욱 반응성 있는 애플리케이션을 만들어 보세요!