C#에서 컬렉션은 객체 그룹을 관리하는 데 있어 기본적인 요소입니다. 이들은 데이터를 효율적으로 저장, 검색, 조작할 수 있는 방법을 제공합니다. 특히 큐(Queue)와 스택(Stack)은 항목이 추가되고 제거되는 방식에 따라 특정 규칙을 따르는 중요한 유형입니다. 이번 포스트에서는 큐와 스택의 작동 원리와 실용적인 사용 예시를 통해 이들의 중요성을 알아보겠습니다.
큐(Queue) 이해하기
큐는 선입선출(FIFO) 원칙을 따르는 컬렉션입니다. 이는 큐에 처음 추가된 항목이 가장 먼저 제거된다는 것을 의미합니다. 이를 티켓 카운터에서 줄을 서 있는 사람들로 생각해 볼 수 있습니다. 먼저 도착한 사람이 먼저 서비스를 받게 됩니다.
주요 특징
- Enqueue: 항목을 큐의 끝에 추가합니다.
- Dequeue: 항목을 큐의 앞에서 제거합니다.
- Peek: 제거하지 않고 앞의 항목을 봅니다.
실용적인 예시
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Queue<string> ticketQueue = new Queue<string>();
// 고객을 큐에 추가
ticketQueue.Enqueue("Customer 1");
ticketQueue.Enqueue("Customer 2");
ticketQueue.Enqueue("Customer 3");
Console.WriteLine($"Next in line: {ticketQueue.Peek()}"); // "Customer 1" 표시
// 고객 서비스
while(ticketQueue.Count > 0)
{
string customer = ticketQueue.Dequeue();
Console.WriteLine($"{customer} has been served.");
}
}
}
이 예시에서는 ticketQueue라는 큐를 생성하고, 세 명의 고객을 추가한 후, 다음 순서의 고객을 확인하고, 모든 고객이 서비스될 때까지 하나씩 처리합니다.
스택(Stack) 이해하기
스택은 후입선출(LIFO) 원칙을 따릅니다. 이는 스택에 마지막으로 추가된 항목이 가장 먼저 제거된다는 것을 의미합니다. 접시를 쌓는 것과 비슷하게 생각할 수 있습니다. 접시는 위에 쌓고, 위에서부터 제거합니다.
주요 특징
- Push: 항목을 스택의 맨 위에 추가합니다.
- Pop: 항목을 스택의 맨 위에서 제거합니다.
- Peek: 제거하지 않고 현재 맨 위에 있는 항목을 봅니다.
실용적인 예시
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Stack<int> numberStack = new Stack<int>();
// 숫자를 스택에 추가
numberStack.Push(10);
numberStack.Push(20);
numberStack.Push(30);
Console.WriteLine($"Top element before pop: {numberStack.Peek()}"); // "30" 표시
// 스택에서 요소 제거
while(numberStack.Count > 0)
{
int number = numberStack.Pop();
Console.WriteLine($"Popped {number} from stack.");
}
}
}
여기서는 numberStack이라는 스택을 생성하고, 세 개의 정수를 추가한 후, 맨 위의 요소를 확인하고, 스택이 비어질 때까지 요소를 하나씩 제거합니다.
큐와 스택의 사용 시기
큐와 스택 중에서 선택하는 것은 전적으로 사용 사례에 따라 다릅니다:
- 항목을 추가된 순서대로 처리하고 싶을 때는 큐(Queue)를 사용하세요 (예: 인쇄 작업).
- 역순 처리나 되돌리기가 필요할 때는 스택(Stack)을 사용하세요 (예: 애플리케이션의 실행 취소 기능).
결론
큐와 스택은 C#의 컬렉션 프레임워크 내에서 필수적인 구성 요소입니다. 이들은 각각의 원칙에 따라 요소에 접근할 수 있는 다양한 방법을 제공함으로써 데이터를 효과적으로 관리하는 데 도움을 줍니다. 큐는 FIFO, 스택은 LIFO 원칙을 따르며, 이러한 개념을 이해하면 개발자가 애플리케이션 요구 사항에 따라 적절한 구조를 효율적으로 선택할 수 있습니다!
'프로그래밍 > C#' 카테고리의 다른 글
| C#에서 예외 처리를 통한 안정적인 애플리케이션 개발 (1) | 2025.08.28 |
|---|---|
| C#에서 컬렉션과 제네릭의 강력한 조합 (3) | 2025.08.27 |
| C#에서 HashSet을 활용한 고유 데이터 관리의 중요성 (0) | 2025.08.26 |
| C#에서 Dictionary를 활용한 효율적인 데이터 관리 (0) | 2025.08.26 |
| C#에서 리스트(`List<T>`)를 활용한 효율적인 데이터 관리 (0) | 2025.08.26 |