이벤트(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!