본문 바로가기
카테고리 없음

Java Deque 사용법 및 예제 10가지

by softitscream 2025. 3. 27.
반응형
Java Deque 사용법 및 예제

Java에서 Deque는 "Double Ended Queue"의 약자로, 양쪽 끝에서 삽입과 삭제가 가능한 자료구조입니다. Deque는 스택과 큐의 특성을 모두 가지고 있어, 다양한 상황에서 유용하게 사용될 수 있습니다. 이번 포스트에서는 Deque의 기본 사용법과 다양한 예제를 통해 실용적인 팁을 제공하겠습니다.

Deque의 기본 사용법

Java에서 Dequejava.util.Deque 인터페이스를 통해 구현됩니다. 가장 일반적으로 사용되는 구현체는 ArrayDequeLinkedList입니다. 이들 각각의 특성과 사용법을 간단히 살펴보겠습니다.

1. ArrayDeque의 사용법

ArrayDeque는 배열 기반의 Deque 구현체입니다. 이 구현체는 빠른 접근 속도를 제공하며, 동적 크기 조정이 가능합니다. 기본적인 사용법은 다음과 같습니다.


Deque<String> deque = new ArrayDeque<>();
deque.add("첫 번째");
deque.add("두 번째");
deque.addFirst("맨 앞에 추가");
deque.addLast("맨 뒤에 추가");
String first = deque.removeFirst(); // "맨 앞에 추가" 반환
String last = deque.removeLast(); // "맨 뒤에 추가" 반환
    

2. LinkedList를 이용한 Deque 사용법

LinkedList는 노드 기반의 Deque 구현체로, 삽입 및 삭제가 빈번한 경우에 유리합니다. 사용 예시는 다음과 같습니다.


Deque<Integer> linkedDeque = new LinkedList<>();
linkedDeque.add(1);
linkedDeque.add(2);
linkedDeque.addFirst(0); // 0 추가
linkedDeque.removeLast(); // 2 삭제
    

3. Deque의 주요 메소드

Deque는 다양한 메소드를 제공합니다. 주요 메소드는 다음과 같습니다:

메소드 설명
addFirst(E e) 맨 앞에 요소 추가
addLast(E e) 맨 뒤에 요소 추가
removeFirst() 맨 앞 요소 제거
removeLast() 맨 뒤 요소 제거
peekFirst() 맨 앞 요소 확인
peekLast() 맨 뒤 요소 확인

실용적인 사례 1: 웹 브라우저의 뒤로 가기, 앞으로 가기 기능

웹 브라우저는 사용자가 방문한 페이지의 히스토리를 관리하는 데 Deque를 활용합니다. 사용자가 페이지를 방문할 때마다 현재 페이지를 Deque에 추가하고, '뒤로 가기' 버튼이 눌릴 때는 맨 마지막에 추가된 페이지를 제거하여 이전 페이지로 이동합니다.

예를 들어, 사용자가 페이지 A에서 B로 이동하고, 다시 C로 이동했다면, Deque는 다음과 같이 관리됩니다:


Deque<String> history = new ArrayDeque<>();
history.add("A");
history.add("B");
history.add("C");
String back = history.removeLast(); // "C" 제거 후 "B"를 보여줌
    

이러한 방식으로 사용자는 간편하게 이전 페이지로 돌아갈 수 있습니다.

실용적인 사례 2: 작업 스케줄링

Deque는 작업 스케줄링 시스템에서도 유용하게 사용됩니다. 예를 들어, 대기 중인 작업을 관리할 때, 먼저 들어온 작업을 먼저 처리하는 방식(FIFO)을 유지하면서도, 특정 작업을 우선적으로 처리해야 할 경우(우선 작업 추가) 맨 앞에 추가할 수 있습니다.

다음은 간단한 작업 스케줄링 시스템의 예입니다:


Deque<String> taskQueue = new ArrayDeque<>();
taskQueue.add("작업1");
taskQueue.add("작업2");
taskQueue.addFirst("우선 작업");
String nextTask = taskQueue.removeFirst(); // "우선 작업" 처리
    

이처럼 Deque를 활용하면 유연한 작업 처리가 가능합니다.

실용적인 사례 3: Undo/Redo 기능

소프트웨어에서는 사용자가 수행한 작업을 되돌리거나 다시 실행하는 Undo/Redo 기능이 매우 중요합니다. Deque를 사용하면 이러한 기능을 쉽게 구현할 수 있습니다.

예를 들어, 사용자가 텍스트 편집기에서 다음과 같은 작업을 수행했다고 가정해봅시다:


Deque<String> undoStack = new ArrayDeque<>();
Deque<String> redoStack = new ArrayDeque<>();

undoStack.add("입력1");
undoStack.add("입력2");
String lastAction = undoStack.removeLast(); // "입력2" 제거하고 undoStack에서 삭제
redoStack.add(lastAction); // redoStack에 추가
    

이러한 구조로 사용자는 쉽게 이전 작업으로 되돌아가거나 다시 실행할 수 있습니다.

실용적인 팁 5가지

팁 1: ArrayDeque vs LinkedList 선택하기

Deque를 사용할 때, ArrayDequeLinkedList 중 무엇을 선택할지 고민해야 합니다. ArrayDeque는 특정 상황에서 더 빠른 성능을 제공하지만, LinkedList는 빈번한 삽입 및 삭제가 필요한 경우 더 적합합니다. 일반적으로 읽기 성능이 중요한 경우 ArrayDeque를, 삽입과 삭제가 잦은 경우 LinkedList를 선택하는 것이 좋습니다.

팁 2: peek 메소드 활용하기

Deque에서 요소를 제거하지 않고 확인하고 싶다면 peekFirst()peekLast() 메소드를 활용하세요. 이 메소드는 각각 맨 앞과 맨 뒤의 요소를 반환하지만, Deque의 상태는 변경하지 않습니다. 이러한 기능은 여러 작업을 수행하기 전 상태를 확인할 때 유용합니다.

팁 3: 초기 용량 지정하기

ArrayDeque를 사용할 때 초기 용량을 지정하면 메모리 관리에 도움이 됩니다. 기본적으로 초기 용량은 16이지만, 예상되는 요소 수에 따라 초기 용량을 조정하면 성능을 최적화할 수 있습니다. 예를 들어, 예상되는 요소 수가 1000이라면 다음과 같이 설정할 수 있습니다:


Deque<String> deque = new ArrayDeque<>(1000);
    

팁 4: 병렬 처리 시 Deque 사용 주의

여러 쓰레드에서 Deque를 동시에 접근할 경우, 동기화 문제로 인해 데이터 무결성이 깨질 수 있습니다. 이 경우 ConcurrentLinkedDeque와 같은 동기화된 Deque 구현체를 사용하여 안전하게 작업할 수 있습니다. 이 방법을 통해 멀티쓰레드 환경에서도 안전하게 데이터를 관리할 수 있습니다.

팁 5: Deque의 다양한 활용

Deque는 단순한 자료구조가 아니라 다양한 알고리즘에서 활용될 수 있습니다. 예를 들어, BFS(너비 우선 탐색)와 같은 그래프 탐색 알고리즘에서도 Deque를 활용하여 효과적으로 노드를 관리할 수 있습니다. Deque의 특성을 활용하여 다양한 데이터 구조를 구현해보는 것도 좋은 접근입니다.

요약 및 실천 팁


이번 포스트에서는 Java의 Deque에 대해 알아보았습니다. Deque는 양쪽 끝에서 삽입과 삭제가 가능한 유용한 자료구조로, 웹 브라우저의 히스토리 관리, 작업 스케줄링, Undo/Redo 기능 등 다양한 사례에서 활용됩니다. 실용적인 팁을 통해 성능을 최적화하고, 상황에 맞는 구현체를 선택하는 것이 중요합니다.

마지막으로, Deque를 실제로 사용해보며 다양한 상황에서 어떻게 활용할 수 있을지 고민해보세요. 이러한 경험은 여러분의 프로그래밍 실력을 한 단계 끌어올리는 데 큰 도움이 될 것입니다.

반응형