VB.NET 2008/Visual Basic 2008

컬렉션 개체 (개체 배열)

본클라쓰 2011. 4. 18. 09:46

 

컬렉션 개요

 

컬렉션은 관련된 개체를 그룹화하고 관리하는 데 사용되는 개체입니다. 예를 들어, 모든 Form에는 컨트롤 컬렉션이 있습니다. 폼의 Controls 속성을 통해 이 컬렉션에 액세스할 수 있습니다. 이 컬렉션은 해당 폼의 모든 컨트롤을 나타내는 개체입니다. 이 컬렉션을 사용하면 해당 인덱스로 컬렉션의 컨트롤을 검색하고 For Each ... Next 문을 사용하여 컬렉션의 요소 전체를 반복할 수 있습니다.

 

Visual Basic에서는 사용자 컬렉션을 정의하고 만드는데 사용할 수 있는 Collection 클래스를 제공합니다. 폼의 Controls 컬렉션처럼 Collection 클래스도 For Each ... Next 를 사용하여 요소 전체를 반복하고 인덱스로 요소를 검색할 수 있는 기능을 기본적으로 제공합니다.

  

Visual Basic에서 컬렉션은 .Net Framework 컬렉션과 Visual Basic 컬렉션 두 종류가 있습니다. 이 두 종류는 컬렉션이 서로 호환되지 않습니다. 예를 들어 다음 코드는 컴파일러 오류를 발생시킵니다.

 

Dim localControls As Collection

' The following line generates as Compiler error.

localcontrols = Me.Controls()

 

 

Me.Controls 컬렉션은 .Net 컬렉션인 반면 LocalControls 는 Visual Basic 컬렉션이기 때문에 컬렉션이 호환되지 않습니다. 두 컬렉션은 서로 다른 클래스에서 구현됩니다. 두 컬렉션은 메소드가 비슷하지만 같지 않고 해당 인덱스 체계가 다릅니다. 컬렉션은 시작 인덱스에 따라 0부터 시작하거나 1부터 시작할 수 있습니다. 전자의 경우 컬렉션에 있는 첫 번째 항목의 인덱스가 0이고 후자의 경우는 1입니다.  .Net 컬렉션은 0부터 시작하는 컬렉션이고, Visual Basic 컬렉션은 1부터 시작하는 컬렉션입니다.

 

1부터 시작하는 컬렉션은 인덱스 범위가 1부터 Count 속성까지이고 컬렉션에 있는 항목의 수를 반환하기 때문에 Visual Basic 컬렉션이 사용자가 보다 쉽게 사용할 수 있습니다. 이와 반대로 0부터 시작하는 컬렉션은 인덱스가 0부터 Count 속성 값보다 하나 적게 사용됩니다. 이 컬렉션은 인덱스 값이 기준 값의 오프셋이거나 0부터 시작하는 열거형의 멤버에 해당하는 경우에 적합하다.

 

 

 

 

컬렉션과 배열의 비교

 

배열은 비교적 유연하지 못한 구조입니다. 런타임에 배열의 크기를 변경하려면 ReDim 문을 사용하여 배열을 다시 선언해야 합니다. 배열의 모든 요소는 동일한 형식을 가져야 하며, 모든 요소들을 순차적으로 처리하고, 비어 있는 배열 요소가 존재할 수 있습니다. 이러한 이유로 배열은 강력한 형식의 개체를 고정된 수 만큼 만들고 이러한 개체를 작업할 때 상당히 유용합니다.

 

하지만 컬렉션을 사용하면 배열보다 더 유연하게 개체 그룹에 대해 작업할 수 있습니다. 컬렉션은 클래스에 해당하므로 컬렉션에 요소를 추가하려면 먼저 새 컬렉션을 선언해야 합니다. 배열과 달리 컬렉션에서는 응용 프로그램의 요구 변화에 따라 사용하는 개체의 그룹이 동적으로 증가하거나 줄어들 수 있습니다. 컬렉션에 추가한 개체의 키를 할당하여 해당 키에 따라 개체를 검색하고 조작할 수 있습니다.

 

컬렉션은 응용 프로그램이 동적으로 만들거나 삭제해야 하는 개체를 추적하는 좋은 방법입니다. 다음 코드는 Visual Basic 컬렉션 개체에 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

 

 

 

 

 

컬렉션의 요소 접근

 

컬렉션에 요소를 추가, 삭제 및 검색하는 기본 서비스에는 키 및 인덱스가 사용됩니다. 키는 String 값으로 이름, 운전 면허 번호, 전화번호 또는 단순히 문자열로 변환된 정수가 될 수 있습니다. Add 메서드를 사용하면 키와 요소를 연결할 수 있습니다.

 

Collection 개체의 인덱스는 1과 컬렉션에 있는 항목 수 사이의 정수입니다. Count 속성은 현재 항목 수를 반환합니다. Add를 호출할 때 Before 와 After 매개 변수를 사용하여 항목 인덱스의 초기 값을 제어할 수 있지만 해당 인덱스 값은 다른 항목이 추가 및 삭제될 때 변경될 수 있습니다.

 

Remove 메서드에 키 또는 인덱스를 전달하여 컬렉션에서 단일 요소를 제거할 수 있습니다. Clear 메서드를 사용하여 컬렉션을 비우고 모든 요소를 제거할 수 있습니다. 

 

Contains 메서드에 키 값을 전달하여 컬렉션에 해당 키가 있는 요소가 포함되어 있는지 여부를 테스트할 수 있습니다. Item 속성에 키 또는 인덱스를 전달하여 요소를 검색할 수 있습니다.

 

인덱스 값과 Item 속성을 사용하여 컬렉션의 항목을 반복하거나 For Each ... Next 문을 사용할 수 있습니다. 다음 예제는 employee 개체 컬렉션의 모든 직원에서 10%의 임금 인상을 제공하는 두 가지 방법을 보여 줍니다. 

 

' The following alternative uses the count and item properties.

Dim emp As Employee

 

For counter As Integer = 1 To EmployeeColl.Count

    emp = CType(EmployeeColl.Item(counter), Employee)

    emp.payRate *= 1.1

Next counter

 

' The following alternative uses the For Each...Next statements.

For Each emp As employee In EmployeeColl

    emp.payRate *= 1.1

Next emp

 

 

 

 

ArrayList

 

네임스페이스 및 어셈블리 : System.Collection (mscorlib.dll)

 

 

ArrayList 클래스는 크기가 필요에 따라 동적으로 증가되는 배열을 사용하여 IList 인터페이스를 구현합니다. ArrayList 용량은 ArrayList가 보유할 수 있는 요소의 수입니다. 요소가 ArrayList에 추가될 때 필요하면 재할당을 통해 용량이 자동으로 증가됩니다. TrimToSize를 호출하거나 Capacity 속성으로 명시적으로 설정하여 용량을 줄일 수도 있습니다.

 

이 컬레션에 있는 요소는 정수 인덱스를 사용하여 액세스할 수 있습니다. 이 컬렉션의 인덱스는 0부터 시작합니다. ArrayList는 Nothing을 유효한 값으로 받아들이지만 중복을 허용하지 않습니다.

 

다음 예제는 ArrayList에 값을 할당하고 반복을 통해 값을 출력하는 예제입니다.

 

Dim arr As ArrayList = New ArrayList()

arr.Add("Hellow")

arr.Add("World")

 

For Each i In arr

    Console.write(" {0}", i)

End For

 

 

중요 메소드

메소드

설명

Add(Object)

개체를 ArrayList 의 끝 부분에 추가합니다.

Clear()

ArrayList에서 요소를 모두 제거합니다.

Clone()

ArrayList의 단순 복사본을 만듭니다.

Contains(Object)

요소가 ArrayList에 있는지 여부를 확인합니다.매개 변수로 Nothind이 될 수도 있습니다.

Insert(int Index, Object)

ArrayList의 지정된 인덱스에 요소를 삽입합니다.

Remove(Object)

ArrayList에서 맨 처음 발견되는 특정 개체를 제거합니다.

RemoveAt(int Index)

ArrayList의 지정한 인덱스에서 요소를 제거합니다.

TrimToSize

용량을 ArrayList의 실제 요소 수로 설정합니다.

 

 

 

속성

속성

설명

Capacity

ArrayList에 포함될 수 있는 요소의 수를 가져오거나 설정합니다.

Count

ArrayList에 실제로 포함된 요소의 수를 가져옵니다.

Item

지정한 인덱스에 있는 요소를 가져오거나 설정합니다.

 

 

 

 

 

 

HashTable

 

네임스페이스 및 어셈블리 : System.Collections (mscorlib.dll)

 

 

HashTable은 키의 해시 코드에 따라 구성되는 키/값 쌍의 컬렉션을 나타냅니다. 요소는 HashTable에 추가될 때 키의 해시 코드에 따라 버킷에 배치됩니다. 키를 계속해서 조회하는 경우 해당 키의 해시 코드를 사용하여 특정 버킹 하나에서만 검색하므로 실제로 특정 요소를 찾는 데 필요한 키 비교 횟수가 줄어듭니다.

 

HashTable의 로드 비율에 따라 버킷과 요소의 최대 비율이 결정됩니다. 로드 비율이 작을수록 메모리는 더 많이 소모되지만 평균 조회시간은 빨리집니다. 일반적으로 기본 로드 비율 1.0은 적절한 속도와 크기를 제공합니다. HashTable을 만들 때 다른 로드 비율을 지정할 수도 있습니다.

 

요소가 HashTable에 추가되면 HashTable의 실제 로드 비율이 증가합니다. 실제 로드 비율이 지정된 로드 비율에 도달하면 HashTable의 버킷 수는 자동으로 현재 HashTable 버킷 수의 두 배가 넘는 최소의 소수로 증가합니다.

 

키는 Nothing일 수 없으나 값은 Null일 수 있습니다. HashTable의 용량은 HashTable에 보유할 수 있는 요소의 수입니다. 요소가 HashTable에 추가될 때 필요하면 재할당을 통해 용량이 자동으로 증가됩니다. 또한 컬렉션에 종류가 다른 개체를 삽입해도 문제가 없습니다.

 

For Each 문은 컬렉션에 있는 각 요소의 형식을 필요로 합니다. HashTable의 각 요소가 키/값 쌍이므로 요소 형식은 키의 형식도, 값의 형식도 아닙니다. 대신 요소 형식은 DictionaryEntry 입니다.

 

다음 예제는 해쉬테이블을 만들고 사용하는 방법입니다.

 

Dim ht As HashTable = New HashTable()

ht.Add("txt", "notepad.exe")

ht.Add("bmp", "paint.exe")

 

For Each d As DictionaryEntry In ht

    Console.write(d.Value)

Next

 

 

HashTable의 요소에 접근할 때는 키의 값으로 접근합니다. 위 예제에서 해쉬테이블의 요소에 접근하는 방법은 다음과 같습니다.

 

ht("txt") = "text.exe"

 

 

메소드

메소드

설명

Add

지정한 키와 값을 가지는 요소를 Hashtable에 추가합니다.

Clear

Hashtable에서 요소를 모두 제거합니다.

Contains

Hashtable에서 특정 키가 들어 있는지 여부를 확인합니다.

ContainsKey

Hashtable에서 특정 키가 들어 있는지 여부를 확인합니다.

ContainsValue

Hashtable에서 특정 값이 들어 있는지 여부를 확인합니다.

Remove

Hashtable에서 지정한 키를 가지는 요소를 제거합니다.

 

속성

속성

설명

Count

Hashtable에 포함된 키/값 쌍의 수를 가져옵니다.

Item

지정한 키와 관련된 값을 가져오거나 설정합니다.

 

 

 

 

 

HashTable의 정렬

 

HashTable의 아이템은 입력된 순서나 키의 값 순으로 정렬되어 For 문에 출력되지 않습니다. HashTable의 Key값을 기준으로 정렬하여 출력할 때는 SortedList 클래스를 사용합니다.

 

Dim sorter As SortedList = New SortedList(ht)

For Each i As DictionaryEntry In Sorter

    Console.WriteLine(i.Key)

Nex

 

또한, 키만 정렬할 경우에는 다음처럼 한다.

 

Dim sorter As ArrayList = New ArrayList(ht.keys)

sorter.Sort()