A. 컬렉션(Collection)
같은 성격을 띄는 데이터의 모음을 담는 자료구조를 말한다.
.NET 프레임워크는 배열외에도 다양한 컬렉션을 제공하며, 대표적으로 4가지가있다.
1. ArrayList 2. Queue 3. Stack 4. Hashtable
1. ArrayList
배열과 비슷하게 동작하지만, 차이점은 용량을 미리 지정할 필요없이 자동으로 용량이 늘어나거나 줄어든다.
- Add() : 컬렉션의 마지막에 요소를 추가한다.
- RemoveAt() : 특정 인덱스의 요소를 제거한다.
- Insert() : 원하는 위치에 새 요소를 삽입한다.
ArrayList list = new ArrayList();
list.Add(10);
list.Add(20);
list.Add(30);
list.RemoveAt(1); //20을 삭제
list.Insert(1,25); //25를 1번 인덱스에 삽입
2. 큐 (Queue)
Queue 자료구조는 데이터나 작업을 차례대로 입력해뒀다가 순서대로 하나씩 꺼내 처리하기 위해 사용된다.
입력은 오직 뒤에서, 출력은 앞에서만 이뤄지는것이 특징이다.
- Enqueue() : Queue의 마지막에 데이터를 입력한다.
- Dequeue() : Queue의 제일앞의 항목이 출력되고 사라진다.
Queue que = new Queue();
que.Enqueue(1);
que.Enqueue(2);
que.Enqueue(3);
while (que.Count>0)
Console.WriteLine(que.Dequeue());
3. 스택 (Stack)
Queue와는 반대로 먼저들어온 데이터가 나중에 나가고, 나중에 들어온 데이터가 먼저 나가는 구조의 컬렉션이다. (First In Last Out)
- Push() : Stack의 위에 데이터를 쌓는다.
- Pop() : Stack의 위에 데이터를 꺼낸다.
Stack stack = new Stack();
stack.Push(1);
stack.Push(2);
stack.Push(3);
int a = (int)stack.Pop(); //이후 최상위 데이터는 2
4. 해시 테이블 (Hashtable)
Hashtable은 키와 값의 쌍으로 이뤄진 데이터를 다룰 때 사용한다. 사전이 가장 좋은 예.
- 해시테이블의 장점
배열과 비교하면 배열은 데이터요소의 지정위치로 인덱스를 사용하지만, Hashtable 컬렉션은 키 데이터를 그대로 사용한다. 즉 int, float, 클래스 등 모든 형식이 키로 사용될수있다. (편의성)
또한, 배열에서 인덱스를 이용해 배열요소에 접근하는것에 준하는 탐색속도를 가진다.
ArrayList에서 원하는 데이터를 찾으려면 컬렉션을 정렬해서 이진탐색을 수행하거나 순차적으로 리스트를 탐색해야하지만, Hashtable은 키를 이용해서 단번에 데이터가 저장된 컬렉션 내의 주소를 계산해낸다. 이 작업을 해싱(Hashing)이라고 하는데 Hashtable의 이름은 이 알고리즘에서 유래한 것이다. (빠른 탐색속도)
Hashtable ht = new Hashtable();
ht["book"] = "책";
ht["cook"] = "요리사";
ht["tweet"] = "지저귀다";
Console.WriteLine(ht["book"]); //책
Console.WriteLine(ht["cook"]); //요리사
Console.WriteLine(ht["tweet"]); //지저귀다
B. 컬렉션의 초기화
1. ArrayList, Queue, Stack의 초기화
컬렉션의 생성자를 호출할때 매개변수로 배열 객체를 넘기면 초기화를 간단하게 수행할수있다.
int[] arr={123,456,789};
ArrayList list = new ArrayList(arr); //123,456,789
Stack stack = new Stack(arr); //789,456,123
Queue queue = new Queue(arr); //123,456,789
+) ArrayList는 배열의 도움없이 직접 컬렉션 초기자를 이용해서 초기화가 가능하지만, Stack과 Queue는 컬렉션 초기자를 사용할수없다.
컬렉션 초기자는 IEnummerable(열거가능한) 인터페이스, Add() 메소드를 구현하는 컬렉션만 지원하는데 Add() 메소드를 구현하지 않기때문에 사용불가능.
ArrayList list2 = new ArrayList(){11,22,33}; //컬렉션 초기자는 생성자 호출시
//{와 }사이에 컬렉션 요소의 목록을 입력해서 사용한다.
2. Hashtable의 초기화
컬렉션 초기자와 비슷하게 생긴 딕셔너리 초기자(Dictionary Initializer)를 이용한다.
Hashtable ht = new Hashtable()
{
["하나"] =1, // ;가 아니라 ,를 이용하여 항목을 구분한다.
["둘"] =2,
["셋"] =3
}
+) 컬렉션 초기자를 사용할수 있지만, 쓰기도 편하고 읽기도 쉬운 딕셔너리 초기자의 사용이 권해진다.
'C# 공부 > C# 기본 문법' 카테고리의 다른 글
일반화(Generic) 프로그래밍 (일반화 메소드/클래스, 형식매개변수 제약, 일반화 컬렉션) (1) | 2020.07.28 |
---|---|
인덱서 (인덱서의 선언과 사용, foreach가 가능한 객체 만들기) (0) | 2020.07.26 |
배열 (선언 및 사용, 초기화, System.Array 클래스, 2차원/다차원 배열, 가변배열) (0) | 2020.07.26 |
프로퍼티 - 2 (인터페이스의 프로퍼티, 추상 프로퍼티) (0) | 2020.07.26 |
프로퍼티 - 1 (구현과 사용법, 자동구현 프로퍼티, 프로퍼티와 생성자, 무명형식) (0) | 2020.07.26 |