728x90
Java를 활용하다 보면 데이터를 임시로 저장하거나 순서대로 처리해야 할 때가 있습니다. 이때 사용할 수 있는 자료 구조 중 하나가 스택(Stack)입니다.
이 글에서는 Java의 스택에 대해 알아보고, 사용 방법과 예제를 통해 그 장단점을 살펴보겠습니다.
스택(Stack)이란❓
스택(Stack)은 위 그림에서 보면 알 수 있듯이 데이터를 쌓아 올리듯 저장하고, 나중에 저장한 데이터를 먼저 꺼내는 후입선출(LIFO, Last In First Out) 방식을 따릅니다.
특징
- 후입선출(LIFO) 방식으로 데이터를 저장하고 처리합니다.
- push() 메서드로 데이터를 스택에 추가하고, pop() 메서드로 가장 최근에 추가된 데이터를 제거하며 반환합니다.
- peek() 메서드는 스택의 맨 위에 있는 데이터를 반환하지만 제거하지는 않습니다.
Stack의 장단점
장점
- 데이터를 저장하거나 처리할 때 사용하기 편리합니다.
- 구현이 간단하여 쉽게 이해하고 사용할 수 있습니다.
- 후입선출 방식으로 데이터를 관리하기 때문에 일부 문제에 효율적입니다.
단점
- 스택의 크기가 고정되어 있어 넘치는 데이터를 처리하기 어렵습니다.
- 특정 상황에서 다른 자료 구조보다 처리 속도가 느릴 수 있습니다.
Stack의 선언방식
import java.util.Stack;
Stack<Integer> stack = new Stack<>();
Stack 주의사항❗️
- 스택에서 데이터를 꺼내려 할 때 비어있는 상태에서 pop() 또는 peek() 메서드를 호출하면 예외가 발생할 수 있으므로, 항상 isEmpty() 메서드로 스택이 비어있는지 확인하는 것이 좋습니다.
- 스택의 크기를 고려하여 사용해야 하며, 데이터의 추가와 제거를 신중하게 관리해야 합니다.
예외 발생 코드 예제
import java.util.*;
public class Main {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
// 비어 있는 스택에서 pop() 호출 시 예외 발생
int element = stack.pop(); // EmptyStackException 발생
System.out.println("Pop된 요소: " + element);
}
}
예외 처리 코드 예제
import java.util.*;
public class Main {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
// 비어 있는 스택에서 pop() 호출을 try-catch 대신 if 문으로 보완
if (!stack.isEmpty()) {
int element = stack.pop();
System.out.println("Pop된 요소: " + element);
} else {
System.out.println("스택이 비어 있어 pop할 수 없습니다.");
// 다른 처리 로직을 추가할 수도 있음
}
}
}
위와 같이 스택이 비어 있는지 확인한 후, 비어 있지 않은 경우에만 pop() 메서드를 호출하고 그렇지 않은 경우에는 적절한 메시지를 출력합니다.
이렇게 하면 EmptyStackException을 예방하고 스택이 비어 있을 때의 상황을 안전하게 처리할 수 있습니다.
스택(Stack)의 메서드
메서드 | 설명 | |
push(E) | 스택에 값 추가 | |
peek() | 가장 상단 값 반환 | |
pop() | 가장 상단 값 반환 & 제거 | |
clear() | 전체 값 제거 (반환x) | |
size() | 크기 반환 | |
isEmpty() | 비었으면 true, 아니라면 false 반환 | |
contains(E) | 해당 값이 있으면 true 없으면 false 반환 | |
check(E) | 해당 값이 끝에서 부터 몇번째에 있는지 반환 (없으면 -1 반환) |
push(E item)
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
- 스택의 맨 위에 요소를 추가합니다.
- 매개변수로 추가할 요소를 받습니다.
pop()
int poppedElement = stack.pop();
- 스택의 맨 위에 있는 요소를 제거하고 반환합니다.
- 스택이 비어있을 경우 EmptyStackException을 발생시킵니다.
isEmpty()
boolean isEmpty = stack.isEmpty();
- 스택이 비어있는지 여부를 반환합니다.
peek()
int topElement = stack.peek();
- 스택의 맨 위에 있는 요소를 반환합니다. 제거하지 않습니다.
- 스택이 비어있을 경우 EmptyStackException을 발생시킵니다.
search(Object o)
int index = stack.search(2); // 2라는 요소의 위치를 찾음
- 스택에서 주어진 객체를 찾아서 위치(index)를 반환합니다. 스택의 맨 위(가장 나중에 추가된 요소)를 1로 시작하여 인덱스를 지정합니다.
- 찾고자 하는 객체가 스택에 없을 경우 -1을 반환합니다.
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
// 요소 추가
stack.push(1);
stack.push(2);
stack.push(3);
// 요소 제거
int poppedElement = stack.pop();
System.out.println("Popped element: " + poppedElement);
// 맨 위 요소 조회
int topElement = stack.peek();
System.out.println("Top element: " + topElement);
// 스택이 비어 있는지 확인
boolean isEmpty = stack.isEmpty();
System.out.println("Is stack empty? " + isEmpty);
// 요소 검색
int index = stack.search(2);
System.out.println("Index of element 2: " + index);
}
}
//
Popped element: 3
Top element: 2
Is stack empty? false
Index of element 2: 1
//
'자료구조' 카테고리의 다른 글
[자료구조 JAVA] 선형 구조 큐(Queue) 클래스 알아보기 ✔ (0) | 2024.06.15 |
---|---|
[자료구조 JAVA] LinkedHashSet 알아보기 (1/2) (0) | 2024.06.15 |
[JAVA] HashMap 이란 ❓ (1/2) (1) | 2024.06.05 |
[JAVA] ArrayList 알아보기 (동적 배열) (0) | 2024.05.11 |
[자료구조] 스택 stack 알아보기 With JavaScript (0) | 2024.04.28 |