Sam Story

JAVA - Stack 본문

JAVA

JAVA - Stack

Sam H 2024. 11. 30. 18:25

오늘은 Stack에 대해 간단히 포스팅 해보려 한다.

알고리즘 , 자료구조 하면 자주 보게되는것중에 하나인게 바로 Stack 이라고 생각한다.

 

 

Stack 이란 ? 

Stack의 사전적 정의는 '쌓다' , '더미' 로서 뭔가 쌓아놓은 것을 말한다.

뭔가를 쌓아 올리듯이 데이터를 쌓는 자료구조라고 할 수 있다.

 

Stack은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 및 후입 선출 구조로 되어 있다.

 

자료를 넣는것을 push 라고 하고 반대로 넣어둔 자료를 꺼내는 것을 pop 이라고 하는데

이 때 마지막에 push한 값이 먼저 나오게 된다.

 

아래 그림을 통해 간단히 보게 되면

데이터를 push하게 되면 Stack top에 들어가게 되고

pop 하게 되면 가장 마지막에 들어간 데이터가 나오게 된다.

 

코딩테스트를 많이 해본 사람들이라면

java.util.Stack 클래스를 통해 Stack을 import해서 많이 사용해 봤을 것이다.

 

Stack class 에서는 기본으로 제공되는 메서드들이 몇가지 있는데

대표적인것을 알아보자.

 

Object push(Object item) : Stack에 객체(item)를 저장한다.

 

Object pop() : Stack의 맨위에 저장된 객체를 꺼내는 메서드

 

Object peek() : Stack의 맨 위에 저장된 객체를 반환하는 메서드

 

boolean empty() : Stack이 비어있다면 true return

 

int search(Object o) : Stack에서 주어진 객체를 찾아서 그위치를 반환, 못 찾을 경우 -1반환

(배열과 달리 위치는 0이 아닌 1부터 시작)

 

 

 

간단한 예제를 통해 어떻게 동작하는지 알아보자.

 

예제

 

Stack 초기화, push()

import java.util.Stack;

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

        // Stack 초기화 <> 안에 자료형
        Stack<String> stack = new Stack<>();

        // push -> 데이터를 Stack에 쌓는다.
        stack.push("A");
        stack.push("B");
        stack.push("C");

        System.out.println(stack);
    }
}

 

실행결과

실행결과

 

 

pop()

import java.util.Stack;

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

        // Stack 초기화 <> 안에 자료형
        Stack<String> stack = new Stack<>();

        // push -> 데이터를 Stack에 쌓는다.
        stack.push("A");
        stack.push("B");
        stack.push("C");
        stack.push("D");

        // pop -> 데이터를 Stack에서 꺼낸다
        // 가장 마지막에 push한 데이터인 D가 출력됨.
        System.out.println(stack.pop());

        System.out.println(stack);
    }
}

 

실행결과

실행결과

 

 

peek()

import java.util.Stack;

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

        // Stack 초기화 <> 안에 자료형
        Stack<String> stack = new Stack<>();

        // push -> 데이터를 Stack에 쌓는다.
        stack.push("A");
        stack.push("B");
        stack.push("C");
        stack.push("D");

        // peek -> Stack 최상단 데이터를 불러온다.
        // 가장 마지막에 쌓은 데이터인 D를 불러옴.
        System.out.println(stack.peek());

        System.out.println(stack);
    }
}

 

실행결과

실행결과

 

empty()

import java.util.Stack;

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

        // Stack 초기화 <> 안에 자료형
        Stack<String> stack = new Stack<>();

        // push -> 데이터를 Stack에 쌓는다.
        stack.push("A");

        // stack이 비어있지 않다면 안전하게 pop 해준다.
        if(!stack.empty()) {
            stack.pop();
        }
        
        System.out.println(stack);
    }
}

 

실행결과

실행결과

 

 

search()

import java.util.Stack;

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

        // Stack 초기화 <> 안에 자료형
        Stack<String> stack = new Stack<>();

        // push -> 데이터를 Stack에 쌓는다.
        stack.push("A");
        stack.push("B");
        stack.push("C");
        stack.push("D");

        // search -> 몇번 째로 꺼내는지에 대한 인덱스 값을 반환한다.
        System.out.println(stack.search("B"));
        System.out.println(stack.search("D"));
    }
}

 

실행결과

실행결과

 

 

 

 

위 예제들을 통해서 Stack의 간단한 사용법에 대해 알아보았다.

이러한 Stack은 수식계산 , 수식 괄호 검사 등의 구현에 사용되기도 한다.

 

사실 Stack 보다는 List , ArrayList를 많이 사용했었지만

이러한 Stack은 마지막으로 사용이 끝난 지역변수를 바로바로 쳐내버리기 때문에

효율적으로 메모리를 사용할 수 있다는 장점이 있다.

'JAVA' 카테고리의 다른 글

Java - Stream  (0) 2025.03.14
Java - JVM 메모리 구조 , Stack, Heap  (1) 2024.12.04
JAVA - 인터페이스  (2) 2024.11.22
JAVA - 추상클래스  (0) 2024.11.21
JAVA - 의존 역전 원칙  (2) 2024.10.20