본문 바로가기
Language/Java

[JAVA] Stack과 Queue의 심층 분석 : 설계 철학부터 실무 활용 구현체까지

by Papa Martino V 2026. 1. 18.
728x90

Stack과 Queue
Stack과 Queue

 

컴퓨터 과학의 가장 기본이 되는 자료구조를 꼽으라면 단연 Stack(스택)Queue(큐)일 것입니다. 자바(Java)는 이 추상적인 개념들을 단순한 라이브러리 제공을 넘어, 객체지향 설계 원칙에 따라 정교하게 구현해 두었습니다. 오늘은 자바 개발자로서 이 두 구조의 메커니즘을 이해하고, 실무에서 어떤 구현체를 선택하는 것이 최선인지 깊이 있게 탐구해 보겠습니다.

1. Stack: 마지막에 들어온 데이터가 먼저 나간다 (LIFO)

스택은 LIFO(Last-In, First-Out) 원칙을 따릅니다. 마치 식당에 쌓여 있는 접시 더미와 같습니다. 가장 마지막에 올려둔 접시를 가장 먼저 집어 들게 되는 원리입니다. 자바에서 스택은 메서드 호출의 실행 컨텍스트(Stack Frame)를 관리하거나, 뒤로 가기(Undo) 기능을 구현할 때 핵심적인 역할을 수행합니다.

Java에서의 Stack 구현: java.util.Stack

자바에는 Stack 클래스가 존재하지만, 현대적인 개발에서는 사용이 권장되지 않는 경우가 많습니다. 그 이유는 Vector 클래스를 상속받아 모든 메서드에 synchronized가 걸려 있어 성능 오버헤드가 발생하기 때문입니다. 대신 Deque(Double Ended Queue) 인터페이스의 구현체인 ArrayDeque를 사용하는 것이 성능 면에서 훨씬 유리합니다.

2. Queue: 먼저 들어온 데이터가 먼저 나간다 (FIFO)

큐는 FIFO(First-In, First-Out) 원칙을 따릅니다. 은행 창구의 줄서기나 프린터의 출력 대기열을 생각하면 쉽습니다. 데이터가 한쪽(Rear)으로 들어와서 반대쪽(Front)으로 나가는 파이프 구조입니다. 자바에서는 주로 프로세스 간 통신, 메시지 큐, 혹은 스케줄링 알고리즘에서 빈번하게 사용됩니다.

Java에서의 Queue 구현체

  • LinkedList: 큐 인터페이스를 구현하는 가장 대표적인 클래스입니다. 양방향 연결 리스트 구조로 데이터의 삽입과 삭제가 빈번할 때 효율적입니다.
  • PriorityQueue: 들어온 순서가 아닌 '우선순위'에 따라 데이터를 내보냅니다. 내부적으로 힙(Heap) 자료구조를 사용합니다.
  • ArrayDeque: 별도의 동기화가 필요 없는 환경에서 스택과 큐 양쪽 용도로 최상의 성능을 보여주는 팔방미인 구현체입니다.

3. Stack과 Queue의 핵심 비교 및 구현체 가이드

두 자료구조의 특성과 자바 내 주요 구현체를 한눈에 비교할 수 있도록 정리했습니다.

항목 Stack (스택) Queue (큐)
기본 원리 LIFO (후입선출) FIFO (선입선출)
데이터 삽입/삭제 Push / Pop Offer (Enqueue) / Poll (Dequeue)
표준 구현체 java.util.Stack (Legacy) LinkedList, PriorityQueue
권장 구현체 ArrayDeque (Stack 대용) ArrayDeque, ConcurrentLinkedQueue
주요 활용 사례 DFS 탐색, 수식 계산, 실행 취소 BFS 탐색, 작업 대기열, 캐시 구현

4. 실무를 위한 팁: 왜 ArrayDeque인가?

많은 입문자가 스택이 필요할 때 Stack 클래스를, 큐가 필요할 때 LinkedList를 선택합니다. 하지만 자바 공식 문서에 따르면, 단일 스레드 환경에서 스택 구조가 필요할 때는 Stack 클래스보다 ArrayDeque를 사용하라고 명시하고 있습니다. ArrayDeque는 내부적으로 가변 배열을 사용하여 LinkedList보다 메모리 효율이 좋고, Stack 클래스처럼 불필요한 동기화 비용을 지불하지 않기 때문에 가장 빠른 속도를 보장합니다.

5. 결론: 목적에 맞는 최적의 선택

자료구조의 이해는 단순한 암기가 아니라 상황에 맞는 '도구 선택'의 문제입니다. 데이터의 출입 순서가 중요하다면 StackQueue의 기본 원리를 먼저 떠올리십시오. 그리고 자바 환경에서는 성능과 멀티스레드 안전성(Thread-safety)을 고려하여 ArrayDequeBlockingQueue 계열의 구현체를 적재적소에 배치하는 것이 진정한 전문가의 모습일 것입니다.


내용 출처 및 참고 문헌

  • Oracle Java Documentation: Class Stack<E>
  • Oracle Java Documentation: Interface Deque<E> (ArrayDeque)
  • Robert Lafore, Data Structures and Algorithms in Java, Sams Publishing.
  • Baeldung: A Guide to the Java LinkedList Class
728x90