C#의 Stack(스택) 클래스는 후입선출(LIFO, Last-In-First-Out) 방식으로 동작하는 컬렉션입니다. 즉, 가장 나중에 추가된 요소가 가장 먼저 제거되는 구조로, 데이터를 임시로 쌓아두고 역순으로 처리해야 하는 상황에서 매우 유용하게 사용됩니다.
그럼 Stack 클래스에서 자주 사용되는 속성과 메서드를 하나씩 살펴보겠습니다.
Stack 클래스의 주요 속성
| 번호 | 속성 및 설명 |
|---|---|
| 1 | Count 스택에 포함된 요소의 개수를 반환합니다. |
| 2 | IsSynchronized 스택에 대한 액세스가 동기화되어 있는지(스레드로부터 안전한지) 여부를 나타내는 값을 가져옵니다. |
| 3 | SyncRoot 스택에 대한 액세스를 동기화하는 데 사용할 수 있는 개체를 가져옵니다. |
Stack 클래스의 주요 메서드
| 번호 | 메서드 및 설명 |
|---|---|
| 1 | Clear() 스택에서 모든 개체를 제거합니다. |
| 2 | Clone() 스택의 단순 복사본(shallow copy)을 생성합니다. |
| 3 | Contains(Object) 특정 요소가 스택에 존재하는지 여부를 확인합니다. |
| 4 | CopyTo(Array, Int32) 지정한 배열 인덱스부터 시작하여 스택을 기존 1차원 배열에 복사합니다. |
| 5 | Equals(Object) 지정한 개체가 현재 개체와 같은지 여부를 판단합니다. |
| 6 | GetEnumerator() 스택에 대한 IEnumerator를 반환합니다. |
| 7 | GetHashCode() 기본 해시 함수로 사용됩니다.(Object에서 상속) |
| 8 | GetType() 현재 인스턴스의 Type을 가져옵니다. |
| 9 | Peek() 스택 맨 위의 개체를 제거하지 않고 그대로 반환합니다. |
| 10 | Pop() 스택 맨 위의 개체를 제거하면서 반환합니다. |
| 11 | Push(Object) 스택 맨 위에 새 개체를 삽입합니다. |
예제 1: Peek()로 스택 맨 위 요소 확인하기
Peek() 메서드를 사용하면 스택에서 요소를 제거하지 않고 맨 위에 있는 개체를 확인할 수 있습니다. 다음 코드를 보겠습니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
Stack<string> stack = new Stack<string>();
stack.Push("A");
stack.Push("B");
stack.Push("C");
stack.Push("D");
stack.Push("E");
stack.Push("F");
stack.Push("G");
stack.Push("H");
stack.Push("I");
stack.Push("J");
Console.WriteLine("Count of elements = " + stack.Count);
Console.WriteLine("Element at the top of stack = " + stack.Peek());
}
}
실행 결과
Count of elements = 10 Element at the top of stack = J
A부터 J까지 열 개의 문자를 Push()로 순서대로 추가했기 때문에 Count 값은 10이 되고, 가장 마지막에 추가된 "J"가 스택의 맨 위에 위치하게 됩니다.
예제 2: Contains()로 특정 요소 존재 여부 확인하기
Contains() 메서드를 사용하면 스택 안에 특정 요소가 있는지 간단히 확인할 수 있습니다. 다음은 정수형 스택에서 400이라는 값이 존재하는지 검사하는 코드입니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
Stack<int> stack = new Stack<int>();
stack.Push(100);
stack.Push(150);
stack.Push(175);
stack.Push(200);
stack.Push(225);
stack.Push(250);
stack.Push(300);
stack.Push(400);
stack.Push(450);
stack.Push(500);
Console.WriteLine("Elements in the Stack:");
foreach(var val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("Count of elements in the Stack = " + stack.Count);
Console.WriteLine("Does Stack have the element 400? = " + stack.Contains(400));
}
}
실행 결과
Elements in the Stack: 500 450 400 300 250 225 200 175 150 100 Count of elements in the Stack = 10 Does Stack have the element 400? = True
foreach 루프의 출력 결과를 보면, 가장 나중에 Push한 500이 가장 먼저 출력되는 것을 확인할 수 있습니다. 이것이 바로 LIFO(후입선출) 구조의 핵심 특징입니다. 또한 스택에 400이 실제로 존재하므로 Contains(400)은 True를 반환합니다.
마무리
이처럼 C#의 Stack 클래스는 Push()로 요소를 추가하고, Pop()/Peek()로 맨 위 요소를 꺼내거나 확인하며, Count와 Contains()로 상태를 점검하는 직관적인 API를 제공합니다. 실행 취소(Undo) 기능, 괄호 검사, DFS(깊이 우선 탐색) 등 LIFO 구조가 필요한 다양한 상황에서 Stack 클래스를 적극적으로 활용해 보시기 바랍니다.