Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 스택(Stack)과 큐(Queue) 완벽 가이드: 개념부터 Push·Pop·Enqueue·Dequeue 활용까지

C#의 컬렉션(Collection)에는 데이터를 효율적으로 관리하기 위한 다양한 자료구조가 포함되어 있습니다. 그중 스택(Stack)큐(Queue)는 데이터를 넣고 빼는 순서가 정해져 있어 실무에서 매우 자주 사용되는 대표적인 자료구조입니다. 이번 글에서는 두 클래스의 개념, 주요 속성과 메서드, 그리고 실제 코드 예제까지 자세히 살펴보겠습니다.


스택(Stack)이란?

스택은 LIFO(Last-In, First-Out, 후입선출) 방식으로 동작하는 객체 컬렉션입니다. 즉, 가장 나중에 추가된 요소가 가장 먼저 제거되며, 마지막에 넣은 항목에 우선적으로 접근해야 하는 상황에서 유용하게 사용됩니다. 대표적인 활용 예로는 실행 취소(Undo) 기능, 재귀 호출 관리, 브라우저의 뒤로 가기 기록 등이 있습니다.

스택 클래스의 주요 속성

  • Count — 스택에 현재 저장된 요소의 개수를 반환합니다.

스택 클래스의 주요 메서드

번호메서드 및 설명
1public virtual void Clear();
스택의 모든 요소를 제거합니다.
2public virtual bool Contains(object obj);
특정 요소가 스택 안에 존재하는지 확인합니다.
3public virtual object Peek();
스택 최상단의 객체를 제거하지 않고 반환합니다.
4public virtual object Pop();
스택 최상단의 객체를 제거하면서 반환합니다.
5public virtual void Push(object obj);
스택 최상단에 새 객체를 삽입합니다.
6public virtual object[] ToArray();
스택의 내용을 새 배열로 복사합니다.

참고: 제네릭 타입 안전성을 원한다면 System.Collections.Generic 네임스페이스의 Stack<T>를 사용하는 것이 좋습니다. 이를 통해 박싱(Boxing)/언박싱(Unboxing) 비용 없이 특정 타입만 저장할 수 있습니다.

스택 사용 예제: Push()와 Pop()

다음 예제는 Stack 클래스와 Push(), Pop(), Peek() 메서드를 활용하는 방법을 보여줍니다.

using System;
using System.Collections;

namespace CollectionsApplication {
    class Program {
        static void Main(string[] args) {
            Stack st = new Stack();

            st.Push('A');
            st.Push('B');
            st.Push('C');
            st.Push('D');

            Console.WriteLine("Current stack: ");
            foreach (char c in st) {
                Console.Write(c + " ");
            }

            Console.WriteLine();

            st.Push('P');
            st.Push('Q');
            Console.WriteLine("The next poppable value in stack: {0}", st.Peek());
            Console.WriteLine("Current stack: ");

            foreach (char c in st) {
                Console.Write(c + " ");
            }
            Console.WriteLine();

            Console.WriteLine("Removing values....");
            st.Pop();
            st.Pop();
            st.Pop();

            Console.WriteLine("Current stack: ");
            foreach (char c in st) {
                Console.Write(c + " ");
            }
        }
    }
}

실행 결과

Current stack:
D C B A
The next poppable value in stack: Q
Current stack:
Q P D C B A
Removing values....
Current stack:
C B A

출력 결과를 보면, Push()로 요소가 순서대로 쌓이고 Pop()이 호출될 때마다 가장 위(마지막에 추가된) 요소부터 제거되는 것을 확인할 수 있습니다. 또한 Peek()는 요소를 제거하지 않고 다음에 꺼낼 값을 미리 확인할 때 사용됩니다.


큐(Queue)란?

Queue 컬렉션 클래스는 System.Collection 네임스페이스에 포함된 C#의 자료구조로, 요소를 FIFO(First-In, First-Out, 선입선출) 방식으로 저장합니다. 즉, 가장 먼저 들어간 요소가 가장 먼저 나오게 됩니다. 영화관 매표소 앞에 줄을 선 사람들처럼, 먼저 줄을 선 사람이 먼저 입장하는 것과 같은 원리입니다. 작업 스케줄링, 메시지 처리, 버퍼링 등 순서가 중요한 상황에서 널리 활용됩니다.

큐는 다음 두 가지 핵심 메서드를 제공합니다.

  • Enqueue() — 큐에 값을 추가합니다.
  • Dequeue() — 큐에서 값을 꺼내어(제거하고) 반환합니다.

Enqueue: 큐에 항목 추가하기

Enqueue() 메서드를 사용하면 큐의 끝에 새 항목을 추가할 수 있습니다.

Queue q = new Queue();
q.Enqueue("Two");
q.Enqueue("One");

Dequeue: 큐에서 항목 꺼내기

Dequeue() 메서드는 큐의 맨 앞에 있는 항목을 제거하고 반환합니다. 아래 코드는 큐가 빌 때까지 모든 요소를 순서대로 꺼내 출력하는 예제입니다.

Queue q = new Queue();
q.Enqueue("Two");
q.Enqueue("One");

// remove elements
while (q.Count > 0)
Console.WriteLine(q.Dequeue());

정리

스택(Stack)은 후입선출(LIFO), 큐(Queue)는 선입선출(FIFO) 방식으로 동작하는 C#의 기본 컬렉션입니다. 스택은 최근 데이터를 우선 처리해야 할 때, 큐는 들어온 순서대로 처리해야 할 때 각각 적합합니다. 두 자료구조의 특징과 메서드를 정확히 이해하면 알고리즘 문제 해결뿐 아니라 실무 프로그램 설계에서도 큰 도움이 됩니다.