본문 바로가기
Java

[Java] Queue 구현 예제

by teamnova 2025. 4. 7.
728x90

1. Queue 구현
1.1. Queue의 개념
Queue는 선입선출(FIFO, First In First Out) 방식의 자료구조입니다. 먼저 들어온 데이터가 먼저 나가는 구조입니다. 일상적인 예로는 줄 서기를 생각할 수 있습니다. 앞에 있는 사람이 먼저 나가는 구조입니다.

1.2. 구현 방법
Queue는 배열을 사용하여 구현할 수 있으며, front와 rear 포인터를 관리하면서 큐의 앞부분과 뒷부분을 추적합니다. 배열을 이용한 고정 크기 큐를 구현할 수 있습니다.

1.3. Queue의 기능
enqueue(value): Queue에 값을 추가.
dequeue(): Queue에서 값을 제거하고 반환.
peek(): Queue의 맨 앞 값을 확인(삭제하지 않음).
isEmpty(): Queue가 비었는지 확인.
isFull(): Queue가 꽉 찼는지 확인.

 

1.5. Queue의 장점과 단점
장점:
선입선출(FIFO) 구조 덕분에 작업 큐, 버퍼 관리, 이벤트 처리 시스템 등에서 유용하게 사용됨.
예를 들어 프린터 대기열, 네트워크 패킷 처리 등에 많이 사용됨.

단점:
고정 크기로 구현되면 크기 한계가 존재하고, 큐에서 데이터를 삭제하는 과정이 비효율적일 수 있음.
배열을 사용할 경우 큐의 데이터 삭제가 연속적으로 이루어지기 때문에 큐의 앞부분에서 공간이 남게 되어 메모리 낭비가 발생할 수 있음.

 

1.6 예제 코드

// Queue 클래스 구현 (배열 기반)
class Queue {
    private int maxSize;
    private int front;
    private int rear;
    private int[] queueArray;

    // Queue 생성자
    public Queue(int size) {
        maxSize = size;
        queueArray = new int[size];
        front = 0;
        rear = -1;
    }

    // Queue가 비어있는지 확인
    public boolean isEmpty() {
        return rear < front;
    }

    // Queue가 꽉 찼는지 확인
    public boolean isFull() {
        return rear == maxSize - 1;
    }

    // Queue에 데이터 삽입
    public void enqueue(int value) {
        if (isFull()) {
            System.out.println("Queue is full. Cannot enqueue " + value);
        } else {
            queueArray[++rear] = value;  // rear 값을 증가시키고 값을 삽입
            System.out.println(value + " enqueued to queue");
        }
    }

    // Queue에서 데이터 추출
    public int dequeue() {
        if (isEmpty()) {
            System.out.println("Queue is empty. Cannot dequeue");
            return -1;
        } else {
            return queueArray[front++];  // front 값을 반환하고 front를 증가시킴
        }
    }

    // Queue의 맨 앞 값을 확인
    public int peek() {
        if (isEmpty()) {
            System.out.println("Queue is empty. Cannot peek");
            return -1;
        } else {
            return queueArray[front];  // 맨 앞 값을 반환
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Queue queue = new Queue(5);  // Queue 크기 5로 생성

        queue.enqueue(10);  // 10 삽입
        queue.enqueue(20);  // 20 삽입
        queue.enqueue(30);  // 30 삽입
        queue.enqueue(40);  // 40 삽입

        System.out.println("Front element is: " + queue.peek());  // Queue의 front 확인

        System.out.println(queue.dequeue() + " dequeued from queue");  // 10 추출
        System.out.println(queue.dequeue() + " dequeued from queue");  // 20 추출

        System.out.println("Front element is: " + queue.peek());  // Queue의 front 확인
    }
}

 

시연 결과