이벤트 사용

응용 프로그램에서 이벤트를 사용하려면 이벤트에 대한 응답으로 프로그램 논리를 수행하는 이벤트 처리기(이벤트 처리 메서드)가 필요하며, 이 이벤트 처리기를 이벤트 소스에 등록해야 합니다. 이것을 이벤트 연결이라고 합니다. Windows Forms 및 Web Forms의 비주얼 디자이너에서는 이벤트 연결의 세부 사항을 단순화하거나 숨기는 RAD(Rapid Application Development) 도구를 제공합니다.

이 항목에서는 일반적인 이벤트 처리 패턴을 설명합니다. .NET Framework에서의 이벤트 모델의 개요는이벤트 및 대리자를 참조하십시오. Windows Forms의 이벤트 모델에 대한 자세한 내용은 방법: Windows Forms 응용 프로그램에서 이벤트 사용을 참조하고, Web Forms의 이벤트 모델에 대한 자세한 내용은 방법: Web Forms 응용 프로그램에서 이벤트 사용을 참조하십시오.

이벤트 패턴

RAD 도구에 따라 제공하는 지원 수준이 다르므로 이벤트 연결의 세부 사항은 Windows Forms와 Web Forms에서 서로 다릅니다. 그러나 두 시나리오 모두 다음과 같은 특징이 있는 이벤트 패턴을 따릅니다.

  • EventName이라는 이벤트를 발생시키는 클래스는 다음과 같은 멤버를 갖습니다.
Public Event EventName As EventNameEventHandler
public event EventNameEventHandler EventName;
public:
    event EventNameEventHandler^ EventName;
  • EventName 이벤트의 이벤트 대리자는 다음 시그니처를 갖는 EventNameEventHandler입니다.
Public Delegate Sub EventNameEventHandler(sender As Object, e As EventNameEventArgs)
public delegate void EventNameEventHandler(object sender, EventNameEventArgs e);
delegate void EventNameEventHandler(Object^ sender, EventNameEventArgs^ e);

EventName 이벤트를 사용하려면 이벤트 처리기가 이벤트 대리자와 같은 시그니처를 가져야 합니다.

Sub EventHandler(sender As Object, e As EventNameEventArgs)
End Sub
void EventHandler(object sender, EventNameEventArgs e) {}
void EventHandler(Object^ sender, EventNameEventArgs^ e) {}
참고참고

.NET Framework에서 이벤트 대리자의 이름은 EventNameEventHandler이지만, 설명서에서 이벤트 처리기는 이벤트 처리 메서드를 가리킵니다.EventNameEventHandler 대리자는 이벤트를 실제로 처리하는 이벤트 처리기(메서드)를 가리키기 때문에 이벤트 처리기가 이름에 사용되는 것입니다.

이벤트에 연결된 데이터가 없는 경우 이벤트를 발생시키는 클래스는 System.EventHandler를 대리자로 사용하고 System.EventArgs를 이벤트 데이터로 사용합니다. 연결된 데이터가 있는 이벤트는 이벤트 데이터 형식 및 해당 이벤트 대리자 형식의 EventArgs에서 파생된 클래스를 사용합니다. 예를 들어, MouseUp 이벤트를 Windows Forms 응용 프로그램에서 처리하는 경우, 이벤트 데이터 클래스는 MouseEventArgs이고 이벤트 대리자는 MouseEventHandler가 됩니다. 일부 마우스 이벤트에서는 이벤트 데이터에 대해 공용 클래스 및 공용 이벤트 대리자를 사용하기 때문에 명명 스키마는 위에 설명된 규칙과 정확하게 일치하지 않을 수도 있습니다. 마우스 이벤트의 경우, 이벤트 처리기는 다음 시그니처를 가져야 합니다.

Sub Mouse_Moved(sender As Object, e As MouseEventArgs)
End Sub
void Mouse_Moved(object sender, MouseEventArgs e){}
void Mouse_Moved(Object^ sender, MouseEventArgs^ e){}

sender 및 event 인수 매개 변수는 마우스 이벤트에 대한 자세한 정보를 이벤트 처리기에 제공합니다. sender 개체는 이벤트를 발생시킨 항목을 나타냅니다. MouseEventArgs 매개 변수는 이벤트를 발생시킨 마우스 동작에 대한 자세한 정보를 제공합니다. 많은 이벤트 소스에서 이벤트에 대한 추가 데이터를 제공하며, 많은 이벤트 처리기에서 이벤트 관련 데이터를 사용하여 이벤트를 처리합니다. 이벤트를 발생시키고 이벤트 관련 데이터를 사용하여 이벤트를 처리하는 방법을 보여 주는 예제를 보려면 방법: 이벤트 발생 및 사용을 참조하십시오.

참고참고

이벤트는 UI(사용자 인터페이스)의 컨텍스트 밖에서도 발생하며, 실제로 .NET Framework에는 이벤트를 발생시키는 비UI 클래스도 많습니다.그러나 모든 이벤트는 여기서 설명한 패턴을 따릅니다.

클래스에서 이벤트를 발생시키는 방법에 대한 자세한 내용은 이벤트 발생시키기를 참조하십시오.

정적 및 동적 이벤트

.NET Framework에서는 구독자가 정적이나 동적으로 이벤트 알림을 등록할 수 있습니다. 정적 이벤트 처리기는 해당 이벤트가 처리되는 클래스의 전체 수명 동안 적용됩니다. 이는 가장 일반적인 이벤트 처리 방법입니다. 동적 이벤트 처리기는 프로그램 실행 도중 일반적으로 특정 조건부 프로그램 논리에 따라 명시적으로 활성화 및 비활성화됩니다. 예를 들어 특정 조건에서만 이벤트 알림이 필요하거나 응용 프로그램에서 여러 이벤트 처리기를 제공하고 런타임 조건에 따라 사용할 이벤트 처리기를 정의하는 경우 동적 이벤트 처리기를 사용할 수 있습니다.

EventInfo.AddEventHandler 메서드는 동적 이벤트 처리기를 추가하고 EventInfo.RemoveEventHandler 메서드는 동적 이벤트 처리기를 비활성화합니다. 개별 언어에서 이벤트를 동적으로 처리하는 자체 기능을 제공할 수도 있습니다. 다음 예제에서는 온도가 미리 정의된 임계값에 도달할 때마다 TemperatureTheshold 이벤트를 발생시키는 TemperatureMonitor 클래스를 정의합니다. 이 이벤트를 구독하는 이벤트 처리기는 프로그램 실행 도중 활성화 및 비활성화됩니다.

public class TemperatureEventArgs : Inherits EventArgs
   Private oldTemp As Decimal
   Private newTemp As Decimal

   Public ReadOnly Property OldTemperature As Decimal
      Get
         Return Me.oldTemp
      End Get   
   End Property

   Public ReadOnly Property NewTemperature As Decimal
      Get
         Return Me.newTemp
      End Get
   End Property

   Public Sub New(oldTemp As Decimal, newTemp As Decimal)
      Me.oldTemp = oldTemp
      Me.newTemp = newTemp   
   End Sub
End Class

Public Delegate Sub TemperatureEventHandler(sender As Object, _
                                            ev As TemperatureEventArgs)

Public Class TemperatureMonitor
   Private currentTemperature As Decimal
   Private threshholdTemperature As Decimal

   Public Event TemperatureThreshold As TemperatureEventHandler 

   Public Sub New(threshHold As Decimal)
      Me.threshholdTemperature = threshHold
   End Sub

   Public Sub SetTemperature(newTemperature As Decimal)
      If (Me.currentTemperature > threshholdTemperature And _
         newTemperature <= Me.threshholdTemperature) Or _
         (Me.CurrentTemperature < Me.threshholdTemperature And _
             newTemperature >= Me.threshholdTemperature) Then
         OnRaiseTemperatureEvent(newTemperature)
      End If
      Me.currentTemperature = newTemperature
   End Sub

   Public Function GetTemperature() As Decimal
      Return Me.currentTemperature
   End Function

   Protected Overridable Sub OnRaiseTemperatureEvent(newTemperature As Decimal)
      RaiseEvent TemperatureThreshold(Me, New TemperatureEventArgs(Me.currentTemperature, _ 
                                       newTemperature))
   End Sub                                       
End Class

Public Module Example
   Public Sub Main()
      Dim tempMon As New TemperatureMonitor(32d)
      tempMon.SetTemperature(33)
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
                        tempMon.GetTemperature())
      tempMon.SetTemperature(32)
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
                        tempMon.GetTemperature())

      ' Add event handler dynamically using Visual Basic syntax.
      AddHandler tempMon.TemperatureThreshold, AddressOf TempMonitor

      tempMon.SetTemperature(33)
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
                        tempMon.GetTemperature())
      tempMon.SetTemperature(34)
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
                        tempMon.GetTemperature())
      tempMon.SetTemperature(32)
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
                        tempMon.GetTemperature())

      ' Remove event handler dynamically using Visual Basic syntax.
      RemoveHandler tempMon.TemperatureThreshold, AddressOf TempMonitor

      tempMon.SetTemperature(31)
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _ 
                        tempMon.GetTemperature())
      tempMon.SetTemperature(35)
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _ 
                        tempMon.GetTemperature())
   End Sub

   Private Sub TempMonitor(sender As Object, e As TemperatureEventArgs)
      Console.WriteLine("   ***Warning: Temperature is changing from {0} to {1}.", _ 
                        e.OldTemperature, e.NewTemperature)
   End Sub 
End Module
' The example displays the following output:
'       Current temperature is 33 degrees Fahrenheit.
'       Current temperature is 32 degrees Fahrenheit.
'       Current temperature is 33 degrees Fahrenheit.
'       Current temperature is 34 degrees Fahrenheit.
'          ***Warning: Temperature is changing from 34 to 32.
'       Current temperature is 32 degrees Fahrenheit.
'       Current temperature is 31 degrees Fahrenheit.
'       Current temperature is 35 degrees Fahrenheit.
using System;

public class TemperatureEventArgs : EventArgs
{
   private decimal oldTemp;
   private decimal newTemp;

   public decimal OldTemperature
   {
      get { return this.oldTemp; }
   }

   public decimal NewTemperature
   {
      get { return this.newTemp; }
   }

   public TemperatureEventArgs(decimal oldTemp, decimal newTemp)
   {
      this.oldTemp = oldTemp;
      this.newTemp = newTemp;   
   }
}

public delegate void TemperatureEventHandler(object sender, TemperatureEventArgs ev);

public class TemperatureMonitor
{
   private decimal currentTemperature;
   private decimal threshholdTemperature;

   public event TemperatureEventHandler TemperatureThreshold; 

   public TemperatureMonitor(decimal threshhold)
   {
      this.threshholdTemperature = threshhold;
   }

   public void SetTemperature(decimal newTemperature)
   {
      if ( (this.currentTemperature > this.threshholdTemperature && 
           newTemperature <= this.threshholdTemperature) ||
           (this.currentTemperature < this.threshholdTemperature &&
           newTemperature >= this.threshholdTemperature) )
         OnRaiseTemperatureEvent(newTemperature);
      this.currentTemperature = newTemperature;
   }

   public decimal GetTemperature()
   {
      return this.currentTemperature;
   }

   protected virtual void OnRaiseTemperatureEvent(decimal newTemperature)
   {
      // Raise the event if it has subscribers.
      if (TemperatureThreshold != null)
         TemperatureThreshold(this, new TemperatureEventArgs(this.currentTemperature, 
                               newTemperature));
   }
}

public class Example
{
   public static void Main()
   {
      Example ex = new Example();
      ex.MonitorTemperatures();
   }

   public void MonitorTemperatures()
   {
      TemperatureMonitor tempMon = new TemperatureMonitor(32);
      tempMon.SetTemperature(33);
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", 
                        tempMon.GetTemperature());
      tempMon.SetTemperature(32);
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.",
                        tempMon.GetTemperature());

      // Add event handler dynamically using C# syntax.
      tempMon.TemperatureThreshold += this.TempMonitor;

      tempMon.SetTemperature(33);
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", 
                        tempMon.GetTemperature());
      tempMon.SetTemperature(34);
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", 
                        tempMon.GetTemperature());
      tempMon.SetTemperature(32);
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.",
                        tempMon.GetTemperature());

      // Remove event handler dynamically using C# syntax.
      tempMon.TemperatureThreshold -= this.TempMonitor;

      tempMon.SetTemperature(31);
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", 
                        tempMon.GetTemperature());
      tempMon.SetTemperature(35);
      Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", 
                        tempMon.GetTemperature());
   }

   private void TempMonitor(object sender, TemperatureEventArgs e)
   {
      Console.WriteLine("   ***Warning: Temperature is changing from {0} to {1}.", 
                        e.OldTemperature, e.NewTemperature);
   } 
}
// The example displays the following output:
//       Current temperature is 33 degrees Fahrenheit.
//       Current temperature is 32 degrees Fahrenheit.
//       Current temperature is 33 degrees Fahrenheit.
//       Current temperature is 34 degrees Fahrenheit.
//          ***Warning: Temperature is changing from 34 to 32.
//       Current temperature is 32 degrees Fahrenheit.
//       Current temperature is 31 degrees Fahrenheit.
//       Current temperature is 35 degrees Fahrenheit.

참고 항목

작업

방법: Web Forms 응용 프로그램에서 이벤트 사용

방법: Windows Forms 응용 프로그램에서 이벤트 사용

개념

이벤트 및 대리자

이벤트 발생시키기

기타 리소스

이벤트 처리 및 발생