Visual Studio 프로젝트를 시퀀스로 실행되는 일련의 프로시저로 시각화할 수 있지만 실제로 대부분의 프로그램은 이벤트 기반입니다. 즉, 실행 흐름은 이벤트라는 외부 항목에 의해 결정됩니다.
이벤트는 중요한 일이 발생했음을 애플리케이션에 알리는 신호입니다. 예를 들어 사용자가 폼에서 컨트롤을 클릭하면 폼에서 이벤트를 발생 Click
시키고 이벤트를 처리하는 프로시저를 호출할 수 있습니다. 또한 이벤트를 통해 개별 작업들이 상호 소통할 수 있습니다. 예를 들어 애플리케이션이 주 애플리케이션과 별도로 정렬 작업을 수행한다고 가정해 보겠습니다. 사용자가 정렬을 취소하면 애플리케이션이 정렬 프로세스를 중지하도록 지시하는 취소 이벤트를 보낼 수 있습니다.
이벤트 용어 및 개념
이 섹션에서는 Visual Basic의 이벤트와 함께 사용되는 용어 및 개념에 대해 설명합니다.
이벤트 선언
다음 예제와 같이 키워드를 사용하여 Event
클래스, 구조체, 모듈 및 인터페이스 내에서 이벤트를 선언합니다.
Event AnEvent(ByVal EventNumber As Integer)
이벤트 발생
이벤트는 중요한 일이 발생했음을 알리는 메시지와 같습니다. 메시지를 브로드캐스트하는 동작을 이벤트를 발생 시키는 행위라고합니다. Visual Basic에서는 RaiseEvent
명령문을 사용하여 다음 예제와 같이 이벤트를 발생시킵니다.
RaiseEvent AnEvent(EventNumber)
이벤트는 선언된 클래스, 모듈 또는 구조체의 범위 내에서 발생해야 합니다. 예를 들어 파생 클래스는 기본 클래스에서 상속된 이벤트를 발생할 수 없습니다.
이벤트 보낸 사람
이벤트를 발생시킬 수 있는 모든 개체는 이벤트 원본이라고도 하는 이벤트 발신자입니다. 폼, 컨트롤 및 사용자 정의 개체는 이벤트 보낸 사람의 예입니다.
이벤트 처리기
이벤트 처리기는 해당 이벤트가 발생할 때 호출되는 프로시저입니다. 일치하는 서명과 함께 유효한 서브루틴을 이벤트 처리기로 사용할 수 있습니다. 그러나 함수는 이벤트 원본에 값을 반환할 수 없으므로 이벤트 처리기로 사용할 수 없습니다.
Visual Basic은 이벤트 보낸 사람의 이름, 밑줄 및 이벤트 이름을 결합하는 이벤트 처리기에 표준 명명 규칙을 사용합니다. 예를 들어 Click
이라는 이름이 주어진 단추의 이벤트는 button1
이라고 이름 붙일 수 있습니다 Sub button1_Click
.
비고
고유한 이벤트에 대한 이벤트 처리기를 정의할 때는 이 명명 규칙을 사용하는 것이 좋지만 필수는 아닙니다. 유효한 서브루틴 이름을 사용할 수 있습니다.
이벤트를 처리기와 연결하기
이벤트 처리기를 사용하기 전에 Handles
문 또는 AddHandler
문을 사용하여 이벤트와 연결해야 합니다.
WithEvents와 Handles 절
WithEvents
문과 Handles
절은 이벤트 처리기를 지정하는 선언적 방법을 제공합니다.
WithEvents
키워드로 선언된 개체가 발생시킨 이벤트는 다음 예제에서 나타낸 것과 같이, 해당 이벤트에 대한 Handles
문이 있는 프로시저에서 처리할 수 있습니다.
' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass
' Call the method that raises the object's events.
Sub TestEvents()
EClass.RaiseEvents()
End Sub
' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub
Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
WithEvents
문과 Handles
절은 이벤트 처리기에 자주 가장 좋은 선택으로, 이들이 사용하는 선언적 구문이 이벤트 처리를 쉽게 코딩, 읽기 및 디버그할 수 있게 해줍니다. 그러나 WithEvents
변수 사용에 대한 다음 제한 사항에 유의하세요.
변수를
WithEvents
개체 변수로 사용할 수 없습니다. 즉, 변수를 선언할 때 클래스 이름을 지정해야 하므로Object
선언할 수 없습니다.공유 이벤트는 클래스 인스턴스에 연결되지 않으므로 공유 이벤트를 선언적으로 처리하는 데 사용할
WithEvents
수 없습니다. 마찬가지로,WithEvents
이나Handles
을 사용하여Structure
의 이벤트를 처리할 수 없습니다. 두 경우 모두AddHandler
문을 사용하여 이벤트를 처리할 수 있습니다.변수 배열을
WithEvents
만들 수 없습니다.
WithEvents
변수를 사용하면 단일 이벤트 처리기가 하나 이상의 이벤트 종류를 처리하거나 하나 이상의 이벤트 처리기가 동일한 종류의 이벤트를 처리할 수 있습니다.
Handles
절은 이벤트를 이벤트 처리기와 연결하기 위한 표준 방법이지만 컴파일 시간에 이벤트 처리기와 이벤트를 연결하도록 제한됩니다.
폼 또는 컨트롤과 연결된 이벤트와 같은 경우에 Visual Basic은 빈 이벤트 처리기를 자동으로 스텁하고 이벤트와 연결합니다. 예를 들어 디자인 모드에서 폼에서 명령 단추를 두 번 클릭하면 Visual Basic은 다음 코드와 같이 명령 단추에 대한 빈 이벤트 처리기 및 WithEvents
변수를 만듭니다.
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler 및 RemoveHandler
이 AddHandler
문은 둘 다 이벤트 처리기를 지정할 수 있다는 절과 비슷합니다 Handles
. 그러나 AddHandler
함께 RemoveHandler
사용하면 절보다 Handles
더 큰 유연성을 제공하므로 이벤트와 연결된 이벤트 처리기를 동적으로 추가, 제거 및 변경할 수 있습니다. 구조체에 있는 AddHandler
을 사용하여 공유 이벤트 또는 이벤트를 반드시 처리해야 합니다.
AddHandler
는 컨트롤과 같은 이벤트 발신자의 이벤트 이름과 대리자로 평가되는 표현 식, 이렇게 두 가지 인수를 받습니다.
AddHandler
를 사용할 때, AddressOf
문이 항상 위임자에 대한 참조를 반환하기 때문에 위임자 클래스를 명시적으로 지정할 필요가 없습니다. 다음 예제에서는 이벤트 처리기를 개체에 의해 발생한 이벤트와 연결합니다.
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler
이벤트 처리기에서 이벤트의 연결을 끊는 경우와 동일한 구문을 AddHandler
사용합니다. 다음은 그 예입니다.
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
다음 예제에서는 이벤트 처리기가 이벤트와 연결되고 이벤트가 발생합니다. 이벤트 처리기는 이벤트를 catch하고 메시지를 표시합니다.
그런 다음 첫 번째 이벤트 처리기가 제거되고 다른 이벤트 처리기가 이벤트와 연결됩니다. 이벤트가 다시 발생하면 다른 메시지가 표시됩니다.
마지막으로 두 번째 이벤트 처리기가 제거되고 세 번째로 이벤트가 발생합니다. 이벤트와 연결된 이벤트 처리기가 더 이상 없으므로 아무 작업도 수행되지 않습니다.
Module Module1
Sub Main()
Dim c1 As New Class1
' Associate an event handler with an event.
AddHandler c1.AnEvent, AddressOf EventHandler1
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler1
' Now associate a different event handler with the event.
AddHandler c1.AnEvent, AddressOf EventHandler2
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler2
' This event will not be handled.
c1.CauseTheEvent()
End Sub
Sub EventHandler1()
' Handle the event.
MsgBox("EventHandler1 caught event.")
End Sub
Sub EventHandler2()
' Handle the event.
MsgBox("EventHandler2 caught event.")
End Sub
Public Class Class1
' Declare an event.
Public Event AnEvent()
Sub CauseTheEvent()
' Raise an event.
RaiseEvent AnEvent()
End Sub
End Class
End Module
기본 클래스에서 상속된 이벤트 처리
기본 클래스에서 특성을 상속하는 클래스인 파생 클래스는 해당 문을 사용하여 Handles MyBase
기본 클래스에서 발생한 이벤트를 처리할 수 있습니다.
기본 클래스의 이벤트를 처리하려면
이벤트 처리기 프로시저의 선언 줄에
Handles MyBase.
문을 추가하여 파생 클래스에서 이벤트 처리기를 선언합니다. 여기서 eventname은 처리 중인 기본 클래스의 이벤트 이름입니다. 다음은 그 예입니다.Public Class BaseClass Public Event BaseEvent(ByVal i As Integer) ' Place methods and properties here. End Class Public Class DerivedClass Inherits BaseClass Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent ' Place code to handle events from BaseClass here. End Sub End Class
관련 섹션
제목 | 설명 |
---|---|
가이드: 이벤트 선언 및 발생 | 클래스에 대한 이벤트를 지정하고 발생시키는 방법에 대한 단계별 설명을 제공합니다. |
안내: 이벤트 처리 | 이벤트 처리기 프로시저를 작성하는 방법을 보여 줍니다. |
방법: 차단을 방지하기 위해 사용자 지정 이벤트 선언 | 이벤트 처리기를 비동기적으로 호출할 수 있도록 하는 사용자 지정 이벤트를 정의하는 방법을 보여 줍니다. |
방법: 메모리를 절약하기 위해 사용자 지정 이벤트 선언 | 이벤트가 처리될 때만 메모리를 사용하는 사용자 지정 이벤트를 정의하는 방법을 보여 줍니다. |
Visual Basic에서 상속된 이벤트 처리기 관련 문제 해결 | 상속된 구성 요소의 이벤트 처리기에서 발생하는 일반적인 문제를 나열합니다. |
이벤트 | .NET Framework의 이벤트 모델에 대한 개요를 제공합니다. |
Windows Forms에서 이벤트 처리기 만들기 | Windows Forms 개체와 연결된 이벤트를 사용하는 방법을 설명합니다. |
대표자 | Visual Basic의 대리자 개요를 제공합니다. |
.NET