C#에서 이벤트(Event)는 대리자(Delegate)가 가진 문제점을 해결하기 위해 도입된 기능입니다. 대리자는 외부에서 쉽게 재정의(override)할 수 있어 코드에 오류가 발생할 위험이 있습니다. 이러한 문제를 방지하기 위해 C#은 이벤트를 사용하며, 이벤트는 대리자를 감싸는 래퍼(wrapper) 역할을 수행합니다.
C#에서의 이벤트(Event)
이벤트를 사용하려면 먼저 대리자를 정의해야 합니다. 이벤트는 일종의 대리자 타입이며, 대표적인 예로 키보드의 키가 눌렸을 때 발생하는 상황을 들 수 있습니다.
public delegate void Demo(string val); public event Demo TestEvent;
이벤트에 대리자 연결하기
정의된 이벤트에는 다음과 같이 대리자 인스턴스를 등록할 수 있습니다. += 연산자를 사용하여 메서드를 이벤트에 구독(subscribe)하는 방식입니다.
this.TestEvent += new Demo(DemoData);
C#에서의 대리자(Delegate)
대리자는 메서드에 대한 참조(reference)를 저장하는 참조 형식 변수입니다. 대리자가 가리키는 참조는 런타임 시점에 변경할 수 있다는 점이 특징입니다.
public delegate void Demo(string val);
이벤트와 대리자의 핵심 차이
정리하면, 대리자는 메서드를 참조할 수 있는 유연한 타입이지만 외부에서 자유롭게 호출하거나 재정의될 수 있습니다. 반면 이벤트는 대리자를 캡슐화하여 클래스 외부에서 직접 호출하거나 할당(=)하는 것을 막고, 오직 +=와 -= 연산으로 구독과 구독 해제만 허용합니다. 이 덕분에 이벤트는 더 안전하고 견고한 이벤트 기반 프로그래밍 모델을 제공합니다.