c#

C# 이벤트(Event) 완벽 가이드: delegate와 event 차이, 사용법

개발에대해 2025. 9. 10. 10:02
반응형
C# 이벤트(Event) 완벽 가이드: delegate와 event 차이, 사용법

C# 이벤트(Event) 완벽 가이드

C# 프로그래밍을 하다 보면 반드시 만나게 되는 개념 중 하나가 바로 이벤트(event)입니다. 버튼 클릭, 알람 울림, 데이터 변경과 같은 상황을 처리할 때 이벤트는 필수적으로 사용됩니다. 이번 글에서는 이벤트의 기본 개념부터 선언, 구독, 해제, 커스텀 이벤트 데이터 전달까지 예제 코드와 함께 상세히 설명하겠습니다.

1. 이벤트란 무엇인가?

이벤트는 쉽게 말해 "특정 상황이 발생했을 때 알림을 보내는 메커니즘"입니다. 예를 들어, 버튼을 클릭하면 Click 이벤트가 발생하고, 이 이벤트를 구독한 코드가 실행됩니다.

이벤트의 구조는 발생자(publisher)구독자(subscriber)로 이루어집니다. 발생자는 이벤트를 발생시키고, 구독자는 이벤트가 발생했을 때 실행할 동작을 등록합니다.

중요한 점은 이벤트가 델리게이트(delegate) 기반으로 동작한다는 것입니다. 델리게이트는 메서드를 참조하는 포인터이고, 이벤트는 이를 감싼 안전 장치 역할을 합니다. 즉, 이벤트는 델리게이트를 통해 메서드를 호출하지만 구독과 발생을 제어할 수 있는 추가적인 안전성을 제공합니다.

2. 이벤트 선언 방법


public class AlarmClock
{
    // 1) 이벤트 선언
    public event EventHandler AlarmRang; 
    // EventHandler는 기본 제공 델리게이트 (object sender, EventArgs e)

    public void Ring()
    {
        Console.WriteLine("알람이 울립니다!");

        // 2) 이벤트 발생
        AlarmRang?.Invoke(this, EventArgs.Empty);
        // ?.Invoke : 구독자가 있을 때만 실행
    }
}
    

위 코드에서 public event EventHandler AlarmRang;는 이벤트 선언 부분입니다. Ring() 메서드가 호출되면 AlarmRang 이벤트가 발생하고, 구독자가 있을 경우에만 안전하게 실행됩니다.

3. 이벤트 구독과 발생


class Program
{
    static void Main(string[] args)
    {
        var clock = new AlarmClock();

        // 1) 이벤트 구독 (+= 연산자 사용)
        clock.AlarmRang += Clock_AlarmRang;

        // 2) 알람 발생
        clock.Ring();
    }

    private static void Clock_AlarmRang(object sender, EventArgs e)
    {
        Console.WriteLine("구독자가 이벤트를 받음 → 알람 반응!");
    }
}
    

실행 결과는 다음과 같습니다:


알람이 울립니다!
구독자가 이벤트를 받음 → 알람 반응!
    

4. 이벤트 구독/해제

이벤트는 += 연산자로 구독하고, -= 연산자로 해제할 수 있습니다.


clock.AlarmRang += Clock_AlarmRang; // 구독
clock.AlarmRang -= Clock_AlarmRang; // 구독 해제
    

프로그램에서 불필요해진 이벤트는 반드시 해제하는 습관을 들이는 것이 좋습니다. 그렇지 않으면 메모리 누수(leak)가 발생할 수 있습니다.

5. 커스텀 이벤트 데이터 전달

기본 EventArgs 대신, 사용자 정의 클래스를 만들어 더 많은 정보를 전달할 수 있습니다.


public class AlarmEventArgs : EventArgs
{
    public DateTime AlarmTime { get; set; }
}

public class AlarmClock
{
    public event EventHandler<AlarmEventArgs> AlarmRang;

    public void Ring()
    {
        AlarmRang?.Invoke(this, new AlarmEventArgs { AlarmTime = DateTime.Now });
    }
}
    

사용 예시:


clock.AlarmRang += (s, e) =>
    Console.WriteLine($"알람 발생 시간: {e.AlarmTime}");
    

6. 핵심 요약

  • 이벤트는 델리게이트 기반으로 동작한다.
  • event 키워드로 선언하고, +=로 구독, -=로 해제한다.
  • ?.Invoke()를 사용해 안전하게 이벤트를 발생시킨다.
  • EventHandler 또는 EventHandler<T>를 자주 사용한다.

이벤트는 GUI 프로그래밍, 게임 개발, 데이터 처리 등 다양한 상황에서 활용됩니다. 델리게이트와 이벤트의 개념을 제대로 이해하면 확장성과 유지보수성이 높은 코드를 작성할 수 있습니다.

반응형