C#의 Stack.Contains() 메서드는 특정 요소가 스택(Stack)에 포함되어 있는지 확인할 때 사용합니다. 요소가 존재하면 true, 존재하지 않으면 false를 반환하며, 내부적으로 처음부터 끝까지 순차 검색(linear search)을 수행하므로 시간 복잡도는 O(n)입니다.
구문
Stack.Contains() 메서드의 기본 구문은 다음과 같습니다.
public virtual bool Contains (object ob);
여기서 매개변수 ob는 스택에서 검색하고자 하는 개체를 의미합니다.
주요 특징
- 반환 형식: bool — 요소가 스택에 있으면 true, 없으면 false를 반환
- 비교 방식: Object.Equals() 메서드를 사용하여 요소를 비교
- 성능: 순차 검색 방식으로 동작하므로 시간 복잡도는 O(n)
- null 검색: null을 인자로 전달하여 검색하는 것도 가능
예제 1 – 문자열 스택에서 요소 검색
다음 예제에서는 문자열 요소들로 구성된 스택을 생성하고, Push()로 새 요소를 추가한 뒤 Contains() 메서드로 특정 요소의 존재 여부를 확인해 보겠습니다.
using System;
using System.Collections;
public class Demo {
public static void Main() {
Stack stack = new Stack();
stack.Push("Inspiron");
stack.Push("Alienware");
stack.Push("Projectors");
stack.Push("Monitors");
stack.Push("XPS");
stack.Push("Laptop");
stack.Push("Notebook");
Console.WriteLine("스택 요소...");
foreach(string val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("요소 개수 = " + stack.Count);
Console.WriteLine("Speakers 요소가 스택에 있는가? = " + stack.Contains("Speakers"));
stack.Push("Headphone");
stack.Push("Keyboard");
stack.Push("Earphone");
Console.WriteLine("\n스택 요소... 업데이트 후");
foreach(string val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("요소 개수(업데이트 후) = " + stack.Count);
Console.WriteLine("Alienware 요소가 스택에 있는가? = " + stack.Contains("Alienware"));
Stack stack2 = (Stack)stack.Clone();
Console.WriteLine("\n스택 요소... 복제본");
foreach(string val in stack2) {
Console.WriteLine(val);
}
Console.Write("요소 개수(복제본) = " + stack2.Count);
}
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
스택 요소... Notebook Laptop XPS Monitors Projectors Alienware Inspiron 요소 개수 = 7 Speakers 요소가 스택에 있는가? = False 스택 요소... 업데이트 후 Earphone Keyboard Headphone Notebook Laptop XPS Monitors Projectors Alienware Inspiron 요소 개수(업데이트 후) = 10 Alienware 요소가 스택에 있는가? = True 스택 요소... 복제본 Earphone Keyboard Headphone Notebook Laptop XPS Monitors Projectors Alienware Inspiron 요소 개수(복제본) = 10
초기 스택에는 7개의 요소가 저장되어 있으며, "Speakers"는 스택에 존재하지 않으므로 Contains()가 False를 반환했습니다. 이후 Headphone, Keyboard, Earphone 세 요소를 추가하면 개수가 10개로 늘어나고, 이미 존재하는 "Alienware"에 대해서는 True가 반환되는 것을 확인할 수 있습니다.
예제 2 – 정수 스택에서 요소 검색
이번에는 정수형 데이터를 담은 스택으로 동일하게 테스트해 보겠습니다.
using System;
using System.Collections;
public class Demo {
public static void Main() {
Stack stack = new Stack();
stack.Push(150);
stack.Push(300);
stack.Push(500);
stack.Push(750);
stack.Push(1000);
stack.Push(1250);
stack.Push(1500);
stack.Push(2000);
stack.Push(2500);
Console.WriteLine("스택 요소...");
foreach(int val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("요소 개수 = " + stack.Count);
Console.WriteLine("750 요소가 스택에 있는가? = " + stack.Contains(750));
stack.Push(3000);
Console.WriteLine("\n스택 요소... 업데이트 후");
foreach(int val in stack) {
Console.WriteLine(val);
}
Console.WriteLine("요소 개수(업데이트 후) = " + stack.Count);
Console.WriteLine("5000 요소가 스택에 있는가? = " + stack.Contains(5000));
Stack stack2 = (Stack)stack.Clone();
Console.WriteLine("\n스택 요소... 복제본");
foreach(int val in stack2) {
Console.WriteLine(val);
}
Console.Write("요소 개수(복제본) = " + stack2.Count);
}
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
스택 요소... 2500 2000 1500 1250 1000 750 500 300 150 요소 개수 = 9 750 요소가 스택에 있는가? = True 스택 요소... 업데이트 후 3000 2500 2000 1500 1250 1000 750 500 300 150 요소 개수(업데이트 후) = 10 5000 요소가 스택에 있는가? = False 스택 요소... 복제본 3000 2500 2000 1500 1250 1000 750 500 300 150 요소 개수(복제본) = 10
"750"은 처음부터 스택에 존재했던 값이므로 True가 반환되고, 이후 검색한 "5000"은 스택에 없는 값이기 때문에 False가 반환됩니다. 또한 Clone()으로 복제된 스택도 원본과 동일한 요소 목록과 개수를 유지하는 것을 볼 수 있습니다.
정리
C#의 Stack.Contains() 메서드는 스택에 원하는 값이 들어 있는지 손쉽게 확인할 수 있는 방법입니다. 다만 순차 검색 기반이기 때문에 요소가 많은 스택에서 반복적으로 호출하면 성능 저하가 발생할 수 있으며, 이런 경우에는 HashSet처럼 조회 속도가 빠른 자료구조를 활용하는 것이 좋습니다.