Visual Basic 컬렉션 클래스
컬렉션은 관련된 항목의 집합을 그룹화하는 방법입니다. 컬렉션에는 여러 다른 유형이 있습니다. 폼의 Controls 속성에 의해 반환되는 Form의 Control.ControlCollection과 같은 미리 정의된 컬렉션은 Visual Basic 응용 프로그램에서 다양한 용도로 사용됩니다. 사용자 고유의 컬렉션을 만들어 개체를 구성하고 조작할 수도 있습니다.
컬렉션은 응용 프로그램이 동적으로 만들거나 삭제해야 하는 개체를 추적하는 좋은 방법입니다. 다음 코드 조각에서는 Visual Basic Collection 개체의 Add 메서드를 사용하여 사용자가 만든 widget 개체의 목록을 유지하는 방법을 보여 줍니다.
' Declare and create the Collection object.
Public widgetColl As New Microsoft.VisualBasic.Collection()
' Create a new widget and add it to the widgetColl collection.
Private Sub makeAWidget()
Dim tempWidget As New widget()
widgetColl.Add(tempWidget)
End Sub
위의 예제에서 widgetColl 컬렉션은 makeAWidget 프로시저를 통해 만든 모든 widget 개체를 구성하고 제공합니다. 컬렉션의 인덱스를 통해 각 widget에 대한 개체 참조를 검색할 수 있습니다. 컬렉션의 크기는 각각의 새로운 widget 개체가 추가될 때 자동으로 조정됩니다. For Each...Next 문(Visual Basic)을 사용하여 컬렉션 전체에서 반복할 수 있습니다. 검색할 때 사용할 수 있는 키를 widget 개체에 제공하려면 Add 메서드의 두 번째 매개 변수로 텍스트 문자열을 제공할 수 있습니다.
Visual Basic Collection 개체는 요소를 모두 Object 형식으로 저장하므로 모든 데이터 형식의 항목을 추가할 수 있습니다. 부적절한 데이터 형식이 추가되는 것을 막을 수 없는 방법이 없으므로 이러한 제한 사항을 피하기 위해 System.Collections.Generic 네임스페이스의 제네릭 컬렉션을 사용할 수 있습니다. 자세한 내용은 방법: 개체 컬렉션 만들기(Visual Basic)를 참조하십시오.
컬렉션 개체 만들기 및 소멸
변수 widgetColl에 대한 선언의 New 연산자(Visual Basic) 키워드는 선언문으로 제어가 전달될 때 Collection 개체가 만들어지도록 합니다. Collection은 값 형식이 아니라 클래스이므로 컬렉션의 인스턴스를 만들고 해당 인스턴스에 대한 참조를 변수에 포함시켜야 합니다. 이 인스턴스는 Visual Basic Collection 개체입니다.
다른 개체와 마찬가지로 Collection 개체는 해당 참조를 포함하는 마지막 변수가 Nothing(Visual Basic)으로 설정되거나 범위를 벗어날 때 GC(가비지 수집) 대상으로 표시됩니다. 이 개체에 포함된 모든 개체 참조는 이 개체가 가비지 수집에 의해 회수될 때 해제됩니다. 이러한 이유로 위의 예제에 나오는 변수 widgetColl은 부모 클래스에서 선언되어 프로그램이 실행되는 동안 존재합니다.
컬렉션은 제어하는 개체에 대한 참조를 유지하지만 개체 자체는 포함하지 않습니다. 따라서 Collection 개체를 소멸시켜도 이 개체가 제어하는 개체는 소멸되지 않습니다. 컬렉션의 요소인 각 개별 개체는 가비지 수집 대상으로 개별적으로 표시될 때까지 계속해서 존재합니다.
요소 작업
컬렉션에서 요소를 추가, 삭제 및 검색하는 기본 서비스에는 키 및 인덱스가 사용됩니다. 키는 String 값으로, 이름, 운전 면허 번호, 전화 번호 또는 단순히 문자열로 변환된 정수가 될 수 있습니다. Add 메서드를 사용하면 방법: 컬렉션의 항목 추가, 삭제 및 검색(Visual Basic)에 설명된 대로 키와 요소를 연결할 수 있습니다.
Collection 클래스의 인덱스는 1과 컬렉션에 있는 항목 수 사이의 정수입니다. Count 속성은 현재 항목 수를 반환합니다. Add를 호출할 때 Before와 After 매개 변수를 사용하여 항목 인덱스의 초기 값을 제어할 수 있지만 해당 인덱스 값은 다른 항목이 추가 및 삭제될 때 변경될 수 있습니다. 자세한 내용은 Add를 참조하십시오.
Remove 메서드에 키 또는 인덱스를 전달하여 컬렉션에서 단일 요소를 제거할 수 있습니다. Clear 메서드를 사용하여 컬렉션을 비우고 모든 요소를 제거할 수 있습니다.
요소에 액세스
Contains 메서드에 키 값을 전달하여 컬렉션에 해당 키가 있는 요소가 포함되어 있는지 여부를 테스트할 수 있습니다. Item 속성에 키 또는 인덱스를 전달하여 요소를 검색할 수 있습니다.
인덱스 값과 Item 속성을 사용하여 컬렉션의 항목을 반복하거나 For Each...Next 문(Visual Basic)을 사용할 수 있습니다. 다음 예제에서는 employee 개체 컬렉션의 모든 직원에게 10%의 임금 인상을 제공하는 두 가지 방법을 보여 줍니다. 여기서는 변수 employeesColl에 Collection 개체에 대한 참조가 들어 있다고 가정합니다.
Option Strict On
' The following alternative uses the Count and Item properties.
Dim emp As employee
For counter As Integer = 1 To employeesColl.Count
emp = CType(employeesColl.Item(counter), employee)
emp.payRate *= 1.1
Next counter
' The following alternative uses the For Each...Next statements.
For Each emp As employee In employeesColl
emp.payRate *= 1.1
Next emp
그러나 employeesColl에 형식이 employee가 아닌 요소를 하나 이상 추가한 경우 For Each 루프에서 런타임에 ArgumentException 예외를 throw합니다.
요소의 데이터 형식
Visual Basic Collection 개체는 각 항목을 Object 데이터 형식으로 저장합니다. 따라서 Collection 개체에 추가할 수 있는 데이터 형식의 범위는 Object 변수에 저장할 수 있는 데이터 형식의 범위와 같습니다. 여기에는 사용자 정의 구조 및 클래스 인스턴스뿐 아니라 표준 데이터 형식, 개체 및 배열이 포함됩니다.
Collection 개체는 각 항목을 Object로 저장하기 때문에 Item 속성에서 Object 값을 반환합니다. 사용자 코드에서 항목을 사용하려면 일반적으로 항목을 Object에서 런타임 데이터 형식으로 변환해야 합니다. 이 작업의 수행 방법은 Option Strict 문의 형식 검사 스위치 설정에 따라 달라집니다.
개체에서 암시적으로 변환
Option Strict가 Off인 경우 다음 예제와 같이 Collection의 요소를 적절한 데이터 형식으로 암시적으로 변환할 수 있습니다.
Option Strict Off
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
aString = sampleColl.Item(1)
Catch ex As Exception
' Insert code to run if the collection item cannot be converted to String.
End Try
개체에서 명시적으로 변환
Option Strict가 On인 경우 요소를 Object에서 런타임 데이터 형식으로 명시적으로 변환해야 합니다. 이런 방법으로 Item에서 요소를 가져오려면 다음 예제와 같이 CType 함수(Visual Basic)를 사용하여 변환을 수행하면 됩니다.
Option Strict On
Dim sampleColl As New Microsoft.VisualBasic.Collection()
Dim sampleString As String = "This is a string"
Dim aString As String
sampleColl.Add(sampleString)
' The following statements convert the collection item to a string.
Try
aString = CType(sampleColl.Item(1), String)
Catch ex As Exception
' Insert code to run if the collection item cannot be converted to String.
End Try
추가 서비스
Collection 개체의 속성 및 메서드는 컬렉션에 가장 기본적인 서비스만 제공합니다. 예를 들어, Add 메서드로는 컬렉션에 추가되는 요소의 형식을 확인할 수 없지만, 컬렉션에 요소가 한 가지 형식만 포함되도록 하려는 경우에는 이러한 확인 작업이 필요합니다. Add 메서드에 요소가 한 가지 형식만 포함되어 있음이 확실한 경우에는 강력한 형식의 컬렉션이 있으며 Item 속성에서 반환된 값을 런타임 데이터 형식으로 변환하지 않아도 됩니다. 따라서 성능이 향상됩니다.
방법: 클래스에서 컬렉션 정의(Visual Basic)에 설명된 대로 고유한 컬렉션 클래스를 만들면 추가 속성, 메서드, 이벤트와 같은 보다 강력한 기능을 제공할 수 있습니다.