본문 바로가기
카테고리 없음

Java 스택 사용법과 10가지 예제 소개

by softitscream 2025. 3. 29.
반응형
Java 스택 사용법과 10가지 예제 소개

Java에서 스택(Stack)은 데이터 구조 중 하나로, 후입선출(LIFO) 방식으로 작동합니다. 이는 마지막에 추가된 데이터가 가장 먼저 제거되는 구조입니다. 스택은 주로 함수 호출 관리, 괄호 검사, 웹 브라우저의 방문 기록 등의 다양한 분야에서 활용됩니다. 이번 글에서는 Java 스택의 기본 사용법과 함께 10가지 실용적인 예제를 소개하겠습니다.

Java 스택 사용법

Java에서 스택을 사용하기 위해서는 java.util.Stack 클래스를 활용합니다. 이 클래스는 다양한 메소드를 제공하여 스택을 쉽게 조작할 수 있습니다. 기본적인 메소드는 다음과 같습니다:

  • push(E item): 스택의 상단에 요소를 추가합니다.
  • pop(): 스택의 상단 요소를 제거하고 반환합니다.
  • peek(): 스택의 상단 요소를 제거하지 않고 반환합니다.
  • isEmpty(): 스택이 비어있는지 확인합니다.
  • size(): 스택의 현재 크기를 반환합니다.

실용적인 팁

팁 1: 스택을 활용한 괄호 검사

스택은 괄호의 유효성을 검사하는 데 매우 유용합니다. 예를 들어, 수식에서 괄호가 올바르게 닫혔는지 확인하기 위해 스택을 사용할 수 있습니다. 여기에 스택을 사용하여 여는 괄호는 푸시하고, 닫는 괄호는 팝하여 유효성을 검사하는 방법을 활용하세요.

팁 2: 재귀 호출 관리

스택은 재귀 호출을 관리하는 데도 사용됩니다. 재귀 함수가 호출될 때마다 스택에 함수의 상태가 저장되므로, 이 구조를 이해하고 활용하면 재귀 문제를 해결하는 데 도움이 됩니다. 스택의 크기를 제한하여 메모리 오버플로우를 방지할 수 있습니다.

팁 3: DFS 알고리즘 구현

깊이 우선 탐색(DFS) 알고리즘은 스택을 사용하여 구현할 수 있습니다. 그래프의 노드를 스택에 추가하고, 방문한 노드를 추적하여 모든 노드를 검사하는 방법을 활용하세요. 이 방식은 효율적이며, 그래프 탐색에 매우 효과적입니다.

팁 4: Undo 기능 구현

스택은 'Undo' 기능 구현에 적합합니다. 사용자가 수행한 작업을 스택에 저장하고, 'Undo' 명령이 들어오면 마지막 작업을 팝하여 되돌리는 방식으로 구현할 수 있습니다. 이 방법은 사용자 경험을 향상시킵니다.

팁 5: 웹 브라우저의 방문 기록

웹 브라우저는 스택을 사용하여 사용자가 방문한 페이지의 기록을 관리합니다. 페이지를 방문할 때마다 스택에 추가하고, '뒤로 가기' 버튼 클릭 시 마지막 페이지를 팝하여 보여주는 방식으로 구현합니다. 이를 통해 사용자는 쉽게 이전 페이지로 돌아갈 수 있습니다.

실제 활용 예제

사례 1: 괄호 짝 맞추기

스택을 사용하여 문자열 내의 괄호가 올바르게 짝을 이루는지 확인하는 간단한 예제를 살펴보겠습니다. 다음은 Java 코드 예제입니다:


import java.util.Stack;

public class ParenthesisChecker {
    public static boolean isValid(String s) {
        Stack stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                if (stack.isEmpty()) return false;
                stack.pop();
            }
        }
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        String test1 = "(a + b) * (c - d)";
        String test2 = "(a + b)) * (c - d)";
        System.out.println(isValid(test1)); // true
        System.out.println(isValid(test2)); // false
    }
}
    

이 코드는 입력된 문자열 내의 괄호가 올바르게 짝을 이루는지 확인합니다. 스택에 여는 괄호가 추가되고, 닫는 괄호가 나올 때마다 팝하여 체크합니다.

사례 2: 깊이 우선 탐색(DFS)

스택을 활용하여 그래프의 깊이 우선 탐색을 구현하는 예제를 살펴보겠습니다. 다음 코드는 인접 리스트로 표현된 그래프에서 DFS를 수행하는 방법을 보여줍니다:


import java.util.*;

public class Graph {
    private Map> adjList = new HashMap<>();

    public void addEdge(int u, int v) {
        adjList.putIfAbsent(u, new ArrayList<>());
        adjList.get(u).add(v);
    }

    public void dfs(int start) {
        Stack stack = new Stack<>();
        Set visited = new HashSet<>();
        stack.push(start);

        while (!stack.isEmpty()) {
            int node = stack.pop();
            if (!visited.contains(node)) {
                System.out.print(node + " ");
                visited.add(node);
                for (int neighbor : adjList.getOrDefault(node, new ArrayList<>())) {
                    stack.push(neighbor);
                }
            }
        }
    }

    public static void main(String[] args) {
        Graph graph = new Graph();
        graph.addEdge(1, 2);
        graph.addEdge(1, 3);
        graph.addEdge(2, 4);
        graph.addEdge(3, 5);
        graph.dfs(1); // Output: 1 3 5 2 4
    }
}
    

이 코드는 DFS를 사용하여 그래프의 모든 노드를 탐색합니다. 스택을 통해 방문할 노드를 관리하며, 방문한 노드는 집합에 추가되어 중복 방문을 방지합니다.

사례 3: Undo 기능 구현

스택을 사용하여 간단한 텍스트 에디터의 Undo 기능을 구현하는 예제를 살펴보겠습니다. 사용자가 입력한 문자열을 스택에 저장하고, Undo 명령이 들어오면 마지막 입력을 삭제합니다:


import java.util.Stack;

public class TextEditor {
    private Stack history = new Stack<>();
    private String currentText = "";

    public void type(String text) {
        history.push(currentText);
        currentText += text;
    }

    public void undo() {
        if (!history.isEmpty()) {
            currentText = history.pop();
        }
    }

    public String getText() {
        return currentText;
    }

    public static void main(String[] args) {
        TextEditor editor = new TextEditor();
        editor.type("Hello");
        editor.type(" World");
        System.out.println(editor.getText()); // Hello World
        editor.undo();
        System.out.println(editor.getText()); // Hello
    }
}
    

이 코드는 사용자가 텍스트를 입력할 때마다 현재 상태를 스택에 저장하고, Undo 명령이 들어오면 마지막 상태로 되돌립니다. 사용자는 쉽게 이전 상태로 돌아갈 수 있습니다.

요약과 실천 팁


Java의 스택은 다양한 분야에서 유용하게 사용될 수 있습니다. 괄호 검사, DFS, Undo 기능 등 여러 가지 예제를 통해 그 활용 가능성을 확인할 수 있습니다. 스택을 사용하는 기본 메소드와 실용적인 팁을 활용하여 효율적인 프로그래밍을 할 수 있습니다.

이제 여러분도 Java 스택을 활용하여 다양한 문제를 해결해 보세요. 스택은 코드의 가독성을 높이고, 복잡한 문제를 단순화하는 데 매우 유용한 도구입니다. 스택을 활용한 문제 해결 방법을 익혀 보시기 바랍니다.

반응형