대리자 및 AddressOf 연산자

업데이트: 2007년 11월

대리자는 다른 개체의 메서드를 호출하는 데 사용되는 개체입니다. 또한 다른 프로그래밍 언어에서 사용되는 함수 포인터와 비슷하기 때문에 종종 형식이 안전한 함수 포인터로 설명되기도 합니다. 그러나 Visual Basic의 대리자는 함수 포인터와 달리 System.Delegate 클래스를 기반으로 하는 참조 형식입니다. 대리자는 공유 메서드(클래스의 특정 인스턴스 없이도 호출할 수 있는 메서드)와 인스턴스 메서드를 모두 참조할 수 있습니다.

대리자 및 이벤트

대리자는 호출 프로시저와 호출되는 프로시저 간의 매개자가 필요한 경우에 유용합니다. 예를 들어, 이벤트를 발생시키는 개체에서 상황에 따라 서로 다른 이벤트 처리기를 호출할 수 있도록 만들어야 하는 경우가 있습니다. 그러나 이벤트를 발생시키는 개체는 특정 이벤트를 처리할 이벤트 처리기를 미리 알 수 없습니다. Visual Basic에서는 AddHandler 문을 사용할 때 대리자를 만들어 이벤트와 이벤트 처리기를 동적으로 연결할 수 있습니다. 이 대리자는 런타임에 적절한 이벤트 처리기에 대한 호출을 전달합니다.

사용자가 직접 대리자를 만들 수도 있지만 대부분의 경우에는 Visual Basic에서 대리자를 만들어 세부 사항을 관리합니다. 예를 들어, Event 문은 <EventName>EventHandler라는 대리자 클래스를 해당 이벤트와 동일한 시그니처를 갖는 Event 문이 들어 있는 클래스의 중첩 클래스로 암시적으로 정의합니다. AddressOf 문은 대리자의 인스턴스를 암시적으로 만듭니다. 예를 들어, 다음과 같은 두 줄의 코드가 있습니다.

AddHandler Button1.Click, AddressOf Me.Button1_Click
' The previous line of code is shorthand for the next line of code.
AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)

컴파일러가 컨텍스트에 따라 대리자의 형식을 확인할 수 있는 모든 위치에서 이와 같이 간단한 방법으로 대리자를 만들 수 있습니다.

기존 대리자 형식을 사용하는 이벤트 선언

일부 경우에는 기존 대리자 형식을 내부 대리자로 사용하는 이벤트를 선언할 수 있습니다. 다음 구문은 이러한 방법을 보여 줍니다.

Delegate Sub DelegateType()
Event AnEvent As DelegateType

이 방법은 여러 개의 이벤트를 동일한 처리기에 라우팅하려는 경우에 유용합니다.

대리자 변수 및 매개 변수

이벤트와 관련되지 않은 기타 작업(예: 자유 스레딩) 또는 컴파일 타임에 다른 버전의 함수를 호출해야 하는 프로시저에 대리자를 사용할 수 있습니다.

예를 들어, 자동차 이름이 있는 목록 상자가 포함된 항목별 광고 응용 프로그램이 있습니다. 광고는 대개 자동차 생산업체 이름인 제목을 기준으로 정렬됩니다. 이때 일부 자동차의 경우 생산업체 앞에 연도가 포함되면 문제가 생길 수 있습니다. 목록 상자의 내장 정렬 기능은 문자 코드만을 기준으로 정렬하므로 날짜로 시작하는 광고들을 먼저 표시한 다음 생산업체로 시작하는 광고들을 표시하게 됩니다.

이 문제를 해결하려면 대부분의 목록 상자에 표준 영문자 정렬을 사용하고 런타임에 자동차 광고에 대해서는 사용자 지정 정렬 프로시저로 전환할 수 있는 클래스에 정렬 프로시저를 만듭니다. 이 작업을 수행하려면 대리자를 사용하여 런타임에 사용자 지정 정렬 프로시저를 정렬 클래스에 전달합니다.

각 대리자 클래스는 개체 메서드의 사양이 전달되는 생성자를 정의합니다. 대리자 생성자의 인수는 메서드에 대한 참조이거나 람다 식이어야 합니다.

메서드에 대한 참조를 지정하려면 다음 구문을 사용합니다.

AddressOf [expression.]methodName

expression의 컴파일 타임 형식은 지정된 이름의 시그니처가 대리자 클래스의 시그니처와 일치하는 메서드가 포함된 클래스 또는 인터페이스의 이름이어야 합니다. methodName은 공유 메서드 또는 인스턴스 메서드가 될 수 있습니다. methodName은 클래스의 기본 메서드에 대한 대리자를 만드는 경우에도 반드시 지정해야 합니다.

람다 식을 지정하려면 다음 구문을 사용합니다.

Function ([parm As type, parm2 As type2, ...]) expression

함수의 시그니처는 대리자 형식의 시그니처와 일치해야 합니다. 람다 식에 대한 자세한 내용은 람다 식을 참조하십시오.

참고 항목

작업

방법: Visual Basic에서 프로시저에 다른 프로시저 전달

방법: 대리자 메서드 호출

방법: 이벤트 처리기 작성

개념

람다 식

이벤트 및 이벤트 처리기

AddHandler 및 RemoveHandler

다중 스레드 응용 프로그램

참조

Delegate 문

AddressOf 연산자