다음을 통해 공유


이벤트 및 대리자

이벤트는 동작의 발생을 알리기 위해 개체에서 보내는 메시지입니다. 이 동작은 마우스 클릭과 같은 사용자 상호 작용으로 일어나거나 다른 프로그램 논리에 의해 트리거될 수 있습니다. 이벤트를 발생시키는 개체를 이벤트 전송자라고 하며 이벤트를 캡처하고 이벤트에 응답하는 개체를 이벤트 수신자라고 합니다.

이벤트 통신에서, 이벤트 전송자 클래스는 해당 클래스에서 발생되는 이벤트를 어느 개체 또는 메서드에서 수신(처리)하는지 모릅니다. 이러한 이유로 소스와 수신기 사이에 매개자(포인터와 같은 메커니즘)가 필요합니다. .NET Framework에서는 함수 포인터의 기능을 제공하는 특수 형식(Delegate)을 정의합니다.

대리자는 메서드에 대한 참조를 가질 수 있는 클래스입니다. 하지만 다른 클래스와는 달리, 대리자 클래스에는 시그니처가 있어 시그니처와 일치하는 메서드에 대한 참조만을 유지합니다. 그렇기 때문에 대리자는 형식이 안전한 함수 포인터나 콜백과 같습니다. 대리자의 기능은 다양하지만, 여기에서는 대리자의 이벤트 처리 기능에 초점을 맞춰 설명합니다. 대리자 선언으로 대리자 클래스를 충분히 선언할 수 있습니다. 선언은 대리자의 시그니처를 제공하며, 공용 언어 런타임에서는 필요한 구현을 제공합니다. 다음 예제에서는 이벤트 대리자 선언을 보여 줍니다.

Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
public delegate void AlarmEventHandler(Object^ sender, AlarmEventArgs^ e);

이 구문은 메서드 선언과 유사하지만, 여기에서 delegate 키워드는 AlarmEventHandler가 대리자 형식이라는 것을 컴파일러에 알립니다. 규칙에 따라, .NET Framework의 모든 대리자는 두 개의 매개 변수(이벤트를 발생시킨 소스 및 이벤트 데이터)를 갖습니다.

AlarmEventHandler 대리자의 인스턴스는 다음 예제에 있는 WakeMeUp 클래스의 AlarmRang 메서드와 같이, 해당 시그니처와 일치하는 모든 메서드에 바인딩될 수 있습니다.

Public Class WakeMeUp
    ' AlarmRang has the same signature as AlarmEventHandler.
    Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
        '...
    End Sub
    '...
End Class
public class WakeMeUp
{
    // AlarmRang has the same signature as AlarmEventHandler.
    public void AlarmRang(object sender, AlarmEventArgs e)
    {
        //...
    }
    //...
}
public ref class WakeMeUp
{
public:
    // AlarmRang has the same signature as AlarmEventHandler.
    void AlarmRang(Object^ sender, AlarmEventArgs^ e)
    {
        //...
    }
    //...
};

사용자 지정 이벤트 대리자는 이벤트에서 이벤트 데이터를 생성할 때만 필요한데, 마우스 클릭과 같은 사용자 인터페이스를 포함하는 대부분의 이벤트에서는 이벤트 데이터를 생성하지 않습니다. 이 경우 사용자 지정 이벤트를 지정할 필요 없이 데이터가 없는 이벤트에 사용하도록 클래스 라이브러리에서 제공하는 System.EventHandler 이벤트 대리자를 사용하면 됩니다. 선언은 다음과 같습니다.

Delegate Sub EventHandler(sender As Object, e As EventArgs)
delegate void EventHandler(object sender, EventArgs e);
delegate void EventtHandler(Object^ sender, EventArgs^ e);

이벤트 대리자는 멀티캐스트로서, 하나 이상의 이벤트 처리 메서드에 대한 참조를 가질 수 있습니다. 자세한 내용은 Delegate를 참조하십시오. 대리자를 사용하면 유연하고 정밀하게 이벤트 처리를 제어할 수 있습니다. 대리자는 이벤트에 대해 등록된 이벤트 처리기 목록을 유지하여 이벤트를 발생시킨 클래스의 발송자 역할을 합니다.

대리자를 사용하여 구성요소 및 컨트롤에 이벤트 기능을 부여하는 방법에 대한 자세한 내용은 이벤트 발생시키기를 참조하십시오.

응용 프로그램에서 이벤트를 사용하는 방법에 대한 설명은 이벤트 사용을 참조하십시오.

참고 항목

작업

방법: 이벤트 발생 및 사용

방법: 이벤트에 이벤트 처리기 메서드 연결

개념

이벤트 사용

이벤트 발생시키기

기타 리소스

이벤트 처리 및 발생