[C#] 컬렉션 간단하게 살펴보기
컬렉션Collection은 데이터의 모음을 담는 자료구조를 말하며 배열Array도 컬렉션의 일원이다.
( System.Array 클래스의 구조를 보면 컬렉션 클래스들이 상속받는 ICollection을 상속받았음을 확인할 수 있다. )
컬렉션의 몇 가지 클래스들을 살펴봤다.
1. ArrayList
2. Queue
3. Stack
4. Hashtable
정처산 시험을 준비할 때 공부했던 자료구조형이라 낯설지만은 않다.
자바에서도 거의 비슷한 자료구조를 썼던 거 같은데 다 까먹음;;
using System.Collections;
컬렉션을 쓸 땐 System.Collections 네임스페이스를 사용해 주고~ ( 근데 Array도 컬렉션의 일원인데 왜 걔만 System.Collections 선언 안 해도 쓸 수 있지? C에서부터 쓰는 자료형이라 기본적으로 System 네임스페이스에 들어가 있나? )
ArrayList list = new ArrayList(); list.Add('a'); list.Add('b'); list.RemoveAt(0); list.Add('c'); list.Insert(0, 'A'); foreach(object c in list) { Console.WriteLine($"{c}"); }
ArrayList는 배열처럼 컬렉션 요소에 접근할 때 [] 연산자를 사용한다.
다만, 배열과는 달리 용량이 자동으로 조정된다.
Add()는 컬렉션의 마지막 요소 다음 인덱스에 새 요소를 추가하고,
RemoveAt()은 특정 인덱스에 있는 요소를 제거하고,
Insert()는 특정 인덱스에 새 요소를 삽입한다.
따라서 위 코드에서 a, b를 넣고 a를 제거한 다음 c를 추가할 때 c는 a의 빈자리가 아닌 b의 다음 자리에 들어가게 된다.
출력값:
A
b
c
Queue que = new Queue(); que.Enqueue('a'); que.Enqueue('b'); while (que.Count > 0) Console.Write($"{que.Dequeue()} ");
Queue는 선입선출 자료구조다.
Enqueue()로 자료를 추가하고, Dequeue()로 내뱉는다.
Stack st = new Stack(); st.Push('a'); st.Push('b'); while (st.Count > 0) Console.Write($"{st.Pop()} ");
Stack은 선입후출이다.
쌓아 놓은 책처럼 먼저 쌓은 게 제일 밑으로 가고 꺼낼 때는 위에 있는 거부터 꺼낸다.
Hashtable hash = new Hashtable(); hash["열"] = 10; hash["스물"] = 20; Console.WriteLine(hash["열"]); Console.WriteLine(hash["스물"]);
Hashtable은 키Key와 값Value의 한 쌍으로 이루어진 자료형이다.
배열처럼 [] 연산자를 사용하지만 인덱스가 아니라 키를 사용한다는 점이 특징이다. 거기다 키로는 무려 클래스(!!)를 비롯한 어떤 자료 형식도 사용할 수 있다.
또한 해싱( 키를 이용해 바로 데이터의 컬렉션 주소를 찾는 방법)을 사용해 배열과 비슷한 탐색 속도를 낸다고 한다.
( 해싱도 수업에서 들었는데 기억이... 어렴풋이 오류 검출 방법을 배울 때 들었던 단어 같다.)
그런데 ArrayList, Stack, Queue, Hashtable은 C의 struct처럼 여러 자료형을 사용할 수 있다. 배열은 같은 자료형으로만 만들 수 있는데...
장점이기는 한데 물론 단점도 존재한다.
이 친구들은 매개변수로 object 형식을 받는다. 즉, int나 char형식을 넣으면 박싱Boxing이 되고 꺼낼 때는 언박싱Unboxing이 이루어진다는 소리다. 덕분에 배열보다 리소스를 더 많이 잡아먹는다. 다루는 데이터가 커질 수록 사용해기 무서워지니 일반화 컬렉션을 사용해서 문제를 해결하자.
댓글
댓글 쓰기