데이터를 보관함에 넣고 빼는 순서의 법칙인 **LIFO(후입선출)**와 FIFO(선입선출),
그리고 이를 구현한 Stack과 Queue
📘 LIFO와 FIFO: "누가 먼저 나가는가?"
데이터가 들어온 순서에 따라 나가는 순서가 정해지는 두 가지 방식입니다.
- LIFO (Last-In, First-Out): 마지막에 들어온 데이터가 가장 먼저 나가는 방식 (후입선출).
- FIFO (First-In, First-Out): 먼저 들어온 데이터가 가장 먼저 나가는 방식 (선입선출).
📦 핵심 컬렉션 도구
1. Stack (프링글스 통 / 쌓아둔 접시)
- 특징: LIFO 방식을 따릅니다.
- 설명: 한쪽 끝에서만 데이터를 넣고 뺄 수 있는 구조입니다. 맨 위에 쌓인 것부터 꺼내야 하므로 가장 나중에 넣은 데이터가 가장 먼저 나오게 됩니다.
- 주요 메서드:
- push(): 데이터를 맨 위에 쌓기
- pop(): 맨 위의 데이터를 꺼내기 (삭제됨)
- peek(): 맨 위의 데이터가 무엇인지 확인만 하기
Java
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<String> pringles = new Stack<>();
// 데이터 넣기 (아래서부터 쌓임)
pringles.push("어니언맛");
pringles.push("치즈맛");
pringles.push("오리지널맛"); // 마지막에 넣음
System.out.println("현재 스택: " + pringles);
// 데이터 꺼내기 (맨 위에서부터 나옴)
String out = pringles.pop();
System.out.println("꺼낸 과자: " + out); // 오리지널맛이 나옴
System.out.println("남은 과자: " + pringles);
}
}
2. Queue (줄 서기 / 터널)
- 특징: FIFO 방식을 따릅니다.
- 설명: 한쪽(뒤)에서는 넣고, 다른 쪽(앞)에서는 빼는 구조입니다. 먼저 줄을 선 데이터가 먼저 서비스를 받는 아주 공평한 방식입니다.
- 주요 메서드:
- offer(): 데이터를 뒤에 추가하기
- poll(): 맨 앞의 데이터를 꺼내기 (삭제됨)
- peek(): 맨 앞의 데이터 확인만 하기
Java
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
// 자바에서 Queue는 인터페이스이며 주로 LinkedList로 구현합니다.
Queue<String> line = new LinkedList<>();
// 데이터 넣기 (줄 서기)
line.offer("1번 손님");
line.offer("2번 손님");
line.offer("3번 손님");
System.out.println("현재 대기줄: " + line);
// 데이터 꺼내기 (먼저 온 순서대로)
String first = line.poll();
System.out.println("입장하신 분: " + first); // 1번 손님이 나옴
System.out.println("남은 대기줄: " + line);
}
}
👨🏫 실무 활용 사례
- Stack(LIFO):
- 웹 브라우저의 뒤로 가기: 가장 마지막에 방문한 페이지가 먼저 나옵니다.
- 문서 작업의 되돌리기(Undo): 가장 최근에 한 작업부터 취소됩니다.
- Queue(FIFO):
- 프린터 출력 대기열: 먼저 인쇄 버튼을 누른 문서가 먼저 출력됩니다.
- 은행 번호표: 먼저 번호표를 뽑은 사람부터 상담을 받습니다.
오늘의 요약
- Stack은 LIFO (나중에 온 녀석이 주인공).
- Queue은 FIFO (먼저 온 녀석이 임자).
- Stack은 단독 클래스로 존재하지만, Queue는 LinkedList 등을 통해 생성한다.
데이터의 흐름을 제어하는 가장 기본적이면서도 강력한 도구들을 마스터하셨습니다!

'JAVA 80%' 카테고리의 다른 글
| Decorator Stream (0) | 2025.11.06 |
|---|---|
| I/O Stream (0) | 2025.11.06 |
| Collection framework (0) | 2025.11.05 |
| Thread control (0) | 2025.11.05 |
| java.util package (0) | 2025.11.05 |