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