[C#] 컬렉션
컬렉션(collection)이란, 같은 성격을 띠는 데이터의 모음을 담는 자료 구조를 말합니다.
위의 설명에서 컬렉션만 배열로 한번 바꿔 보면 배열 설명과 정의가 같습니다.
그렇습니다! 배열도 .NET 프레임워크가 제공하는 다양한 컬렉션 자료 구조의 일부입니다.
.NET 프레임워크는 배열 말고도 멋진 컬렉션 클래스들을 여러 개 제공합니다. 그중 네 개를 살펴보며 컬렉션에 대해 설명을 붙이겠습니다.(。・∀・) ノ゙
- ArrayList
- Queue
- Stack
- Hashtable
코드 쓰기 전에 using System.Collections; 하는 거 잊지 말기!! ᕦ(ò_óˇ)ᕤ
1. ArrayList
ArrayList는 가장 배열과 닮은 컬렉션이라 할 수 있습니다. 컬렉션의 요소에 접근할 때는 [ ] 연산자를 이용하고, 특정 위치에 있는 요소에 데이터를 임의로 할당할 수도 있습니다.
다만, 컬렉션을 생성할 때 용량을 미리 지정할 필요가 없이 필요에 따라 자동으로 그 용량이 늘어나거나 줄어듭니다.
ArrayList에서 가장 중요한 메소드는 Add(), RemoveAt(), Insert() 이렇게 세 개입니다.
- Add(): 컬렉션의 가장 마지막에 있는 요소 뒤에 새 요소를 추가
- RemoveAt(): 특정 인덱스에 있는 요소를 제거
- Insert(): 원하는 위치에 새 요소를 삽입
using System;
using System.Collections;
class Program
{
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add(10);
list.Add("Hello");
list.Add(3.14);
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
list.Remove("Hello");
Console.WriteLine("\n");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
}
}
2. Queue
Queue는 선입선출(FIFO) 구조를 가진 컬렉션으로, 데이터를 순차적으로 저장하고 제거하는 데 사용됩니다.
Queue는 크기가 가변적이며, 요소의 추가 및 삭제가 상수 시간복잡도(O(1))로 이루어집니다.
Queue는 일반적으로 두 개의 메서드인 Enqueue()와 Dequeue()로 사용됩니다.
- Enqueue(): Queue의 끝에 새로운 요소를 추가합니다.
- Dequeue(): Queue의 맨 앞에서 요소를 제거하고 반환합니다.
또한 Peek() 메서드를 사용하여 Queue의 맨 앞에 있는 요소를 검색할 수 있습니다. Queue는 foreach 루프를 통해 반복할 수 있습니다.
Queue는 자료구조의 개념을 구현하는 데 자주 사용됩니다. 예를 들어, 작업 처리를 관리하거나 대기열에서 대기 중인 요청을 처리하는 데 사용할 수 있습니다.
using System;
using System.Collections;
class Program
{
static void Main(string[] args)
{
Queue queue = new Queue();
// Queue에 요소 추가
queue.Enqueue("apple");
queue.Enqueue("banana");
queue.Enqueue("cherry");
queue.Enqueue("durian");
// Queue에서 요소 제거 및 반환
object first = queue.Dequeue();
Console.WriteLine("Dequeue: " + first); // 출력 결과: Dequeue: apple
// Queue에서 요소 검색
object front = queue.Peek();
Console.WriteLine("Peek: " + front); // 출력 결과: Peek: banana
// Queue 순회
foreach (string item in queue)
{
Console.WriteLine(item);
}
/* 출력 결과:
banana
cherry
durian
*/
}
}
3. Stack
Stack은 후입선출(LIFO) 구조를 가진 컬렉션으로, 데이터를 역순으로 저장하고 제거하는데 사용됩니다.
Stack은 크기가 가변적이며, 요소의 추가 및 삭제가 상수 시간복잡도(O(1))로 이루어집니다.
Stack은 일반적으로 두 개의 메서드인 Push()와 Pop()으로 사용됩니다.
- Push(): Stack의 맨 위에 새로운 요소를 추가합니다.
- Pop(): Stack의 맨 위에서 요소를 제거하고 반환합니다.
또한 Peek() 메서드를 사용하여 Stack의 맨 위에 있는 요소를 검색할 수 있습니다. Stack은 foreach 루프를 통해 반복할 수 있습니다.
Stack은 자료구조의 개념을 구현하는 데 자주 사용됩니다. 예를 들어, 프로그램 실행 도중 함수 호출 스택을 구현하는 데 사용할 수 있습니다.
using System;
using System.Collections;
class Program
{
static void Main(string[] args)
{
Stack stack = new Stack();
// Stack에 요소 추가
stack.Push("apple");
stack.Push("banana");
stack.Push("cherry");
stack.Push("durian");
// Stack에서 요소 제거 및 반환
object top = stack.Pop();
Console.WriteLine("Pop: " + top); // 출력 결과: Pop: durian
// Stack에서 요소 검색
object peek = stack.Peek();
Console.WriteLine("Peek: " + peek); // 출력 결과: Peek: cherry
// Stack 순회
foreach (string item in stack)
{
Console.WriteLine(item);
}
/* 출력 결과:
cherry
banana
apple
*/
}
}
4. Hashtable
Hashtable은 키(key)와 값(value)의 쌍으로 이루어진 데이터를 다룰 때 사용합니다.
사전이 가장 좋은 예로, 가령 영어사전처럼 "book"을 키로, "책"을 값으로 입력하는 식입니다.
Hashtable은 내부적으로 해시 테이블을 사용하여 데이터를 저장하므로, 데이터의 검색 속도가 매우 빠릅니다.
배열과 다른 점은 배열은 데이터를 저장할 요소의 위치로 인덱스를 사용하는 반면에, Hashtable 컬렉션은 키 데이터를 그대로 사용합니다.
사용방법의 예로 아래 처럼 할 수도 있지만 더 좋은 방법으로는
using System;
using System.Collections;
class Program
{
static void Main(string[] args)
{
Hashtable ht = new Hashtable();
ht["하나"] = "one";
ht["둘"] = "two";
ht["셋"] = "three";
ht["넷"] = "four";
ht["다섯"] = "five";
Console.Write(ht["하나"]);
Console.Write(ht["둘"]);
Console.Write(ht["셋"]);
Console.Write(ht["넷"]);
Console.Write(ht["다섯"]);
}
}
Hashtable은 Add(), Remove() 및 Contains()와 같은 메서드를 사용하여 데이터를 추가, 제거 및 검색할 수 있습니다.
- Add(): 지정된 키와 값을 Hashtable에 추가합니다. 만약 Hashtable에 이미 해당 키가 존재한다면 ArgumentException 예외를 발생시킵니다.
- Remove(): 지정된 키와 값을 Hashtable에서 제거합니다.
- Contains(): 지정된 키가 Hashtable에 포함되어 있는지 여부를 반환합니다.
Hashtable은 IDictionary 인터페이스를 구현하므로 IDictionary 인터페이스의 다른 메서드와 함께 사용할 수 있습니다. 또한 Hashtable은 foreach 루프를 통해 반복할 수 있습니다.
다음은 C#에서 Hashtable을 생성하고 Add(), Remove(), Contains() 메서드를 사용하는 예시 코드입니다.
using System;
using System.Collections;
class Program
{
static void Main(string[] args)
{
Hashtable hashtable = new Hashtable();
// Hashtable에 요소 추가
hashtable.Add("apple", 1);
hashtable.Add("banana", 2);
hashtable.Add("cherry", 3);
hashtable.Add("durian", 4);
// Hashtable에서 요소 제거
hashtable.Remove("cherry");
// Hashtable에서 요소 검색
bool contains = hashtable.Contains("banana");
Console.WriteLine("Contains banana: " + contains); // 출력 결과: Contains banana: True
// Hashtable 순회
foreach (DictionaryEntry entry in hashtable)
{
Console.WriteLine(entry.Key + ": " + entry.Value);
}
/* 출력 결과:
durian: 4
apple: 1
banana: 2
*/
}
}