[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>
를 생성하여 문자열 데이터를 저장합니다.
결론
제네릭을 활용하여 여러 자료형을 저장할 수 있는 유연한 스택을 구현할 수 있습니다. 이를 통해 다양한 타입의 데이터를 스택에 저장하고 활용할 수 있습니다.