Queue [Interface]

Sungjoon Ha·2022년 11월 1일
0

자료구조

목록 보기
1/2
post-thumbnail

Queue: 순차적으로 값이 들어오고 나가는 연속적인 데이터들의 집합

A collection designed for holding elements prior to processing.
값을 처리하기전 가지고 있도록 설계된 자료구조
[Java공식문서 중 발췌]

자 이게 무슨말이냐 하면, 값이 순차적으로 들어오고 나가는
FIFO (First In First Out)방식을 쓴다는 이야기다.

예를 들어서 매표소에 기다리고 있는 차례를 기다리고 있는 줄 처럼 말이다

출처: https://coding-factory.tistory.com/602, https://www.freecodecamp.org/news/queue-data-structure-definition-and-java-example-code/


큐(Queue)는?

  • 인터페이스 이기에 구현체를 사용해서 구현해야 한다
  • 한쪽 끝은 프런트(front)로 정하여 삭제 연산만 수행
  • 한쪽 끝은 리어(rear)로 정하여 삽입 연산만 수행

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

//선언 및 구현체 구현
Queue<T> queue = LinkedList<>();

T는 제네릭스(Generics)로 참조타입 이 들어오면 된다
(ex) Integer, String...)
참고로 제네릭스 뒤의 타입추론은 Java7 버전부터 가능해짐!

사용법

//종류
Queue<Integer> queue = new LinkedList<>();
Queue<Integer> queue = new PriorityQueue<>();
Queue<Integer> queue = new ConcurrentLinkedQueue<>();
//노드에 기반한 스레드세이프한 큐
//java util은 멀티스레드 환경에서 critical section에 대한 동기화가 적용되어 있지 않음
//(critical section = 공유자원의 독점을 보장해주는것)
출처: https://sup2is.github.io/2019/09/10/concurrent-linked-queue.html

Queue<Integer> queue = new LinkedBlockingQueue<>();
Queue<Integer> queue = new LinkedTransferQueue<>();

Queue<Integer> queue = new SynchronousQueue<>();
//다른 스레드의 remove요청이 있을때까지 insert할 수 없음 -> 잠깐 머무는 로그를 찍기위해 있는건가?
//peek안됨 -> 삭제하려고 할때만 엘리멘트가 있기 때문
//queued된 스레드가 없으면 poll시 null 반환
//iterate할 것이 없어서 iterate도 안됨  
//empty collection처럼 행동함

//등등 사실 몇개 더 있지만, Generic이 Object라서 따로 더 구현을 해줘야 되는것은 포함하지 않음
//DelayQueue 같은 녀석...

메서드 (Queue에서 정의된)

추가

boolean add(E e);
boolean offer(E e);

		Queue<Integer> queue = new LinkedList<>();

		queue.add(1);
		queue.add(2);
		queue.add(3);

		Queue<Integer> queue2 = new LinkedList<>();
		queue2.offer(1);
		queue2.offer(2);
		queue2.offer(3);

		System.out.println("add queue:" + queue);
		System.out.println("offer queue2:" + queue2);
        
        //출력
        add queue:[1, 2, 3]
		offer queue2:[1, 2, 3]
       

맨 윗값 꺼내기

E poll();
E element();

		System.out.println("queue peek: " + queue.peek());
		System.out.println("queue element: " + queue.element());
        
        //출력
        queue peek: 1
		queue element: 1

맨 윗값 삭제하기

E remove();
E poll();

		System.out.println("queue remove: " + queue.remove());
		System.out.println("queue poll: " + queue.poll());
        
        System.out.println("queue: " + queue);
        
        //출력
        queue remove: 1 
		queue poll: 2  //맨 윗값 이였던 1이 빠지고난 이후이므로
        
        queue: [3]
        
//수행실패시 Exception 발생
add(e) 해당 element 큐에 삽입/true 반환
remove() 
element()

//수행실패시 null 또는 false
offer(e)
poll()
peek()
profile
데이터 엔지니어 & 백엔드 개발자

0개의 댓글

관련 채용 정보