[java] 여러 자료형을 저장할 수 있는 스택 구현하기

스택은 데이터를 선형 구조로 저장하고, 후입선출(LIFO) 방식으로 데이터를 접근할 수 있는 자료구조입니다. 자바에서 스택을 구현하기 위해 제공되는 Stack 클래스는 기본적으로 Object 타입만을 저장할 수 있습니다. 하지만 때때로 서로 다른 자료형을 저장해야 하는 경우가 있을 수 있습니다. 이번 글에서는 여러 자료형을 저장할 수 있는 스택을 구현하는 방법에 대해 알아보겠습니다.

Generic을 활용한 스택 구현하기

Java에서는 Generic을 사용하여 컬렉션을 생성할 수 있습니다. Generic을 이용하면 어떤 타입의 객체도 저장할 수 있는 유연한 스택을 구현할 수 있습니다. Stack 클래스를 제네릭 타입으로 정의하면 됩니다.

import java.util.ArrayList;

public class MyStack<T> {
    private ArrayList<T> stack;

    public MyStack() {
        stack = new ArrayList<>();
    }

    public void push(T item) {
        stack.add(item);
    }

    public T pop() {
        if (isEmpty()) {
            throw new IllegalStateException("Stack is empty");
        }
        return stack.remove(stack.size() - 1);
    }

    public boolean isEmpty() {
        return stack.isEmpty();
    }

    public int size() {
        return stack.size();
    }
}

위의 코드는 MyStack 클래스를 구현한 예시입니다. ArrayList를 내부적으로 사용하여 데이터를 저장하고, 제네릭 타입 T를 이용해 스택의 타입을 지정합니다.

push 메소드는 스택에 요소를 추가하고, pop 메소드는 스택에서 가장 최근에 추가된 요소를 제거하고 반환합니다. isEmpty 메소드는 스택이 비어있는지 여부를 반환하며, size 메소드는 스택의 크기를 반환합니다.

사용 예시

public class Main {
    public static void main(String[] args) {
        MyStack<Integer> integerStack = new MyStack<>();
        integerStack.push(1);
        integerStack.push(2);
        integerStack.push(3);
        
        System.out.println(integerStack.pop());  // 3
        System.out.println(integerStack.pop());  // 2

        MyStack<String> stringStack = new MyStack<>();
        stringStack.push("hello");
        stringStack.push("world");

        System.out.println(stringStack.pop());  // world
        System.out.println(stringStack.pop());  // hello
    }
}

위의 예시는 MyStack 클래스를 사용하는 방법을 보여줍니다. MyStack<Integer>를 생성하여 정수형 데이터를 저장하고, MyStack<String>를 생성하여 문자열 데이터를 저장합니다.

결론

제네릭을 활용하여 여러 자료형을 저장할 수 있는 유연한 스택을 구현할 수 있습니다. 이를 통해 다양한 타입의 데이터를 스택에 저장하고 활용할 수 있습니다.