자바 Stack 클래스 | 자바 입문강좌 44

자바 Stack 클래스

자바 Stack 클래스를 구현해보겠습니다. Stack 은 접시 스택처럼 접시를 쌓아놓은 모습과 같다고 해서 Stack 으로 불립니다. 사실 접시 뿐만 아니라 뭐를 쌓아놓아도 스택입니다. 예를 들어 고층 건물이나 아파트는 스택 방식으로 만들어졌습니다.

탑처럼 무언가를 쌓아 올린다면 이걸 해체하기 위해 밑에서 부터 꺼낼 수는 없습니다. 특히 하늘로 향해있는 것들은요.

또 다른 예로는 총기류의 탄창입니다. 마지막에 넣은 탄알이 처음에 발사되고 다 처음에 넣은 탄환이 마지막에 발사됩니다. 이를 LIFO(Last in first out – 마지막에 들어온 놈이 먼저 나간다) 라고도 하는데요. 어떤 데이터를 구석으로 밀어넣을 때 유용합니다.

운영체제에서 관리하느 Stack 메모리라는 것도 있습니다. LIFO 구조죠. 마지막으로 사용이 끝난 지역변수를 바로바로 쳐내버리는 Stack 은 매우 효율적으로 메모리를 사용하는 방법입니다.

컴퓨터에서는 인터넷 브라우저에서 뒤로가기나 redo 마지막 콘트롤 다시 하기[Ctrl + Z] 같은 경우 등이 Stack 구조에 해당합니다. 인간의 기억도 Stack 입니다. 인간의 뇌는 10분전의 일을 10년전의 일보다 더 잘 기억합니다. 때문에 Stack을 열 때 항상 뚜껑(top)에서만 여는 것이 좀 무식해 보일 수는 있으나 인간의 기억체계와 비슷합니다;;;

그런 분석은 다소 무례하고 우울하지만 우리에게 한가지 인사이트는 보여줍니다. 바로 Stack 은 유용하다는 것입니다.

그리고 사람의 기억체계와 유사하기 때문에 매우 쉽게 느껴집니다. 나중에 들어간 내용이 먼저 나온다. 암기과목을 공부할 때 주의사항입니다.

아래의 예제는 컬렉션 프레임워크의 Stack 클래스입니다.

스택은 쉬워서 직접 구현하는 것도 어렵지는 않습니다만 컬렉션 프레임워크간의 상성은 검증되어 있기 때문에 가급적 컬렉션 프레임워크 안에서 사용하는게 좋습니다.

스택은 검색이란 것을 딱히 두지 않습니다. push, pop, peek 세 개 정도만으로 충분한데요.

Stack 을 pop 하는 순간 사라지기 때문입니다. 즉 확인과 동시에 데이터는 날아갑니다.

다만 Stack 도 설계에 따라 search 기능이 탑재가 가능한데 java.util.Stack 에서는 search 메소드를 지원합니다. Object obj 인수를 넣어서 검색합니다.

package com.kay;


import java.util.Stack;

public class Main {
    public static void main(String[] args) {

//        Creating a Stack
        Stack<MyMemo> stackOfMemo = new Stack<>();

//        push 함수로 맨 위에 쌓는다
        stackOfMemo.push(new MyMemo(1,"jogging in the morning"));
        stackOfMemo.push(new MyMemo(2,"lunch with my client"));
        stackOfMemo.push(new MyMemo(3,"play with kids"));
        stackOfMemo.push(new MyMemo(4,"call my cousin"));

        for (MyMemo me1 : stackOfMemo){
            me1.showMemo();
        }

//        pop 함수 맨 위에서 꺼낸다.
        System.out.println("-------------------------------------");
        MyMemo justMemo = stackOfMemo.pop();
        justMemo.showMemo();

//        peek 엿보기
        System.out.println("[peek] - 맨위 메모를 엿보기");
        justMemo = stackOfMemo.peek();
        justMemo.showMemo();
        System.out.println(stackOfMemo);
    }
}


class MyMemo{
    private int memoId;
    private String memoText;

    public int getMemoId() {
        return memoId;
    }

    public void setMemoId(int memoId) {
        this.memoId = memoId;
    }

    public String getMemoText() {
        return memoText;
    }

    public void setMemoText(String memoText) {
        this.memoText = memoText;
    }

    public MyMemo(int memoId, String memoText) {
        this.memoId = memoId;
        this.memoText = memoText;
    }

    public void showMemo(){
        System.out.print("this memo = " + this.toString() + ", ");
        System.out.print("memoId = " + memoId + ", ");
        System.out.print("memoText = " + memoText);
        System.out.println();
    }
}
this memo = com.kay.MyMemo@15aeb7ab, memoId = 1, memoText = jogging in the morning
this memo = com.kay.MyMemo@27bc2616, memoId = 2, memoText = lunch with my client
this memo = com.kay.MyMemo@3941a79c, memoId = 3, memoText = play with kids
this memo = com.kay.MyMemo@506e1b77, memoId = 4, memoText = call my cousin
-------------------------------------
this memo = com.kay.MyMemo@506e1b77, memoId = 4, memoText = call my cousin
[peek] - 맨위 메모를 엿보기
this memo = com.kay.MyMemo@3941a79c, memoId = 3, memoText = play with kids
[com.kay.MyMemo@15aeb7ab, com.kay.MyMemo@27bc2616, com.kay.MyMemo@3941a79c]

실행 결과를 확인하는 것은 어렵지 않습니다. 매우 심플한 push 와 pop 으로 이루어져 있기 때문입니다. 자료구조의 해석력을 높이려면 머리를 좀 써야합니다. 스택 모양의 이미지를 머리속에 가지고 있으면 소스코드의 복잡함에서 벗어날 수 있습니다.

요약

간단히 자바 Stack 클래스를 사용한 Stack 자료구조를 구현해봤습니다. 추가 메소드의 상세사항에 대해서는 언제나 java doc 이나 영문 웹사이트 문서들을 참고하는 것을 추천합니다.

문서를 빨리 잘 읽는다면 초중급 단계의 프로그래밍에서 만나는 거의 모든 문제를 빠르게 해결할 수 있습니다.

외부참고문서

자바 Stack 클래스

Java Stack Class Tutorial with Examples | CalliCoder

Java Stack (jenkov.com)

Java Stack – Javatpoint

Java Stack Class (programiz.com)

Java – The Stack Class – Tutorialspoint

Stack Class in Java – GeeksforGeeks

자바 Stack 클래스 and Queue | 컬렉션 프레임워크 | 자바 자료형

Leave a Comment