C# 강좌 18편. 컬렉션(Collection)
1. 컬렉션(Collection)
우리가 이번 강좌에서 배우게될 '컬렉션(Collection)'이 뭐하는 녀석인지 간단히 알아봅시다. 컬렉션은 데이터의 검색과 저장을 위해 특화된 것이라고 말할 수 있습니다. 자료구조(Data Structure) 라고도 말할 수 있습니다. 컬렉션에서는 배열 리스트(Array List), 해시 테이블(Hash table), 큐(Queue), 스택(Stack) 등을 지원합니다. 하나하나 다 설명하다보면 강좌가 끝도 없이 길어질 것 같아, 간략하게 설명하겠습니다.
2. 배열 리스트(ArrayList)
배열 리스트란 배열과 가장 비슷하면서도 크기가 유연(동적)합니다. 배열 리스트에는 Add, BinarySearch, Clear, Contain, Insert, Remove, Sort.. 등등이 있으나 중요한 메소드를 기준으로 설명드리려고 합니다. Add, Insert, Remove 메소드에 대해서 설명드리겠습니다.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication36 { class Program { static void ShowArrayList(ArrayList list) { foreach (object obj in list) Console.Write("{0} ", obj); Console.WriteLine(); } static void Main(string[] args) { ArrayList alist = new ArrayList(); for (int i = 0; i < 10; i++) alist.Add(i); Console.WriteLine("alist:"); ShowArrayList(alist); alist.Remove(5); alist.Insert(5, 20); ShowArrayList(alist); } } }
결과:
alist:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 20 6 7 8 9
계속하려면 아무 키나 누르십시오 . . .
코드를 보시면 12~17행에서 ShowArrayList라는 메소드가 정의되었습니다. 매개변수로는 ArrayList 객체를 받죠. 이 객체를 받고 나서는 foreach문을 통해 요소를 하나하나 출력시킵니다. 그다음에 메인 메소드 내부를 보면, alist라는 객체가 만들어졌고 Add 메소드를 통해 요소를 추가합니다. (ArrayList도 배열과 똑같게 인덱스가 0부터 시작합니다.) 그리고 28~29행을 보시면 Remove와 Insert라는 메소드가 쓰였는데, 말 그대로 Remove는 요소를 제거하는데에 쓰입니다. 5라고 적으면, 6번째 요소가 삭제되는거죠. Insert문은 요소 삽입인데, 29행을 보면 5번 인덱스에 20을 삽입하라는 말이 됩니다. 그럼 Remove 메소드로 인해 5가 제거되고, Insert 메소드로 인해 4와 6 사이에 20이란 수가 끼어드는 것입니다.
이 밖에도, 모든 요소를 지워버리는 Clear, 요소의 순서를 뒤바꾸어 버리는 Reverse, 정렬하는 Sort, 이진 검색 BinarySearch 등 여러가지 메소드가 있으니 한번 사용해 보시는것도 좋을것 같습니다.
MSDN: http://msdn.microsoft.com/ko-kr/library/system.collections.arraylist(v=vs.80).aspx
3. 해시 테이블(Hashtable)
이번에는 해시 테이블입니다. 해시 테이블은 키와 값을 가진 요소를 다루는 사전 구조로 이루어져 있으며, 빠른 검색을 목적으로 최적화 되었습니다. 그리고 사용하기도 상당히 편리합니다. 메소드에는 Add, Clear, Contains, CopyTo, Remove, GetHash.. 등, 배열 리스트와 같이 메소드가 상당히 다양합니다. 이제 한번 코드를 볼까요?
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication36 { class Program { static void Main(string[] args) { Hashtable table = new Hashtable(); table.Add("사과", "apple"); table.Add("토마토", "tomato"); table["감자"] = "potato"; foreach (object obj in table.Keys) Console.WriteLine("{0}: {1}", obj, table[obj]); } } }
결과:
감자: potato
사과: apple
토마토: tomato
계속하려면 아무 키나 누르십시오 . . .
코드를 보시면, 여태까지 인덱스를 이용해서 접근한 방법과 달리 키(Key)로 접근하는 부분이 너무 생소하죠? 16~17행을 보시면 Add 메소드를 통해 Hashtable에 추가시키고 있는데, 여기서 사과는 키(Key)고, apple는 값(Value) 입니다. 20~21행은 table.Keys로 Hashtable의 키를 포함하는 컬렉션을 가져옵니다.
MSDN: http://msdn.microsoft.com/ko-kr/library/system.collections.hashtable(v=vs.80).aspx
4. 큐(Queue)
큐(Queue)를 설명하자면, 우리가 영화를 볼때 영화관에 가서 표를 끊으려고 사람들이 줄을 서서 기다리죠. 이때 사람들의 줄을 큐라고 말하기도 합니다. 네이버에서 Queue를 검색해보면, Queue가 "1. (무엇을 기다리는 사람・자동차 등의) 줄 2. 큐, 대기 행렬 3. 줄을 서서 기다리다" 라는 뜻을 지니고 있음을 알 수 있습니다.
<큐(Queue)>
이 큐(Queue)는 선입선출(First-In, First-Out, FIFO)이라는 특징을 지니고 있습니다. 먼저 들어온 데이터가 먼저 나간다는 의미입니다. 한마디로 표를 끊고 나가고 그다음 사람이 오는것과 같습니다. 이제 한번 큐에서 쓰이는 메소드를 한번 보도록 합시다.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication36 { class Program { static void Main(string[] args) { Queue queue = new Queue(); queue.Enqueue("one"); queue.Enqueue("two"); queue.Enqueue("three"); queue.Enqueue("four"); while (queue.Count > 0) Console.WriteLine("Dequeue: {0}, Count: {1}", queue.Dequeue(), queue.Count); } } }
결과:
Dequeue: one, Count: 3
Dequeue: two, Count: 2
Dequeue: three, Count: 1
Dequeue: four, Count: 0
계속하려면 아무 키나 누르십시오 . . .
코드의 16~19행을 보시면 Enqueue라는 메소드가 등장합니다. Enqueue 메소드는 요소를 추가하는 녀석입니다. 요소는 반드시 뒤에서부터 들어옵니다. 그럼 one, two, three, four 이렇게 있겠죠? 21행~23행을 보시면 while문으로 queue.Count가 0과 같아지는 순간 루프를 빠져나옵니다. 그리고, 저기에서 Dequeue 메소드를 볼 수 있는데, Dequeue 메소드는 맨 첫번째 요소를 내보내고 그 다음째 요소가 앞으로 옵니다. queue.Count는 남아있는 데이터의 수라는 것은 쉽게 알수 있죠? (추가로 Peek 메소드는 요소를 제거하지 않고 그대로 반환합니다.)
MSDN: http://msdn.microsoft.com/ko-kr/library/system.collections.queue(v=vs.80).aspx
5. 스택(Stack)
자. 이제 마지막으로 스택입니다. 스택은 한쪽 방향으로만 쌓는 자료구조라고 말할수 있으며, 중간에 데이터를 삽입할 수 있는 ArrayList과는 달리, 스택은 제일 위에서만 추가할 수 있습니다. 아까 본 Queue의 특징 중 하나인 FIFO완 다르게 후입선출(Last-In First-Out)이라고 할 수 있습니다. 마치 쌓여있는 책을 스택(Stack)라고 부를 수도 있겠죠?
<스택(Stack)>
중간에 삽입할 수도 없고, 무작위로 제거할 수도 없습니다. 오로지 제일 위에 쌓인 데이터부터 처리해야 합니다.
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication36 { class Program { static void Main(string[] args) { Stack Book = new Stack(); Book.Push("거침없이 배우는 Unity 3D"); Book.Push("악성코드와 멀웨어 포렌식"); Book.Push("강행돌파! 입문자를 위한 아이폰 & 아이패드 앱 개발"); Book.Push("오라클 엑사데이터 Oracle Exadata"); while (Book.Count > 0) Console.WriteLine(Book.Pop()); } } }
결과:
오라클 엑사데이터 Oracle Exadata
강행돌파! 입문자를 위한 아이폰 & 아이패드 앱 개발
악성코드와 멀웨어 포렌식
거침없이 배우는 Unity 3D
계속하려면 아무 키나 누르십시오 . . .
여기서 데이터를 추가할때는 Push 메소드를 사용하고, 데이터를 꺼낼때는 Pop 메소드를 사용합니다. 그리고 Peek 메소드 역시 Queue의 Peek 메소드와 동일합니다. 16~19행을 보시면 책을 순서대로 쌓다가(Push), 21~22행에서 책을 차례대로 꺼냅니다.(Pop)
MSDN: http://msdn.microsoft.com/ko-kr/library/system.collections.stack(v=vs.80).aspx
위를 보시면, 이제까지 해시 테이블, 배열 리스트, 큐, 스택을 설명해드렸는데, 이것은 아주 간략하게 설명한 것이고, 실제로는 이것들을 자세히 다루는 책까지 있을 정도로 내용이 방대합니다. 만약에 읽으시다, 이해가 안가시는 부분이 있으시면, 제가 추가 설명을 덧붙이도록 하겠습니다.
오늘 강좌는 여기서 마치겠고, 보느라 수고하셨습니다.
다음 강좌는 델리게이트(Delegate)에 대해 알아보도록 하겠습니다.