다음을 통해 공유


Visual Basic의 제네릭 형식(Visual Basic)

제네릭 형식 여러 데이터 형식에 대해 동일한 기능을 수행하도록 조정되는 단일 프로그래밍 요소입니다. 제네릭 클래스 또는 프로시저를 정의할 때 해당 기능을 수행할 각 데이터 형식에 대해 별도의 버전을 정의할 필요가 없습니다.

비유는 교체 가능한 헤드가 있는 드라이버 세트입니다. 당신은 나사를 검사하고 그 나사에 대한 올바른 머리를 선택합니다 (슬롯, 교차, 별표). 스크루드라이버 핸들에 올바른 헤드를 삽입한 후에는 스크류드라이버를 사용하여 정확히 동일한 기능을 수행합니다. 즉, 나사를 돌립니다.

헤드가 다른 스크루드라이버 집합의 다이어그램입니다.

제네릭 형식을 정의할 때 하나 이상의 데이터 형식으로 매개 변수화합니다. 형식 매개 변수를 사용하면 코드가 데이터 형식을 요구 사항에 맞게 조정할 수 있습니다. 코드는 제네릭 요소에서 여러 가지 프로그래밍 요소를 선언할 수 있으며, 각 요소는 서로 다른 데이터 형식 집합에서 작동합니다. 그러나 선언된 요소는 사용 중인 데이터 형식에 관계없이 모두 동일한 논리를 수행합니다.

예를 들어 String같은 특정 데이터 형식에서 작동하는 큐 클래스를 만들고 사용할 수 있습니다. System.Collections.Generic.Queue<T>에서 이러한 클래스를 선언할 수 있으며, 다음 예제가 그 방법을 보여줍니다.

Public stringQ As New System.Collections.Generic.Queue(Of String)

이제 stringQ를 사용하여 String 값과만 작업할 수 있습니다. stringQObject 값으로 일반화되는 대신 String에 특정되어 있으므로, 지연 바인딩이나 형식 변환이 없습니다. 제네릭 형식은 실행 시간을 절약하고 런타임 오류를 줄입니다.

제네릭 형식 사용에 대한 자세한 내용은 방법: 제네릭 클래스 사용법을 참조하십시오.

제네릭 클래스의 예

다음 예제에서는 제네릭 클래스의 기본 정의를 보여줍니다.

Public Class classHolder(Of t)
    Public Sub processNewItem(ByVal newItem As t)
        Dim tempItem As t
        ' Insert code that processes an item of data type t.
    End Sub
End Class

앞의 기본 구조에서 t형식 매개 변수, 즉 클래스를 선언할 때 제공하는 데이터 형식의 자리 표시자입니다. 코드의 다른 부분에서 t에 다양한 데이터 형식을 제공하여 여러 버전의 classHolder을 선언할 수 있습니다. 다음 예제에서는 두 개의 이러한 선언을 보여 줍니다.

Public integerClass As New classHolder(Of Integer)
Friend stringClass As New classHolder(Of String)

앞의 문은 특정 형식이 형식 매개 변수를 대체하는 구성된 클래스을 설명한 것입니다. 이 대체는 생성된 클래스 내의 코드 전체에서 전파됩니다. 다음 예제에서는 integerClassprocessNewItem 프로시저의 모양을 보여줍니다.

Public Sub processNewItem(ByVal newItem As Integer)
    Dim tempItem As Integer
    ' Inserted code now processes an Integer item.
End Sub

자세한 예제는 방법: 다른 데이터 형식에 대해 동일한 기능을 제공할 수 있는 클래스 정의참조하세요.

적격 프로그래밍 요소

제네릭 클래스, 구조체, 인터페이스, 프로시저 및 대리자를 정의하고 사용할 수 있습니다. .NET은 일반적으로 사용되는 제네릭 요소를 나타내는 여러 제네릭 클래스, 구조체 및 인터페이스를 정의합니다. System.Collections.Generic 네임스페이스는 사전, 목록, 큐 및 스택을 제공합니다. 고유한 제네릭 요소를 정의하기 전에 System.Collections.Generic에 이미 있는지 확인하십시오.

프로시저는 형식이 아니지만 제네릭 프로시저를 정의하고 사용할 수 있습니다. Visual Basic에서 제네릭 프로시저를참조하세요.

제네릭 형식의 장점

제네릭 형식은 각각 특정 데이터 형식에서 작동하는 여러 다른 프로그래밍 요소를 선언하기 위한 기초 역할을 합니다. 제네릭 형식의 대안은 다음과 같습니다.

  1. Object 데이터 형식에서 작동하는 단일 형식입니다.
  2. 형식 유형에 따라 구분된 버전의 집합입니다. 각 버전은 String, Integer또는 사용자 정의 형식(예: customer)과 같은 특정 데이터 형식에서 개별적으로 코딩되고 작동합니다.

제네릭 형식은 이러한 대안보다 다음과 같은 이점이 있습니다.

  • 형식 안전. 제네릭 형식은 컴파일 시간 형식 검사를 적용합니다. Object 기반 형식은 모든 데이터 형식을 허용하며 입력 데이터 형식이 허용되는지 여부를 확인하는 코드를 작성해야 합니다. 제네릭 형식을 사용하면 컴파일러가 런타임 전에 형식 불일치를 catch할 수 있습니다.
  • 공연. 제네릭 형식은 각각 하나의 데이터 형식에 대해 특수화되므로 박싱언박싱 데이터를 하지 않아도 됩니다. Object 기반 작업은 입력 데이터 형식을 Object로 변환하기 위해 박싱하고, 출력을 위한 데이터를 변환하기 위해 언박싱해야 합니다. Boxing과 unboxing을 사용하면 성능이 저하됩니다. Object 기반 유형도 지연 바인딩되어 있어 런타임에 멤버에 액세스하려면 추가 코드가 필요합니다. 형식 변환도 성능을 저하시킵니다.
  • 코드 통합. 제네릭 형식의 코드는 한 번만 정의해야 합니다. 형식별 버전 집합은 각 버전에서 동일한 코드를 복제해야 하며, 유일한 차이점은 해당 버전의 특정 데이터 형식입니다. 제네릭 형식을 사용하면 형식별 버전이 모두 원래 제네릭 형식에서 생성됩니다.
  • 코드 재사용. 특정 데이터 형식에 의존하지 않는 코드는 제네릭인 경우 다양한 데이터 형식과 함께 다시 사용할 수 있습니다. 원래 예측하지 않았던 데이터 형식에서도 재사용할 수 있습니다.
  • IDE 지원. 제네릭 형식에서 선언된 생성된 형식을 사용하는 경우 코드를 개발하는 동안 IDE(통합 개발 환경)를 통해 더 많은 지원을 제공할 수 있습니다. 예를 들어 IntelliSense는 생성자 또는 메서드에 대한 인수에 대한 형식별 옵션을 표시할 수 있습니다.
  • 제네릭 알고리즘. 형식 독립적 추상 알고리즘은 제네릭 형식에 적합한 후보입니다. 예를 들어 IComparable 인터페이스를 사용하여 항목을 정렬하는 제네릭 프로시저는 IComparable구현하는 모든 데이터 형식과 함께 사용할 수 있습니다.

제약 조건

제네릭 형식 정의의 코드는 가능한 한 형식 독립적이어야 하지만 제네릭 형식에 제공된 데이터 형식의 특정 기능이 필요할 수 있습니다. 예를 들어 정렬하거나 대조할 두 항목을 비교하려면 해당 데이터 유형이 IComparable 인터페이스를 구현해야 합니다. 형식 매개 변수에 제약 조건 추가하여 이 요구 사항을 적용할 수 있습니다.

제약 조건의 예

다음 예제에서는 형식 인수가 IComparable구현해야 하는 제약 조건이 있는 클래스의 기본 정의를 보여 줍니다.

Public Class itemManager(Of t As IComparable)
    ' Insert code that defines class members.
End Class

후속 코드가 IComparable구현하지 않는 형식을 제공하는 itemManager 클래스를 생성하려고 하면 컴파일러에서 오류를 알릴 수 있습니다.

제약 조건 유형

제약 조건은 모든 조합에서 다음 요구 사항을 지정할 수 있습니다.

  • 형식 인수는 하나 이상의 인터페이스를 구현해야 합니다.
  • 형식 인수는 최대 한 클래스의 형식이거나 상속되어야 합니다.
  • 형식 인수는 개체를 만드는 코드에서 액세스할 수 있는 매개 변수가 없는 생성자를 노출해야 합니다.
  • 형식 인수는 참조 형식이거나 값 형식이어야 합니다

C# 코드는 형식 인수가 비관리 형식이어야 한다고 선언할 수 있습니다. Visual Basic은 이 제약 조건(C#)으로 정의된 제네릭 형식 또는 메서드를 사용하는 Visual Basic 코드에 이 제약 조건을 적용합니다. 그러나 Visual Basic에서는 형식 매개 변수에 unmanaged 제약 조건을 선언할 수 없습니다.

둘 이상의 요구 사항을 적용해야 하는 경우 중괄호({ }) 내부에 쉼표로 구분된 제약 조건 목록을 사용합니다. 액세스 가능한 생성자를 요구하려면 목록에 New Operator 키워드를 포함합니다. 참조 형식을 요구하려면 Class 키워드를 포함합니다. 값 형식을 요구하려면 Structure 키워드를 포함합니다.

제약 조건에 대한 자세한 내용은 형식 목록참조하세요.

여러 제약 조건의 예

다음 예제에서는 형식 매개 변수에 제약 조건 목록이 있는 제네릭 클래스의 기본 정의를 보여 있습니다. 이 클래스의 인스턴스를 만드는 코드에서 형식 인수는 IComparable 인터페이스와 IDisposable 인터페이스를 모두 구현하고 참조 형식이며 액세스 가능한 매개 변수가 없는 생성자를 노출해야 합니다.

Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})
    ' Insert code that defines class members.
End Class

중요한 용어

제네릭 형식은 다음 용어를 도입하고 사용합니다.

  • 제네릭 형식. 선언할 때 하나 이상의 데이터 형식을 제공하는 클래스, 구조체, 인터페이스, 프로시저 또는 대리자의 정의입니다.
  • 형식 매개 변수. 제네릭 형식 정의에서 형식을 선언할 때 제공하는 데이터 형식의 자리 표시자입니다.
  • 형식 인수. 제네릭 형식에서 생성된 형식을 선언할 때 형식 매개 변수를 대체하는 특정 데이터 형식입니다.
  • 제약 조건. 제공할 수 있는 형식 인수를 제한하는 형식 매개 변수의 조건입니다. 제약 조건을 사용하려면 형식 인수가 특정 인터페이스를 구현하거나, 특정 클래스에서 상속하거나, 액세스 가능한 매개 변수가 없는 생성자를 갖거나, 참조 형식 또는 값 형식이어야 할 수 있습니다. 이러한 제약 조건을 결합할 수 있지만 최대 하나의 기본 클래스를 지정할 수 있습니다.
  • 생성된 형식 . 형식 매개 변수에 대한 형식 인수를 제공하여 제네릭 형식에서 선언된 클래스, 구조체, 인터페이스, 프로시저 또는 대리자입니다.

참조