[Java] Queue 개념과 사용법(+예제)

Good_Day·2023년 3월 14일
0

자료구조

목록 보기
2/4

Queue란?

자료구조의 일종으로서
리스트성의 자료나 나열되는 자료, 순환적인 자료, 대기열 등에 사용됩니다.

Queue는 선입선출의 형식이며, "먼저 들어온 놈이 먼저 나간다" 라고 보시면 됩니다.
FIFO(First In First Out) 이런 식으로 표현하기도 합니다.

Queue는 특이하게 contains() 함수를 통해 어떠한 값이 포함되어있는지는 확인할 수 있지만
Index의 개념이 없어서 어떠한 값이 몇번째에 있는지는 알 수 없습니다.

이 그림과 같이 파란색 순서로 들어오고 그대로 똑같이 나갑니다.


⚙️ Queue의 선언 방법

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

Queue<객체> 변수명 = new LinkedList<객체>();
Queue와 LinkedList 유틸을 모두 import해줘야 정상적으로 사용 가능합니다.

⚙️Queue에 값을 추가하는 방법(add와 offer의 차이점)

que.offer(i);
que.add(i);
  • Queue변수.offer(값);
  • Queue변수.add(값);
    이렇게 2가지 방법이 있으며, 과정은 비슷하나 결과가 다릅니다.

이렇게 add와 offer 모두 값을 추가 시도한 결과에 대해 true를 리턴하고 있지만,
값 추가에 실패했을 경우

add - IllegalStateException
offer - false

를 리턴하게 됩니다. 이런 실패 경우의 차이가 있기 떄문에 offer를 사용하는 것이 더 좋다고 합니다.

⚙️ Queue 값 출력

que.peek();

Queue변수.peek();
이렇게 사용할 경우 현재 Queue의 가장 먼저 들어간 값, 가장 먼저 출력될 값이 출력되게 됩니다.
Queue가 현재 비어있을 경우 null을 return하기 때문에, 조건식에서도 사용됩니다.

⚙️ Queue 값 삭제(출력)

que.poll();
que.clear();
que.remove();
  • Queue변수.poll();
  • Queue변수.clear();
  • Queue변수.remover();

와 같이 사용할 수 있으며, 각각의 차이를 확인해보겠습니다.

clear - Queue를 비움
poll - 첫번째 값 삭제 / remove - 첫번째 값 삭제

add와 offer의 차이처럼 poll과 remove에도 차이점이 존재합니다.
값 추가 당시에도 return 타입이 달랐던 것처럼
값 출력 및 삭제할 때,
poll은 NoSuchElementException / remove는 null을 return합니다.
poll과 remove는 값이 있을 경우에는 첫번째 값을 출력하면서 삭제처리를 하기 때문에,
출력이나 값 비교 등에도 사용이 가능합니다.

위의 모든 예제를 활용하여 만든 예제입니다.
Queue의 첫번째 값을 출력했을 때와 Queue 자체를 출력했을 때의 출력형식이 다르다는 점을 알 수 있습니다.

import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
	
public class Main{
	
	public static void main(String[] args) throws IOException{

		Queue<Integer> que = new LinkedList<Integer>();	// Queue 변수 생성
		int tmp = 0;
		
		for(int i = 1; i <= 5; i++) {
			que.offer(i);	// 값 추가
		}
		
		System.out.println(que);
		
		for(int i = 1; i <= 5; i++) {
			tmp = que.peek();	// 첫번째 값 return
			que.offer(tmp);		// 값 추가
			System.out.println(que.remove());	// 첫번째 값 삭제 및 출력
		}
		
		System.out.println("-----------------------");
		
		for(int i = 1; i <= 5; i++) {
			que.offer(i);		// 값 추가
		}
		System.out.println(que);
		
		que.offer(que.poll());	// 첫번째 값을 출력하면서 삭제함과 동시에 값을 추가 = 첫번째 값을 맨 뒤로 보냄
		
		System.out.println(que);
	}
}
profile
여신코어뱅킹 개발자

0개의 댓글