Java

[Java] Queue 구현 예제

teamnova 2025. 4. 7. 12:00
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 확인
    }
}

 

시연 결과