Visual Basic의 이벤트 모델은 이벤트 핸들러를 통해 사용자 작업에 응답할 수 있게 하며, 이는 GUI(그래픽 사용자 인터페이스) 프로그램에서 중요합니다. 각 요소는 자체 이벤트를 발생시킬 수 있습니다.
클래식 VB6에서는 이벤트 처리가 컨트롤과 메소드 간의 정적 바인딩으로 구현되었습니다. VB.NET 및 WinForms에서 모델은 더욱 유연해졌으며, 이제 한 이벤트에 여러 핸들러를 바인딩할 수 있고 AddHandler/RemoveHandler를 통한 동적 바인딩이 지원됩니다.
일반적인 어려움은 동적으로 컨트롤을 추가하고 그 이벤트를 관리하는 것입니다. 이벤트에서 해지를 하지 않거나 핸들러를 잘못 바인딩하면 메모리 누수, 호출 중복, UI 동작에 대한 제어 손실이 발생할 수 있습니다.
동적으로 컨트롤을 생성할 때는 핸들러를 구독하기 위해 AddHandler를 사용하고 핸들러를 올바르게 제거하기 위해 RemoveHandler를 사용하세요. 컨트롤의 수명 주기를 주의하세요. 컨트롤이 파괴되면 핸들러에서 해지해야 하며, 그렇지 않으면 "유령" 참조가 남아 있습니다.
코드 예:
Dim btn As New Button() AddHandler btn.Click, AddressOf ButtonClickHandler ' ... RemoveHandler btn.Click, AddressOf ButtonClickHandler Sub ButtonClickHandler(sender As Object, e As EventArgs) MessageBox.Show("버튼이 클릭되었습니다!") End Sub
핵심 사항:
같은 요소에 이벤트 핸들러가 여러 번 연결되면 무엇이 발생합니까?
핸들러는 AddHandler를 통해 추가된 횟수만큼 호출되어 예기치 않은 다중 실행을 발생시킬 수 있습니다.
AddHandler btn.Click, AddressOf Handler AddHandler btn.Click, AddressOf Handler ' 버튼 클릭 시 Handler가 2번 호출됩니다.
매개변수가 이벤트의 시그니처와 다른 메소드를 사용할 수 있습니까?
아니요, 핸들러 메소드의 서명은 이벤트의 대리자와 엄격하게 일치해야 합니다(예: Sub Handler(sender As Object, e As EventArgs)). 그렇지 않으면 컴파일러가 오류를 발생시킵니다.
RemoveHandler는 핸들러가 여러 번 추가된 경우 모든 인스턴스를 제거합니까?
아니요, RemoveHandler는 호출 당 하나의 구독만 제거합니다. 핸들러가 여러 번 추가된 경우, 동일한 만큼 제거해야 하며, 그렇지 않으면 하나의 인스턴스가 남아 있을 것입니다.
100개의 버튼이 동적으로 생성되고 모든 버튼에 핸들러가 지정되지만 RemoveHandler가 호출되지 않습니다. 폼을 닫은 후 이벤트가 계속 "살아" 있게 되어 빈번한 오류가 발생합니다.
장점:
단점:
모든 동적 컨트롤에 이름이 있는 핸들러가 추가되고, 컨트롤이 명시적 루프에서 제거될 때 모든 핸들러가 해지됩니다.
장점:
단점: