본문 바로가기
야놀자 테크스쿨/JAVA 자료구조

[JAVA][자료구조] JAVA Queue 사용법.

by 노잼인간이라불립니다 2023. 7. 16.

0. 개요

 코딩테스트를 준비하면서 필요한 java 자료구조와 메서드에 대해서 정리하고자 이 글을 남긴다. 나 같은 경우에는 평소에 queue를 사용해본적이 거의 없기 때문에 어렴풋이 queue가 java에서는 인터페이스로 구현되어 있는다는 사실을 알고만 있을 뿐 이었다.

 이번에 코딩테스트를 준비하면서 queue를 사용할만한 문제가 나와서 이번기회에 java에서 queue에 대한 메서드를 정리하고 이해하려고 이 글을 작성한다.

 

1. JAVA에서 구현된 queue 메서드

 이 글을 읽는 분들은 큐라는 자료구조에 대해서 이해가 있을 것이라고 생각한다. 선입선출의 대표적인 자료구조로써 많은 곳에 사용된다. 자! 그럼 자바에서 queue는 어떻게 구현해놓았는지 살펴보자!

 먼저 서두에서도 이야기 했듯이 자바에서는 큐가 인터페이스 형식으로 구현되어 있다. 큐에 대한 설명은 아래와 같다. 아래를 살펴보고 각각의 메서드를 살펴보자!

 

1) add()

 먼저 add 메소드는 말 그대로 큐에 엘리먼트를 집어넣어주는 메서드이다.  초록색문장을 한글로 번역해보면

"용량 제한을 위반하지 않고 즉시 수행할 수 있는 경우 지정된 요소를 이 큐에 삽입하고 성공 시 true를 반환하고 현재 사용 가능한 공간이 없으면 IllegalStateException을 발생시킵니다." 이다.

리턴 값은 모두 true를 반환하는 모양이다.

 

그외 exception은 다음과 같다.

"IllegalStateException – 용량 제한으로 인해 현재 요소를 추가할 수 없는 경우
ClassCastException – 지정된 요소의 클래스로 인해 이 대기열에 추가되지 않는 경우
NullPointerException – 지정된 요소가 null이고 이 큐가 null 요소를 허용하지 않는 경우
IllegalArgumentException – 이 요소의 일부 속성으로 인해 이 대기열에 추가되지 않는 경우"

 

 2) offer()

 바로 내용을 살펴보자.

"용량 제한을 위반하지 않고 즉시 수행할 수 있는 경우 지정된 요소를 이 큐에 삽입합니다. 용량이 제한된 대기열을 사용할 때 이 방법은 일반적으로 예외를 throw하는 것만으로 요소를 삽입하지 못할 수 있는 add보다 선호됩니다."

 

add메서드와 언뜻보면 다르지만 return값이 add와는 미묘하게 다르다. 여기서는 성공하면 true, 실패하면 false값을 반환한다.

 

그외 exception은 다음과 같다.

"ClassCastException – 지정된 요소의 클래스로 인해 이 대기열에 추가되지 않는 경우
NullPointerException – 지정된 요소가 null이고 이 큐가 null 요소를 허용하지 않는 경우
IllegalArgumentException – 이 요소의 일부 속성이 실행을 방해하는 경우"

 

 

3) remove()

"이 대기열의 헤드를 검색하고 제거합니다. 이 메서드는 이 대기열이 비어 있는 경우 예외를 발생시킨다는 점에서만 poll()과 다릅니다."

내용을 보니 poll과 흡사한듯 하다.

 

exception은 다음과 같다.

"NoSuchElementException – 이 대기열이 비어 있는 경우"

 

4) poll()

"이 대기열의 헤드를 검색 및 제거하거나 이 대기열이 비어 있으면 null을 반환합니다."

remove는 큐가 비어있다면 exception을 발생시키는데 반해 poll은 null을 반환한다는 것을 알 수 있다. 그 외는 두 메서드 모두 동일하다.

 

5) element()

"이 대기열의 헤드를 검색하지만 제거하지는 않습니다. 이 메서드는 이 대기열이 비어 있는 경우 예외를 발생시킨다는 점에서만 엿보기와 다릅니다."

이것도 remove와 poll의 관계와 비슷하다. remove와 같이 큐에 아무것도 없이 이 메서드를 실행시키면 exception이 발생한다.

 

 

6) peek()

"이 대기열의 헤드를 검색하지만 제거하지는 않습니다. 이 대기열이 비어 있으면 null을 반환합니다."

poll과 마찬가지로 큐가 비어 있다면 null을 반환한다. 대신 poll은 검색과 제거를 동시에 진행하지만 peek은 검색만 진행한다.

 

2. 정리

java에서는 queue를 인터페이스로 정의하고 있다.

 

 사용할 수 있는 선언된 메소드는 add(), offer(), remove(), poll(), element(), peek()이다. 각각 add(), remove(), element()는 성공하지 못했을 경우 exception이 발생하고 offer(), poll(), peek()은 exception이 발생하지 않는다.

 그리고 주석에서 알려줬듯이 offer와 poll과 peek이 좀 더 선호되는 모양이다. 앞으로 queue를 이용해서 알고리즘을 작성할 때에는 

 

offer(): 지정된 요소를 이 큐에 삽입합니다. 

poll(): 이 대기열의 헤드를 검색 및 제거합니다. 또는 대기열이 비어 있으면 null을 반환합니다.

peek(): 이 대기열의 헤드를 검색하지만 제거하지는 않습니다. 이 대기열이 비어 있으면 null을 반환합니다.

 

의 내용을 잘 기억하면서 구현해야 할 예정이다!