대리자(Visual Basic)Delegates (Visual Basic)

대리자는 메서드를 참조하는 개체입니다.Delegates are objects that refer to methods. 다른 프로그래밍 언어에서 사용되는 함수 포인터와 비슷하기 때문에 형식 안전 함수 포인터라고도 합니다.They are sometimes described as type-safe function pointers because they are similar to function pointers used in other programming languages. 함수 포인터와 달리 Visual Basic 대리자는 클래스를 기반으로 하는 참조 형식 System.Delegate합니다.But unlike function pointers, Visual Basic delegates are a reference type based on the class System.Delegate. 대리자는 공유 메서드(클래스의 특정 인스턴스 없이 호출할 수 있는 메서드) 및 인스턴스 메서드를 둘 다 참조할 수 있습니다.Delegates can reference both shared methods — methods that can be called without a specific instance of a class — and instance methods.

대리자 및 이벤트Delegates and Events

대리자는 호출 프로시저와 호출되는 프로시저 간에 중개자가 필요한 경우에 유용합니다.Delegates are useful in situations where you need an intermediary between a calling procedure and the procedure being called. 예를 들어 다양한 상황에서 다른 이벤트 처리기를 호출하도록 하는 이벤트를 발생시키는 개체를 원할 수 있습니다.For example, you might want an object that raises events to be able to call different event handlers under different circumstances. 그러나 이벤트를 발생시키는 개체는 특정 이벤트를 처리할 이벤트 처리기가 어느 것인지를 미리 알 수 없습니다.Unfortunately, the object raising the events cannot know ahead of time which event handler is handling a specific event. Visual Basic 사용 하면 이벤트를 사용 하 여 동적으로 연결할 이벤트 처리기 대리자를 사용 하는 경우 만들어를 AddHandler 문입니다.Visual Basic lets you dynamically associate event handlers with events by creating a delegate for you when you use the AddHandler statement. 런타임 시 대리자는 적절한 이벤트 처리기로 호출을 전달합니다.At run time, the delegate forwards calls to the appropriate event handler.

사용자가 직접 대리자를 만들 수 있지만 대부분의 경우에서 Visual Basic 대리자를 만들고 세부 정보를 처리 합니다.Although you can create your own delegates, in most cases Visual Basic creates the delegate and takes care of the details for you. 예를 들어 Event 문은 <EventName>EventHandler라는 대리자 클래스를 Event 문을 포함하고 이벤트와 시그니처가 같은 클래스의 중첩 클래스로 암시적으로 정의합니다.For example, an Event statement implicitly defines a delegate class named <EventName>EventHandler as a nested class of the class containing the Event statement, and with the same signature as the event. AddressOf 문은 특정 프로시저를 참조하는 대리자의 인스턴스를 암시적으로 만듭니다.The AddressOf statement implicitly creates an instance of a delegate that refers to a specific procedure. 다음 두 코드 줄은 동일한 의미를 갖습니다.The following two lines of code are equivalent. 첫 번째 줄에서는 Button1_Click 메서드에 대한 참조가 인수로 전달된 EventHandler의 인스턴스를 명시적으로 만듭니다.In the first line, you see the explicit creation of an instance of EventHandler, with a reference to method Button1_Click sent as the argument. 두 번째 줄은 동일한 작업을 좀 더 편리하게 수행합니다.The second line is a more convenient way to do the same thing.

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

컴파일러가 어디에서든지 상황에 따라 대리자의 형식을 결정할 수 있도록 대리자를 만드는 간단한 방법을 사용할 수 있습니다.You can use the shorthand way of creating delegates anywhere the compiler can determine the delegate's type by the context.

기존 대리자 형식을 사용하는 이벤트 선언Declaring Events that Use an Existing Delegate Type

일부 경우에 기존 대리자 형식을 내부 대리자로 사용하도록 이벤트를 선언하려고 할 수 있습니다.In some situations, you may want to declare an event to use an existing delegate type as its underlying delegate. 다음 구문에 해당 방법이 나와 있습니다.The following syntax demonstrates how:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

동일한 처리기로 여러 이벤트 라우팅하려는 경우에 유용합니다.This is useful when you want to route multiple events to the same handler.

대리자 변수 및 매개 변수Delegate Variables and Parameters

빈 스레드 또는 런타임에 다른 버전의 함수를 호출해야 하는 프로시저 등, 이벤트와 관련되지 않은 다른 작업에 대리자를 사용할 수 있습니다.You can use delegates for other, non-event related tasks, such as free threading or with procedures that need to call different versions of functions at run time.

예를 들어 자동차 이름에 목록 상자를 포함하는 광고 애플리케이션을 분류한다고 가정합니다.For example, suppose you have a classified-ad application that includes a list box with the names of cars. 광고는 일반적으로 자동차 제조업체에 해당하는 제목별로 정렬됩니다.The ads are sorted by title, which is normally the make of the car. 일부 자동차의 제조업체 앞에 자동차 연식이 포함되어 있을 때 문제가 발생할 수 있습니다.A problem you may face occurs when some cars include the year of the car before the make. 문제는 목록 상자의 기본 제공 정렬 기능이 문자 코드를 기준으로만 정렬된다는 것입니다. 즉, 모든 광고는 날짜 순서로 배치된 다음 제조업체 순서로 정렬됩니다.The problem is that the built-in sort functionality of the list box sorts only by character codes; it places all the ads starting with dates first, followed by the ads starting with the make.

이 문제를 해결하려면 대부분의 목록 상자에 대해 표준 사전순 정렬을 사용하지만 자동차 광고의 경우는 런타임에 사용자 지정 정렬 프로시저로 전환할 수 있는 정렬 프로시저를 클래스에 만들 수 있습니다.To fix this, you can create a sort procedure in a class that uses the standard alphabetic sort on most list boxes, but is able to switch at run time to the custom sort procedure for car ads. 이렇게 하려면 대리자를 사용하여 런타임에 정렬 클래스에 사용자 지정 정렬 프로시저를 전달합니다.To do this, you pass the custom sort procedure to the sort class at run time, using delegates.

AddressOf 및 람다 식AddressOf and Lambda Expressions

각 대리자 클래스는 개체 메서드의 사양이 전달되는 생성자를 정의합니다.Each delegate class defines a constructor that is passed the specification of an object method. 대리자 생성자에 대한 인수는 메서드 또는 람다 식에 대한 참조여야 합니다.An argument to a delegate constructor must be a reference to a method, or a lambda expression.

메서드에 대한 참조를 지정하려면 다음 구문을 사용합니다.To specify a reference to a method, use the following syntax:

AddressOf [expression.]methodNameAddressOf [expression.]methodName

expression의 컴파일 타임 형식은 해당 시그니처가 대리자 클래스의 시그니처와 일치하는 지정된 이름의 메서드를 포함하는 클래스 또는 인터페이스의 이름이어야 합니다.The compile-time type of the expression must be the name of a class or an interface that contains a method of the specified name whose signature matches the signature of the delegate class. methodName은 공유 메서드이거나 인스턴스 메서드일 수 있습니다.The methodName can be either a shared method or an instance method. methodName은 클래스의 기본 메서드에 대해 대리자를 만들더라도 선택 사항이 아닙니다.The methodName is not optional, even if you create a delegate for the default method of the class.

람다 식을 지정하려면 다음 구문을 사용합니다.To specify a lambda expression, use the following syntax:

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

다음 예제에서는 대리자에 대한 참조를 지정하는 데 사용되는 AddressOf 및 람다 식을 둘 다 보여 줍니다.The following example shows both AddressOf and lambda expressions used to specify the reference for a delegate.

Module Module1

    Sub Main()
        ' Create an instance of InOrderClass and assign values to the properties.
        ' InOrderClass method ShowInOrder displays the numbers in ascending 
        ' or descending order, depending on the comparison method you specify.
        Dim inOrder As New InOrderClass
        inOrder.Num1 = 5
        inOrder.Num2 = 4

        ' Use AddressOf to send a reference to the comparison function you want
        ' to use.
        inOrder.ShowInOrder(AddressOf GreaterThan)
        inOrder.ShowInOrder(AddressOf LessThan)

        ' Use lambda expressions to do the same thing.
        inOrder.ShowInOrder(Function(m, n) m > n)
        inOrder.ShowInOrder(Function(m, n) m < n)
    End Sub

    Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
        Return num1 > num2
    End Function

    Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
        Return num1 < num2
    End Function

    Class InOrderClass
        ' Define the delegate function for the comparisons.
        Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
        ' Display properties in ascending or descending order.
        Sub ShowInOrder(ByVal compare As CompareNumbers)
            If compare(_num1, _num2) Then
                Console.WriteLine(_num1 & "  " & _num2)
            Else
                Console.WriteLine(_num2 & "  " & _num1)
            End If
        End Sub

        Private _num1 As Integer
        Property Num1() As Integer
            Get
                Return _num1
            End Get
            Set(ByVal value As Integer)
                _num1 = value
            End Set
        End Property

        Private _num2 As Integer
        Property Num2() As Integer
            Get
                Return _num2
            End Get
            Set(ByVal value As Integer)
                _num2 = value
            End Set
        End Property
    End Class
End Module

함수의 시그니처는 대리자 형식의 시그니처와 일치해야 합니다.The signature of the function must match that of the delegate type. 람다 식에 대한 자세한 내용은 람다 식을 참조하세요.For more information about lambda expressions, see Lambda Expressions. 대리자에 대한 람다 식 및 AddressOf 대입의 추가 예제를 보려면 완화된 대리자 변환을 참조하세요.For more examples of lambda expression and AddressOf assignments to delegates, see Relaxed Delegate Conversion.

제목Title 설명Description
방법: 대리자 메서드 호출How to: Invoke a Delegate Method 메서드를 대리자를 연결하고 대리자를 통해 해당 메서드를 호출하는 방법을 보여 주는 예제를 제공합니다.Provides an example that shows how to associate a method with a delegate and then invoke that method through the delegate.
방법: 프로시저에 Visual Basic에서 다른 프로시저 전달How to: Pass Procedures to Another Procedure in Visual Basic 대리자를 사용하여 한 프로시저를 다른 프로시저에 전달하는 방법을 보여 줍니다.Demonstrates how to use delegates to pass one procedure to another procedure.
완화된 대리자 변환Relaxed Delegate Conversion 시그니처가 동일하지 않더라도 sub 및 함수를 대리자 또는 처리기에 할당하는 방법을 설명합니다.Describes how you can assign subs and functions to delegates or handlers even when their signatures are not identical
이벤트Events Visual Basic의 이벤트에 대해 간략하게 설명합니다.Provides an overview of events in Visual Basic.