더북(TheBook)

27.5 Stack 클래스

Stack 클래스는 단어 그대로 음식을 담는 접시처럼 아래에서 위로 데이터를 쌓는 형태의 자료 구조를 다룹니다. Stack 클래스는 LIFO(Last In First Out)(후입선출) 특성을 보이는데, 나중에 들어온 데이터가 먼저 출력되는 자료 구조입니다.

Stack 클래스의 주요 속성 및 메서드는 다음과 같습니다.

Count: 스택에 있는 데이터 개수 조회

Push( ): 스택에 데이터 저장

Pop( ): 스택에서 데이터 꺼내기

 

스택 구조를 다룰 때 가장 많이 나오는 단어는 오버플로(Overflow)입니다. 오버플로는 스택이 꽉 차는 것을 의미합니다. 반대로 언더플로(Underflow)는 스택이 비어 있는 것을 의미합니다.

 

Stack 클래스 사용하기

먼저 Stack 클래스를 사용하려면 System.Collections 네임스페이스를 포함해야 합니다.

> using System.Collections;

Stack 클래스의 인스턴스를 stack 이름으로 생성합니다. Stack 클래스의 인스턴스인 소문자 stack은 일반적으로 stack 개체로 읽습니다.

> Stack stack = new Stack();

Stack 클래스는 Push() 메서드로 object 형식의 데이터를 저장할 수 있습니다.

> stack.Push("First");
> stack.Push("Second");

Stack 클래스에 저장된 데이터는 Pop() 메서드로 읽어 올 수 있습니다. 이때 나중에 입력된(Push) 데이터가 먼저 출력됩니다.

> stack.Pop()
"Second"
> stack.Pop()
"First"

스택에 저장된 데이터가 아무것도 없는데, Pop() 메서드를 요청하면 다음과 같이 에러가 발생합니다.

> stack.Pop()
스택이 비어 있습니다.
  + System.Collections.Stack.Pop()

 

Stack 클래스의 주요 멤버 사용하기

이번에는 프로젝트를 만들어 Stack 클래스를 사용해 보겠습니다. 다음 내용을 입력한 후 실행해 보세요.

Stack 클래스의 주요 멤버 사용: StackNote.cs

using System;
using System.Collections; //주요 자료 구조 관련 클래스들

class StackNote
{
    static void Main()
    {
        Stack stack = new Stack();      //① Stack 클래스의 인스턴스 생성


        stack.Push("첫 번째");          //② 데이터 입력
        stack.Push("두 번째");
        stack.Push("세 번째");


        Console.WriteLine(stack.Pop()); //③ 데이터 출력: 세 번째
        Console.WriteLine(stack.Pop()); //③ 데이터 출력: 두 번째
        Console.WriteLine(stack.Pop()); //③ 데이터 출력: 첫 번째
    
        //비어 있는 스택에서 Pop() 요청하면 에러
        try
        {
            Console.WriteLine(stack.Pop()); //언더플로 에러
        }
        catch (Exception ex)
        {
            Console.WriteLine($"예외 내용 : {ex.Message}");
        }
    }
}

실행 결과

세 번째
두 번째
첫 번째
예외 내용 : Stack empty.

Stack 클래스에 Push() 메서드로 데이터를 입력한 후 이를 Pop() 메서드로 꺼내어 쓰는 내용입니다. 더 이상 스택에 데이터가 없을 때는 ‘Stack empty.’ 예외가 발생합니다. 참고로 스택에 너무 많은 데이터가 저장되어 스택이 꽉 차면 ‘스택 오버플로’ 에러가 발생합니다.

 

Stack 클래스의 Peek( ) 메서드로 최근 데이터만 가져오기

이번에는 Stack 클래스의 또 다른 메서드를 사용해 보겠습니다.

> using System.Collections;
>
> Stack stack = new Stack();       //① Stack 개체 생성
>
> stack.Push("닷넷노트");          //② Push()로 데이터 저장
> stack.Push("닷넷코리아");
> stack.Push("비주얼아카데미");
>
> $"{stack.Peek()}, {stack.Count}" //③ Peek()로 제일 위(마지막) 데이터 반환
"비주얼아카데미, 3"
> stack.Pop();                     //④ Pop()로 현재 스택의 가장 마지막 데이터 제거
> $"{stack.Peek()}, {stack.Count}" //⑤ 스택의 마지막 데이터 반환: 비어 있으면 에러
"닷넷코리아, 2"
>
> if (stack.Count > 0)             //⑥ Count로 스택의 데이터 개수 확인
. {
.     stack.Pop();                 //가장 마지막 데이터 제거
.     Console.WriteLine($"{stack.Peek()}, {stack.Count}");
. }
닷넷노트, 1
>
> stack.Clear();                  //⑦ Clear()로 스택 비우기
> stack.Count
0

Stack 클래스의 Peek() 메서드는 스택 위에 있는 데이터를 가져오지만 Pop() 메서드처럼 제거하지는 않습니다. 스택에 데이터를 넣고 계속해서 사용만 할 때는 Peek() 메서드를 씁니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.