스택 자료구조가 뭐고, 어떤 원리로 동작하는지, 실제로 어디에 쓰이는지 자바 예시와 함께 정리했습니다.
스택이란
데이터를 한쪽 끝(위)에서만 넣고 뺄 수 있는 자료구조입니다. 가장 나중에 넣은 데이터가 가장 먼저 나온다는 뜻에서 LIFO(Last In First Out) 구조라고 부릅니다. 책을 쌓아올렸다가, 맨 위에 있는 것부터 하나씩 빼는 모습을 떠올리면 됩니다.
기본 연산
- push: 맨 위에 데이터를 추가
- pop: 맨 위 데이터를 꺼내면서 제거
- peek: 맨 위 데이터를 제거하지 않고 확인만
import java.util.Stack;
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.peek()); // 3 (맨 위 확인, 제거 안 됨)
System.out.println(stack.pop()); // 3 (꺼내면서 제거)
System.out.println(stack.pop()); // 2
System.out.println(stack.pop()); // 1
3, 2, 1 순서로 넣었는데 꺼낼 때는 3, 2, 1 순서로 나옵니다. 가장 나중에 넣은 3이 가장 먼저 나오는 게 핵심입니다.
실제로 어디에 쓰이나
1) 함수 호출 관리 (콜 스택)
메서드가 다른 메서드를 호출하면, 호출한 메서드는 스택에 쌓이고 호출된 메서드가 끝나야 다시 이전 메서드로 돌아갑니다. 재귀 호출을 너무 깊게 하면 발생하는 StackOverflowError도 바로 이 콜 스택이 다 차서 생기는 문제입니다.
JVM 스레드 스택 크기는 고정된 하나의 숫자가 아니라 플랫폼마다 다른 기본값을 씁니다(Oracle 공식 문서 기준)
- Linux 64비트: 1024KB(1MB)
- macOS 64비트: 1024KB(1MB)
- Linux/Solaris 32비트: 320KB
- Windows: OS 가상 메모리 설정에 따라 달라짐(고정값 없음)
이 크기가 다 차면 StackOverflowError가 발생하는 거고, -Xss 옵션으로 직접 늘리거나 줄일 수 있습니다(예: -Xss2m).
2) 괄호 짝 검사
public boolean isValid(String s) {
Stack<Character> 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();
}
여는 괄호를 만나면 push하고, 닫는 괄호를 만나면 pop해서 짝을 맞춥니다. 마지막에 스택이 비어있으면 모든 괄호가 정확히 짝지어졌다는 뜻입니다.
3) 실행 취소(Undo) 기능
에디터에서 작업 하나하나를 스택에 쌓아두고, Ctrl+Z를 누르면 가장 최근 작업(맨 위)부터 하나씩 꺼내서 되돌리는 방식으로 구현합니다.
4) 브라우저 뒤로가기
방문한 페이지를 스택에 쌓아두고, 뒤로가기를 누르면 가장 최근에 방문한 페이지(맨 위)부터 꺼내서 보여줍니다.
마무리
스택은 "맨 위에서만 넣고 빼는 LIFO 구조"라는 한 가지 규칙만 기억하면 됩니다. 이 단순한 규칙 덕분에 괄호 검사, 실행 취소, 뒤로가기처럼 "가장 최근 것부터 처리해야 하는" 상황에 자연스럽게 들어맞습니다.
참조사이트
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
java
Launches a Java application. Description The java command starts a Java application. It does this by starting the Java Runtime Environment (JRE), loading the specified class, and calling that class's main() method. The method must be declared public and st
docs.oracle.com
'DEV > cs' 카테고리의 다른 글
| [CS] RESTful API란 - REST의 의미부터 쉽게 (0) | 2026.09.23 |
|---|---|
| [CS] Axios 사용법 정리 - 설치부터 인터셉터까지 (0) | 2026.09.22 |
| [CS] Call By Value vs Call By Reference 차이 (1) | 2026.09.19 |
| [CS] TCP vs UDP 비교 (0) | 2026.09.18 |
| [CS] 데드락(Deadlock)이란 - 발생 조건과 해결 방법 (0) | 2026.09.17 |