이벤트(C# 및 Java)

업데이트: 2007년 11월

클래스에서는 이벤트를 통해 개체에 특정 상황(그래픽 유저 인터페이스의 컨트롤 클릭 등)이 발생할 때 사용자에게 개체를 알릴 수 있습니다. 이러한 알림을 이벤트 발생이라고 합니다. 이벤트를 발생시키는 개체를 이벤트의 소스 또는 송신자라고 합니다.

사용자 지정 수신기 클래스를 구현하여 수행하는 Java의 이벤트 처리와는 달리, C# 개발자는 대리자를 사용하여 이벤트를 처리할 수 있습니다. 대리자는 메서드를 캡슐화하는 형식입니다. 메서드로 대리자가 초기화되면 대리자는 해당 메서드와 똑같은 방식으로 동작하며 () 연산자로 호출할 수 있습니다. 이는 C++ 함수 포인터와 비슷하지만 형식이 안전합니다.

대리자는 다음 예제와 같이 보통 메서드처럼 매개 변수 및 반환 값과 함께 사용할 수 있습니다.

public delegate int ReturnResult(int x, int y);

대리자에 대한 자세한 내용은 대리자(C# 프로그래밍 가이드)를 참조하십시오.

메서드와 마찬가지로 이벤트에는 이름과 매개 변수 목록이 포함된 시그니처가 있습니다. 이 시그니처는 대리자 형식으로 정의됩니다. 예를 들면 다음과 같습니다.

public delegate void MyEventHandler(object sender, System.EventArgs e);

Windows 사용자 인터페이스 프로그래밍에서 첫 번째 매개 변수는 이벤트의 소스를 가리키는 개체로 사용되고 두 번째 매개 변수는 이벤트와 관련된 데이터를 전달하는 개체로 사용되는 경우가 많습니다. 그러나 이러한 디자인은 필수 사항이거나 C# 언어에서 반드시 따라야 할 규칙이 아닙니다. 이벤트 시그니처는 void를 반환하는 한 임의의 유효한 대리자 시그니처와 동일한 형식일 수 있습니다.

이벤트는 다음 예제와 같이 event 키워드를 사용하여 선언할 수 있습니다.

public event MyEventHandler TriggerIt;

이벤트를 트리거하려면 다음 예제와 같이 이벤트가 발생할 때 호출할 메서드를 정의합니다.

public void Trigger()
{
    TriggerIt();
}

대리자를 호출하고 이벤트와 관련된 매개 변수를 전달하면 이벤트를 발생시킬 수 있습니다. 대리자는 이벤트에 추가된 모든 처리기를 호출합니다. 각 이벤트에는 이벤트를 전달받기 위한 처리기가 여러 개 할당될 수 있습니다. 이 경우 이벤트는 각 수신자를 자동으로 호출합니다. 이벤트를 발생시키려면 수신자의 수와 상관없이 이벤트를 한 번만 호출하면 됩니다.

클래스에서 이벤트를 수신하도록 하려면 += 연산자로 이벤트에 대리자를 추가하여 해당 이벤트에 등록해야 합니다. 예를 들면 다음과 같습니다.

myEvent.TriggerIt += myEvent.MyMethod;

이벤트에 대한 등록을 취소하려면 다음 예제와 같이 -= 연산자를 사용하여 이벤트에서 대리자를 제거합니다.

myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod);

자세한 내용은 이벤트(C# 프로그래밍 가이드)를 참조하십시오.

참고:

C# 2.0의 경우 명명된 메서드와 무명 메서드를 모두 대리자로 캡슐화할 수 있습니다. 무명 메서드에 대한 자세한 내용은 무명 메서드(C# 프로그래밍 가이드)를 참조하십시오.

예제

설명

다음 예제에서는 세 개의 메서드가 연결된 이벤트를 정의합니다. 이벤트가 발생하면 메서드가 실행됩니다. 그런 다음 이벤트에서 메서드 하나를 제거하고 이벤트를 다시 발생시킵니다.

코드

// Declare the delegate handler for the event:
public delegate void MyEventHandler();

class TestEvent
{
    // Declare the event implemented by MyEventHandler.
    public event MyEventHandler TriggerIt;

    // Declare a method that triggers the event:
    public void Trigger()
    {
        TriggerIt();
    }
    // Declare the methods that will be associated with the TriggerIt event.
    public void MyMethod1()
    {
        System.Console.WriteLine("Hello!");
    }
    public void MyMethod2()
    {
        System.Console.WriteLine("Hello again!");
    }
    public void MyMethod3()
    {
        System.Console.WriteLine("Good-bye!");
    }

    static void Main()
    {
        // Create an instance of the TestEvent class.
        TestEvent myEvent = new TestEvent();

        // Subscribe to the event by associating the handlers with the events:
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod1);
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod2);
        myEvent.TriggerIt += new MyEventHandler(myEvent.MyMethod3);
        // Trigger the event:
        myEvent.Trigger();

        // Unsuscribe from the the event by removing the handler from the event:
        myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod2);
        System.Console.WriteLine("\"Hello again!\" unsubscribed from the event."); 

        // Trigger the new event:
        myEvent.Trigger();
    }
}

출력

Hello!
Hello again!
Good-bye!
"Hello again!" unsubscribed from the event.
Hello!
Good-bye!

참고 항목

개념

C# 프로그래밍 가이드

참조

event(C# 참조)

delegate(C# 참조)

기타 리소스

Java 개발자를 위한 C#