반응형




프로그램을 하다 보면 모든 것이 Collection 개념입니다.

배열은 당연히 그렇고 SQL 의 테이블, 탐색기, XML 등등..

 

.NET Framework에서 제공하는 기본 Collection 들의 제네릭 버전을 사용하기 위해서는

using System.Collections.Generic; 네임스페이스를 선언해야 합니다.

 

그럼 기본 Collection 중 제네릭 개념의 Collection을 봅시다. ( 같은 기능을 합니다. Generic 버젼이죠 )

    비 제네릭

 제네릭

 비고

 ArrayList

 List<T>

 동적 배열, 처음값:0, 일차원

 Hashtable

 Dictionary<K,V>

 Key와 Value를 쌍으로 저장하는 객체

 SortedList

 SortedList<K,V>

 Key를 기준으로 sorting 되어 관리하는 객체

 Stack

 Stack<T>

 선입후출 : 먼저 들어간 값이 나중에 나오는 객체 

 Queue

 Queue<T>

 선업선출 : 먼저 들어간 값이 먼저 나오는 객체

뭐 이것 말고 몇가지 더 있습니다. 비 제네릭과 제네릭에서 있는 것만..^^;;

인터페이스도 있고.. 뭐 기회가 되면 또 하기로 하고요.

 

이렇게 컬렉션(Collection) 들이 제네릭을 많이 사용합니다. ( 생각해 보면 그러겠죠. 데이터를 넣다 뺐다 해야 되니.. )

 

그럼 하나씩 봅시다. 예제는 제너릭 Collection만 구현 할것입니다. 비 제네릭의 경우는 뭐 특별히 기술은 안하려고요.

은근 캡처가 힘들기도 하고 2개 다 사용방법도 거의 같습니다.

 

1. ArrayList, List<T>

 

배열을 선언할때 미리 크기를 지정하여 사용하였으나 이 구조는 동적으로 배열을 구성할 수 있습니다. ( 편하겠군요 ^^ )

Add,Insert 메소드로 동적으로 데이터가 저장될 수 있습니다.

Remove,RemoveAll,RemoveAt 으로 데이터를 지울 수 있습니다.

배열이니 0 부터 시작합니다.

 

각 메소드에 대해 함 보시면 됩니다.

Remove 메소드는 같은 데이터가 2개이상이 있어도 앞의 한개만 지우는것을 볼수 있습니다.

Capacity 메소드의 경우는 배열의 크기를 볼수 있는데 배열 데이터의 갯수를 보여주는 count 하고는

개념이 틀린겁니다.

 

List 클래스가 동적배열을 할당한다고 했는데 내부에는 미리 배열의 크기를 지정해 놓고 있는겁니다.

배열 데이터의 갯수에 따라 말이죠. 생성시점에 크기는 0으로 지정됩니다 ( 메모리 효율적인듯 하네요 ㅎㅎ )

데이터가 들어오면 4로 지정되고

갯수가 4를 초과하면 크기가 8로, 그 이상이면 16,32 등으로 할당 됩니다.

 

여기선 데이터가 5이니 8로 나오는 군요. ( ArrayList는 초기 할당이 틀립니다. 16부터 입니다 )

 


결과입니다.

뭐 각 메소드들의 0,1 이렇게 잡는 것이 헷깔리시면 그때, 그때 마다 도움말 보시면 됩니다.

저도 뭐..ㅎㅎ

 

 

2. Hashtable,Dictionary<K,V>

 

Dictionary는 Hashtable의 제네릭 버젼입니다.

데이터가 key와 value 한쌍으로 저장되는 Collection 구조입니다.

 

key값은 유일해야 합니다. ( 유일성이 보장되어야 합니다. )

Key 값으로 찾으니 빠른 검색을 할 수 있습니다.

 

Key 와 Value 의 한쌍으로 구성된 Collection 이니 가져오는 방법이나 사용방법도 List 클래스는 차이가 있겠죠.

함 소스 코드를 보시기 바랍니다. ( 넘 말들이 무미건조해 지는듯.. 계속 반복되는 작업에..^^;; )

 

 

결과입니다.


 

 

3. SortedList, SortedList<K,V>

 

이름이 제네릭 버젼과 같습니다. 물론 두개의 네임스페이스는 틀립니다. 뭐 위의 Collection 들도 제너릭버젼과 당연 틀리겠죠.

 

SortedList<K,V>도 Dictionary<K,V> 처럼 Key 와 Value 가 한쌍으로 구성되어 있습니다.

Dictionary 와 사용 방법은 거의 동일합니다.

 

Dictionary 클래스에 Key 값 기준으로 정렬이 되는 것이 특징입니다. 알아서 정렬해 준다는 참 친절한..

 

뭐 기본 사용법만 나열하겠습니다. 다른 내용이 필요하면 도움말로..^^;;

 

예제는 Dictionary 와 SortedList 차이점을 보도록 하겠습니다. Key = 2 를 제일 나중에 추가 하고 배열된 순서대로 찍어 보도록 합니다.

그리고 SortedList는 List가 가지고 있던 동적배열 크기 할당 속성도 가지고 있네요. ( Capacity 항목이 있습니다. )

 


역시 이름에 걸맞게 젤 뒤어 추가해도 Key 값에 정렬되어 나오는 군요. 
Dictionary 는 추가한 순서대로 나오는걸 확인 할수 있습니다.


 

 

4. StackStack<T>

 

참 많이 들어본 키워드 입니다. 앞에 박싱 언방싱 할때 Value Type(값 타입) 개체들이 메모리에 사용되는 방식이죠.

한글로 "쌓다" 라는 단어입니다.

차근 차근 쌓아놓고 있으니 뺄때도 나중에 쌓은 것을 먼저 뺴야죠. 먼저 아래에 넣은 걸 뺴면 무너집니다.

LIFO(Last In First Out) 개념입니다.

 

자 또 봅시다. 계속 만드니 약간 귀찮아 질려는...쩝.. 그래도 몇개 안남았으니 열심히 해보겠습니다.

 

stack 은 Add/Remove 메소드가 아닌 Push/Pop으로 데이터를 넣고 빼고 합니다.

Pop() 메소드는 제일 위에 있는 데이터를 삭제하고

Peek() 메소드는 제일 위에 있는 데이터를 불러옵니다.

 

이러한 형태는 우리가 웹브라우져에서 앞으로 뒤로 가기 하면 최근 항목이 나오는데 그런 방식에 유용합니다.

 


역시 결과가 잘 나옵니다.

뭐 하나 하나 씩 살펴 보시면 됩니다.

 

스택 오버 플로워(StackOverFlow) 는 Stack 이 꽉 찼을때 발생합니다.

 

 

5. QueueQueue<T>

 

Queue는  Stack 과 상반되는 내용입니다. 먼저 들어간 것이 먼저 나오는 거죠FIFO(First In First Out) 라 표현 됩니다.

예를 들면 메일, 프린터 등과 같은 곳에서 사용 됩니다.

 

Queue는 Enqueue 로 값을 넣고 하나씩 Dequeue 로 값을 뺴 내면서 데이터를 없애는 식의 작업을 합니다. 

보시면 Enqueue / Dequeue 를 제외하곤 사용이 Stack 과 비슷하니 이해하기는 쉬울듯 하네요.

 


역시 잘 나오죠 ^^

그 외에 제네릭 버젼에만 있는 LinkedList<T>, ReadOnlyCollection<T>,KeyedCollection(K,V) 등은 추후에 다시 기술 하도록 하겟습니다.

 

Collection 에서 제네릭은 박싱/언박싱 에 따른 부하도 감소 할 수 있지만

미리 타입을 지정함으로써 잘못된 코드들에 대한 검증도 컴파일 단계에서 알 수 있게 해줍니다.

오류를 감소 시켜주는 거죠.

 

이번 시간엔 Collection 에 대한 예제만 보여드렸습니다. ( 개인적으론 약간 지루한.. ^^;; )

 

다음 시간엔 제너릭이 다른 형식으로 쓰이는 부분에 대해 말씀드리도록 하겠습니다.

 

수고 하십시요

 


반응형

+ Recent posts