개요
이번 글에서는 C#에서 사용되는 스택, Stack<T>에 대해 알아보겠습니다. Stack<T> 또한 C#의 제네릭 컬렉션 클래스로 LIFO(Last In, First Out) 방식으로 데이터를 관리하는 자료 구조 입니다. 다른 자료 구조와 마찬가지로 T에는 다양한 타임의 데이터를 지정할 수 있습니다.
생성
Stack<T> 컬렉션 클래스를 선언하는 방법은 아래와 같습니다.
1 | Stack<T> list = new Stack<T>(); |
다른 자료구조와 클래스와 마찬가지로 T에는 어떠한 자료형이든 올 수 있습니다.
함수 및 속성
함수와 속성에 대해서 먼저 설명하겠습니다. 자주 사용하는 함수 및 속성은 아래와 같습니다.
속성 및 함수 | 설명 |
---|---|
Count | 스택에 있는 요소의 개수를 반환합니다. |
Push(T item) | 스택의 맨 위에 새 요소를 추가합니다. |
Pop() | 스택의 맨 위에 있는 요소를 제거하고 반환합니다. |
Peek() | 스택의 맨 위에 있는 요소를 제거하지 않고 반환합니다. |
Clear() | 스택의 모든 요소를 제거합니다. |
Contains(T item) | 특정 요소가 스택에 있는지 확인합니다. |
ToArray() | 스택의 요소를 배열로 복사하여 반환합니다. |
예제 – 웹 브라우저 주소 이동
만들어 볼 예제는 웹 브라우저의 주소 이동을 하는 프로그램입니다. 실제 브라우저는 아니고, 브라우저의 주소 입력, 이전 페이지, 다음 페이지 기능을 스택으로 구현하려 합니다.
웹 브라우저의 경우 주소창에 주소를 입력하면 해당 주소로 이동합니다. 하지만 이동을 몇 번 하 보면 이전 페이지로 이동이 가능하며 다음 페이지로도 이동이 가능합니다.
주소를 저장하는 CWebAddress 클래스와 웹 브라우저를 의미하는 CWebBrowser 클래스를 아래와 같이 만들어줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // 웹브라우저public class CWebBrowser { private Stack<CWebAddress> _stackPrev = new Stack<CWebAddress>(); // 이전 페이지 관리 스택 private Stack<CWebAddress> _stackNext = new Stack<CWebAddress>(); // 다음 페이지 관리 스택 public CWebBrowser() { } public void DoRun() { // todo .. : } } // 웹 주소 public class CWebAddress { private string _address; public CWebAddress( string address) { _address = address; } public override string ToString() { return $ "현재 주소: {_address}" ; } } |
그리고 CWebBrowser 클래스 DoRun 함수에 아래와 같이 코딩합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | public void DoRun() { _stackPrev.Clear(); _stackNext.Clear(); Console.WriteLine( "브라우저를 시작합니다." ); while ( true ) { Console.WriteLine( "==============================================================" ); Console.WriteLine($ "현재 페이지: {_stackPrev.Peek()}" ); Console.WriteLine( "(새 주소 입력 - 문자열, 이전페이지 - p, 다음페이지 - n, 종료 - X)" ); string ? strRead = Console.ReadLine(); if ( string .IsNullOrWhiteSpace(strRead) == false ) { strRead = strRead.ToUpper(); // 이전 페이지 이동 if (strRead.Equals( "P" )) { if (_stackPrev.Count <= 1) Console.WriteLine( "이전 페이지가 없습니다." ); else _stackNext.Push(_stackPrev.Pop()); // 이전페이지 스택에서 Pop, 다음페이지 스택에 Push } // 다음 페이지 else if (strRead.Equals( "N" )) { if (_stackPrev.Count == 0 || _stackNext.Count == 0) Console.WriteLine( "다음 페이지가 없습니다." ); else _stackPrev.Push(_stackNext.Pop()); // 다음페이지 스택에서 Pop, 이전페이지 스택에 Push } // 종료 else if (strRead.Equals( "X" )) break ; // 주소 입력 else { strRead = strRead.ToLower(); _stackPrev.Push( new CWebAddress(strRead)); // 주소 입력 _stackNext.Clear(); } } } _stackPrev.Clear(); _stackNext.Clear(); Console.WriteLine( "브라우저를 종료합니다." ); } |
실행하면 아래와 같이 볼 수 있습니다.
처음 시작은 제 블로그(3001ssw.com) 주소가 기본값으로 입력 되어 있고, 제가 네이버(www.naver.com), 그 다음으로 구글(ww.google.com) 주소를 입력하였습니다. 보시는 것과 같이 주소 입력할 때마다 입력한 현재 페이지를 계속 표시하고 있으며, 이전으로 돌아가는 명령어를 입력하면 다시 네이버, 블로그 주소로 이동하며, 다음 페이지로 이동하는 것 또한 잘 됩니다.
전체 코드는 아래 깃헙 링크 참고하시기 바랍니다.
github : https://github.com/3001ssw/c_sharp/tree/main/Data_Struct/Stack