# queue 이란?
큐는 선입선출(FIFO - First in First Out)의 특성을 가지는 자료구조이다. 이전 포스트의 stack 과 굉장히 유사한 개념인데, 스택은 제일 최근에 들어온 게 제일 먼저 나가는 형식이었다면, 큐는 제일 먼저 들어온 게 제일 먼저 나가는 방식이다! 예를 들어서, 편의점에서 새로운 음료수가 입고되면 기존 음료수 재고의 맨 뒤에 넣게된다. 이럴 경우 자연스럽게 제일 먼저 들어왔던 음료수가 제일 먼저 팔리게 된다! 이렇게 먼저 들어온 것이 먼저 나가는 것을 선입선출이라고 한다. Queue 는 한글로 '줄을 서다' 라는 뜻이 있는데, 놀이공원에 가서 제일 앞에 사람이 제일 먼저 놀이기구를 타는 것을 생각하면 이해가 쉬울 것 같다!
# queue 선언
import java.util.LinkedList; //import
import java.util.Queue; //import
Queue<Element> queue = new LinkedList<>();
큐도 스택과 마찬가지로 원하는 Element 에 맞게 queue를 선언할 수 있다. 예를 들어 int 형 큐를 선언하고 싶다면, Queue<Integer> queue = new LinkedList<>(); String 형 큐를 선언하고 싶다면 Queue<String> queue = new LinkedList<>(); 으로 선언해주면 된다.
# queue 값 추가 (Enqueue) 및 삭제 (Dequeue)
queue 를 생성했으면 그 안에 값을 넣어줘야하는데, queue 안에 값을 생성하는 방법에는 두가지가 있다. add() 또는 offer() 이라는 메소드를 이용하면 queue 에 값을 추가할 수 있다.
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.offer(2);
그럼 두개의 메소드가 같은 것인가? 하는 생각이 들 수 있을텐데, 주기능은 같지만 부가적인 기능까지 똑같은 것은 아니다! add() 메소드의 경우 queue 에 삽입을 성공하게 되면 true 를 리턴하게 된다. 반대로 삽입에 실패할 경우 (큐에 데이터를 담을 공간이 부족한 경우 등), IllegalStateException 이 발생한다.
queue 안의 값을 삭제하는 방법으로는 poll() 과 remove() 가 있다. 사용 방법은 아래 코드블럭을 참고하자!
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.offer(2);
queue.offer(3);
queue.poll(); // queue 에는 2,3 이 남아있게 된다. (만약 queue 가 비어있다면 null 을 리턴한다)
queue.remove(); // queue에는 3 이 남아있게 된다.
만약 queue 의 전체 값들을 지우고 싶다면 clear() 메소드를 이용하면 된다.
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.offer(2);
queue.offer(3);
queue.clear(); // 큐의 모든 값들 삭제 (초기화)
queue.offer(4); // 큐에는 4만 존재하게 된다
# peek(), isEmpty()
peek() 메소드는 stack 에서 가장 처음 입력된 값, 즉 큐라는 바구니에 맨 처음 들어간 값이 무엇인지 출력해주는 함수이다.
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
queue.add(3);
queue.add(4);
queue.add(5);
queue.peek(); // 1
queue.remove(); // 맨 첫번째 큐 삭제
queue.peek(); // 2
isEmpty() 메소드는 queue 의 값이 비어있다면 true 를 리턴하고, 비어있지 않다면 false 를 리턴한다.
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
queue.add(3);
queue.add(4);
queue.clear();
System.out.println(queue.isEmpty()); // true
다음 번에는 Queue 를 이용한 코딩테스트 문제를 같이 풀어보도록 하자!
'𝑷𝒓𝒐𝒈𝒓𝒂𝒎𝒎𝒊𝒏𝒈 > 𝐽𝐴𝑉𝐴' 카테고리의 다른 글
[JAVA] Collection - List (ArrayList) (0) | 2022.11.21 |
---|---|
[디자인패턴] 프록시(Proxy) 패턴 (0) | 2022.11.19 |
[디자인패턴] 싱글톤(Singleton) 패턴 (0) | 2022.11.19 |
[JAVA] Thread (스레드) (0) | 2022.11.02 |
[JAVA] 자바 stack (스택) 클래스 (0) | 2022.02.10 |