Generic Procedures in Visual Basic

제네릭 프로시저제네릭 메서드라고도 하며 하나 이상의 형식 매개 변수를 통해 정의된 프로시저를 말합니다. 이렇게 하면 호출 코드가 프로시저를 호출할 때마다 데이터 형식을 요구 사항에 맞춰 조정할 수 있습니다.

제네릭 클래스나 제네릭 구조체 내부에서 정의되었다고 해서 프로시저가 제네릭이 되는 것은 아닙니다. 프로시저가 제네릭이 되려면 사용할 수 있는 일반 매개 변수 외에 최소 하나의 형식 매개 변수가 있어야 합니다. 제네릭 클래스나 제네릭 구조체에도 제네릭이 아닌 프로시저가 있을 수 있으며 제네릭이 아닌 클래스나 구조체, 모듈에도 제네릭 프로시저가 있을 수 있습니다.

제네릭 프로시저는 형식 매개 변수를 일반 매개 변수 목록과 프로시저 코드에서 사용하며, 반환 형식이 있는 경우 반환 형식에서도 사용할 수 있습니다.

형식 유추

형식 인수를 전혀 제공하지 않고도 제네릭 프로시저를 호출할 수 있습니다. 이러한 방식으로 제네릭 프로시저를 호출하는 경우, 컴파일러는 해당 프로시저의 형식 인수에 전달할 적절한 데이터 형식을 확인 시도합니다. 이러한 동작을 형식 유추라고 합니다. 다음 코드는 컴파일러가 String 형식을 t 형식 매개 변수에 전달해야 한다고 유추하는 호출을 보여 줍니다.

Public Sub testSub(Of t)(ByVal arg As t)
End Sub
Public Sub callTestSub()
    testSub("Use this string")
End Sub

컴파일러가 호출 컨텍스트에서 형식 인수를 유추할 수 없는 경우에는 오류를 보고합니다. 배열 순위 불일치는 이러한 오류를 일으킬 수 있는 원인 중 하나입니다. 예를 들어, 정규 매개 변수를 형식 매개 변수 배열로 정의한다고 가정합니다. 다른 순위(차원 수)의 배열을 제공하여 제네릭 프로시저를 호출하면 불일치로 인해 형식 유추가 실패합니다. 다음 코드는 1차원 배열을 예상하는 프로시저에 2차원 배열을 전달한 경우의 호출을 보여줍니다.

Public Sub demoSub(Of t)(ByVal arg() As t)
End Sub

Public Sub callDemoSub()
    Dim twoDimensions(,) As Integer
    demoSub(twoDimensions)
End Sub

모든 형식 인수를 생략해야만 형식 유추를 호출할 수 있습니다. 하나의 형식 인수를 제공하는 경우 모두 제공해야 합니다.

형식 유추는 제네릭 프로시저만 지원합니다. 제네릭 클래스나 구조체, 인터페이스, 대리자에서는 형식 유추를 호출할 수 없습니다.

예제

설명

다음 예제에서는 제네릭 Function 프로시저를 정의하여 배열에서 특정 요소를 찾습니다. 이 예제는 하나의 형식 매개 변수를 정의하여 이를 매개 변수 목록에 있는 매개 변수 두 개를 생성할 때 사용합니다.

코드

Public Function findElement(Of T As IComparable) (
        ByVal searchArray As T(), ByVal searchValue As T) As Integer

    If searchArray.GetLength(0) > 0 Then
        For i As Integer = 0 To searchArray.GetUpperBound(0)
            If searchArray(i).CompareTo(searchValue) = 0 Then Return i
        Next i
    End If

    Return -1
End Function

주석

앞의 예제에서는 searchValuesearchArray 요소들과 비교하는 기능이 필요합니다. 이 기능을 확보하기 위해 T형식 매개 변수를 제한하여 IComparable<T> 인터페이스를 구현합니다. 코드는 CompareTo 메서드를 = 연산자 대신 사용하는데, 이는 T를 위해 제공된 형식 인수가 = 연산자를 지원한다는 보장이 없기 때문입니다.

다음 코드를 이용하여 findElement 프로시저를 테스트할 수 있습니다.

Public Sub tryFindElement()
    Dim stringArray() As String = {"abc", "def", "xyz"}
    Dim stringSearch As String = "abc"
    Dim integerArray() As Integer = {7, 8, 9}
    Dim integerSearch As Integer = 8
    Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}
    Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today
    MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))
    MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))
    MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))
End Sub

MsgBox에 대한 앞서의 호출은 각각 "0", "1", "-1"로 표시됩니다.

참고 항목