자바 Queue 컬렉션 | 자바 입문강좌 45

자바 Queue 컬렉션

지난 학습에서 Stack 자료구조를 구현했습니다. 이번에는 Queue 의 실습입니다. Stack LIFO 이면 Queue는 FIFO 입니다.

컬렉션 프레임워크에서는 약간의 자유도를 부여합니다. ArrayList 나 LinkedList 등의 자료구조에 Queue 인터페이스를 함께 사용할 수 있습니다.

Queue 는 인터페이스이므로 LinkedList의 인스턴스를 참조변수로 받아서 사용합니다.

Queue 예제

Queue가 사용하는 메소드는 크게 세 가지입니다. offer 는 순서대로 데이터를 집어 넣습니다. poll 은 가장 처음에 넣은 자료를 가져옵니다. peek 은 지금 맨 앞에 있는 자료를 보여줍니다. LIFO 인 Stack 과 비교하면 방향만 틀릴 뿐입니다.

package com.kay;

import java.util.LinkedList;
import java.util.Queue;

public class Main {
    public static void main(String[] args) {
        Queue<MyMemo> q1 = new LinkedList<>();

        q1.offer(new MyMemo(1000, "First Memo"));
        q1.offer(new MyMemo(2000, "Second Memo"));
        q1.offer(new MyMemo(3000, "FIFO QUEUE"));

        System.out.println("[Queue elements]");
        System.out.println(q1);

        System.out.println("[Peek 엿보기]");
        q1.peek().showMemo();
        System.out.println("[poll 꺼내오기]");
        q1.poll().showMemo();

        System.out.println("[Queue elements]");
        System.out.println(q1);

        System.out.println("size : " + q1.size());
    }
}

class MyMemo{
    private int memoId;
    private String memoText;

    public MyMemo(int memoId, String memoText) {
        this.memoId = memoId;
        this.memoText = memoText;
    }
    public void showMemo(){
        System.out.print("this memo = " + this.toString() + ", ");
        System.out.print("memoId = " + memoId + ", ");
        System.out.print("memoText = " + memoText);
        System.out.println();
    }
}
[Queue elements]
[com.kay.MyMemo@27d6c5e0, com.kay.MyMemo@4f3f5b24, com.kay.MyMemo@15aeb7ab]
[Peek 엿보기]
this memo = com.kay.MyMemo@27d6c5e0, memoId = 1000, memoText = First Memo
[poll 꺼내오기]
this memo = com.kay.MyMemo@27d6c5e0, memoId = 1000, memoText = First Memo
[Queue elements]
[com.kay.MyMemo@4f3f5b24, com.kay.MyMemo@15aeb7ab]
size : 2

Queue 가 사용되는 분야는 어떤게 있을까요?

가장 쉽게는 음식점에 줄을 서는 것, 어디가서 줄을 서는 것은 Queue 방식입니다. 선착순 몇명 이라는 말은 큐와 의미가 동일합니다.

공장에서 식품을 만들면 유통기한이 시작되니까 먼저 만든 물건 부터 출하해야 합니다. 다른 상품도 유통기한이 있지만 신선식품들 같은 경우 FIFO 을 매우 정확하게 지켜야 합니다. 공장의 출고 시스템을 만든다면 항상 먼저 생산한 제품을 먼저 출고할 수 있도록 Queue 를 사용할 수 있습니다.

물론 다른 데이터 구조로도 재고관리가 가능합니다만, 순서를 지켜야만 출고가 가능하도록 Queue 를 사용한다면 나중에 제조된 식품이 먼저나가는 일은 없을 것 입니다.

쇼핑몰에서도 상품을 먼저 주문한 순서대로 배송을 합니다. 이것도 역시 Queue 자료형입니다. 만약 오후에 주문한 사람들의 제품을 오전에 주문한 사람들 보다 먼저 출고한다면 형평성에 맞지 않겠죠? (소비자가 모르면 괜찮겠지만 혹시라도 상품후기 같은 것으로 먼저 주문한 사람이 늦게 받았다는 것을 알게 되는 날에는 클레임이 걸릴 수 있습니다.

이 밖에 음식 배달서비스도 먼저 주문한 사람부터 음식이 나가야 합니다. 뭐 당연한 거죠.

이렇게 우리 일상생활 속의 수많은 곳에서 Queue 가 사용되고 있습니다. 한국 사람들은 유교적 사상으로 누가 먼저냐를 좀 많이 따지기도 하는데 문화적으로 먼저 들어온 것이 우선이다 는 생각은 중요한 것 같습니다.

Queue 나 Stack 이나 단순한 자료구조로 구현자체도 별로 어렵지 않습니다만, 어차피 컬렉션 프레임워크를 사용할 것이므로 컬렉션에서 어떻게 사용하는지 익혀둘 필요가 있습니다.

요약

자바 Queue 컬렉션에 대해서 알아봤습니다.

일상생활에서 본 Queue 의 원리에 대하여 생각하면서 컬렉션 프레임워크를 통하여 구현해봅니다.

외부참고문서

Guide to the Java Queue Interface | Baeldung

Queue Interface In Java – GeeksforGeeks

자바 Queue (jenkov.com)

자바 Stack and Queue | 컬렉션 프레임워크

Leave a Comment