방법: 형식 안전 컬렉션 정의
업데이트: 2007년 11월
다음 예제에서는 Visual Basic에서 제공하는 Collection 클래스를 사용하여 컬렉션을 정의하고 만드는 것을 보여 줍니다.
Public Class widgetRepository
Public widgetColl As New Microsoft.VisualBasic.Collection()
' Insert code to implement additional functionality.
End Class
그러나 이 widgetColl 컬렉션은 강력한 형식이 아닙니다. 해당 컬렉션에 widget 개체뿐 아니라 모든 요소 형식을 추가할 수 있습니다. 요소를 검색할 때는 해당 요소를 widget으로 변환해야 할 수 있으며 이로 인해 형식 안전성 문제가 발생할 수도 있습니다. 예를 들어, 다음 코드를 사용하여 컬렉션에 String을 추가하는 경우를 가정합니다.
Dim notWidget As String = "This is not a widget object!"
widgetColl.Add(notWidget)
이렇게 한 다음 해당 요소를 검색하려고 하면 컬렉션의 해당 요소가 widget 형식이 아니기 때문에 런타임에 ArgumentException 예외가 throw됩니다.
형식 안전성 문제 방지
제네릭 클래스를 정의하여 형식 안전성을 최대화하는 것이 좋습니다. 이렇게 하면 강력한 형식화가 적용되며 특정 데이터 형식을 유연성 있게 사용할 수 있습니다. 자세한 내용은 Visual Basic의 제네릭 형식을 참조하십시오.
클래스에 형식 안전 컬렉션을 정의하려면
컬렉션 클래스에 대해 System.Collections.Generic 네임스페이스의 제네릭 클래스 중 하나를 사용합니다. 예를 들면 List<T>과 같습니다. 이렇게 하면 widget 멤버만 사용할 수 있는 컬렉션을 만들 수 있습니다. 다음 예제에서는 앞의 예제의 선언을 수정하여 제네릭 컬렉션을 만드는 방법을 보여 줍니다.
Public widgetColl As New System.Collections.Generic.List(Of widget)
이렇게 하면 강력한 형식화를 사용하여 컬렉션에 widget 항목만 추가할 수 있으며 Item 속성을 통해 검색하는 모든 요소는 widget 개체입니다. 또한 이런 강력한 형식화로 인해 검색 코드에서 widget에 노출된 모든 속성 및 메서드를 사용할 수 있습니다.
-또는-
미리 정의된 클래스를 사용하지 않고 사용자 지정 컬렉션 클래스를 만듭니다. Add 메서드를 제한하여 widget 개체만 허용하고 widget 반환 형식으로 Item 속성을 구현합니다. 자세한 내용은 방법: 형식 안전 컬렉션 정의를 참조하십시오.
Item에서 Object 형식의 요소를 반환한 경우 Object 클래스에 정의된 속성과 메서드에만 명시적으로 액세스할 수 있습니다. widget 멤버에 액세스하려면 다음 코드와 같이 Option Strict Off로 전환하거나 CType 함수를 사용하여 반환된 요소를 widget에 명시적으로 변환해야 합니다.
Dim nextWidget As widget Try nextWidget = CType(widgetColl.Item(1), widget) Catch ex As Exception ' Insert code to run if the collection item is not a widget. End Try
어떤 방법을 사용하든 이런 방식으로 Object 요소를 사용하면 Visual Basic에서 런타임에 바인딩을 사용하여 성능이 떨어집니다.
Visual Basic Collection 클래스에서는 Object 요소를 허용하고 반환합니다. 따라서 약한 형식이 되고 런타임에 바인딩되는 단점도 있습니다.