방법: 다른 데이터 형식에 동일한 기능을 제공할 수 있는 클래스 정의(Visual Basic)
다른 데이터 형식에 동일한 기능을 제공하는 개체를 만들 수 있는 클래스를 정의할 수 있습니다.이렇게 하려면 하나 이상의 형식 매개 변수를 정의에 지정합니다.그러면 클래스가 다양한 데이터 형식을 사용하는 개체에 대한 템플릿 역할을 할 수 있습니다.이런 방식으로 정의된 클래스를 제네릭 클래스라고 합니다.
제네릭 클래스를 정의하는 장점은 한 번만 정의하면 코드에서 이 클래스를 사용하여 여러 가지 데이터 형식을 사용하는 개체를 많이 만들 수 있다는 것입니다.이것은 Object 형식으로 클래스를 정의하는 것보다 성능이 향상됩니다.
클래스 외에도 제네릭 구조체, 인터페이스, 프로시저 및 대리자를 정의하여 사용할 수 있습니다.
형식 매개 변수를 포함하는 클래스를 정의하려면
일반적인 방법으로 클래스를 정의합니다.
클래스 이름 바로 뒤에 (Of typeparameter)를 추가하여 형식 매개 변수를 지정합니다.
둘 이상의 형식 매개 변수가 있는 경우 괄호 안에서 쉼표로 목록을 구분합니다.Of 키워드를 반복하지 않습니다.
코드에서 형식 매개 변수에 대해 단순 할당 이외의 연산을 수행하는 경우 해당 형식 매개 변수 뒤에 As 절을 입력하여 하나 이상의 제약 조건을 추가합니다.제약 조건을 사용하면 형식 매개 변수에 제공된 형식이 다음과 같은 요구 사항을 만족합니다.
코드에서 수행하는 >과 같은 연산을 지원합니다.
코드에서 액세스하는 메서드와 같은 멤버를 지원합니다.
매개 변수가 없는 생성자를 노출합니다.
제약 조건을 지정하지 않으면 코드에서는 Object 데이터 형식에서 지원되는 연산과 멤버만 사용할 수 있습니다.자세한 내용은 형식 목록(Visual Basic)을 참조하십시오.
제공된 형식으로 선언할 모든 클래스 멤버를 식별하고 이를 Astypeparameter로 선언합니다.이는 내부 저장소, 프로시저 매개 변수 및 반환 값에 적용됩니다.
코드에서는 itemType에 제공할 수 있는 데이터 형식에서 지원되는 연산과 메서드만 사용해야 합니다.
다음 예제에서는 매우 단순한 목록을 관리하는 클래스를 정의합니다.이 예제에서는 내부 배열 items에 목록을 저장하고 해당 코드에서 목록 요소의 데이터 형식을 선언할 수 있습니다.매개 변수화된 생성자를 사용하여 해당 코드에서 items의 상한을 설정할 수 있으며 기본 생성자에서 이 값을 전체 10개의 항목 중 9개로 설정합니다.
Public Class simpleList(Of itemType) Private items() As itemType Private top As Integer Private nextp As Integer Public Sub New() Me.New(9) End Sub Public Sub New(ByVal t As Integer) MyBase.New() items = New itemType(t) {} top = t nextp = 0 End Sub Public Sub add(ByVal i As itemType) insert(i, nextp) End Sub Public Sub insert(ByVal i As itemType, ByVal p As Integer) If p > nextp OrElse p < 0 Then Throw New System.ArgumentOutOfRangeException("p", " less than 0 or beyond next available list position") ElseIf nextp > top Then Throw New System.ArgumentException("No room to insert at ", "p") ElseIf p < nextp Then For j As Integer = nextp To p + 1 Step -1 items(j) = items(j - 1) Next j End If items(p) = i nextp += 1 End Sub Public Sub remove(ByVal p As Integer) If p >= nextp OrElse p < 0 Then Throw New System.ArgumentOutOfRangeException("p", " less than 0 or beyond last list item") ElseIf nextp = 0 Then Throw New System.ArgumentException("List empty; cannot remove ", "p") ElseIf p < nextp - 1 Then For j As Integer = p To nextp - 2 items(j) = items(j + 1) Next j End If nextp -= 1 End Sub Public ReadOnly Property listLength() As Integer Get Return nextp End Get End Property Public ReadOnly Property listItem(ByVal p As Integer) As itemType Get If p >= nextp OrElse p < 0 Then Throw New System.ArgumentOutOfRangeException("p", " less than 0 or beyond last list item") End If Return items(p) End Get End Property End Class
simpleList에서 클래스를 선언하여 Integer 값 목록을 저장하고, 다른 클래스를 선언하여 String 값 목록을 저장하고, 마지막으로 또 다른 클래스를 선언하여 Date 값 목록을 저장할 수 있습니다.목록 멤버의 데이터 형식을 제외하고 모든 클래스에서 생성된 개체는 동일하게 동작합니다.
코드에서 itemType에 제공하는 형식 인수는 Boolean 또는 Double과 같은 내장 형식, 구조체, 열거형 또는 응용 프로그램에서 정의하는 클래스를 포함한 모든 클래스 형식일 수 있습니다.
다음과 같은 코드에서 simpleList 클래스를 테스트할 수 있습니다.
Public Sub useSimpleList() Dim iList As New simpleList(Of Integer)(2) Dim sList As New simpleList(Of String)(3) Dim dList As New simpleList(Of Date)(2) iList.add(10) iList.add(20) iList.add(30) sList.add("First") sList.add("extra") sList.add("Second") sList.add("Third") sList.remove(1) dList.add(#1/1/2003#) dList.add(#3/3/2003#) dList.insert(#2/2/2003#, 1) Dim s = "Simple list of 3 Integer items (reported length " & CStr(iList.listLength) & "):" & vbCrLf & CStr(iList.listItem(0)) & vbCrLf & CStr(iList.listItem(1)) & vbCrLf & CStr(iList.listItem(2)) & vbCrLf & "Simple list of 4 - 1 String items (reported length " & CStr(sList.listLength) & "):" & vbCrLf & CStr(sList.listItem(0)) & vbCrLf & CStr(sList.listItem(1)) & vbCrLf & CStr(sList.listItem(2)) & vbCrLf & "Simple list of 2 + 1 Date items (reported length " & CStr(dList.listLength) & "):" & vbCrLf & CStr(dList.listItem(0)) & vbCrLf & CStr(dList.listItem(1)) & vbCrLf & CStr(dList.listItem(2)) MsgBox(s) End Sub