μΆμ²
ChatGPT
Queue μΈν°νμ΄μ€λ μλ° μ»¬λ μ νλ μμν¬μμ FIFO(First-In-First-Out) μμΉμ λ°λΌ μμλ₯Ό μ²λ¦¬νλ μλ£κ΅¬μ‘°λ₯Ό μ μνλ μΈν°νμ΄μ€μ΄λ€. νκ° λ¨Όμ μΆκ°λ μμκ° λ¨Όμ μ κ±°λλ ꡬ쑰λ₯Ό λ°λ₯΄λ©°, μ£Όλ‘ μμ κ΄λ¦¬λ λ©μμ§ μ²λ¦¬μ κ°μ λκΈ°μ΄μ μ²λ¦¬ν λ μ¬μ©λλ€.
Queue μΈν°νμ΄μ€λ 컬λ μ (Collection) μΈν°νμ΄μ€λ₯Ό μμνλ©°, ν μλ£κ΅¬μ‘°μ νΉνλ λ©μλλ€μ μ μνλ€.
1. Queue μΈν°νμ΄μ€μ μ£Όμ νΉμ§
FIFO μμ
Queue λ FIFO(First-In-First-Out) λ°©μμΌλ‘ λμνλ€. μ¦, νμ λ¨Όμ μ½μ λ μμκ° λ¨Όμ μ²λ¦¬λκ³ μ κ±°λλ€.
null νμ© μ ν¨
λλΆλΆμ ν ꡬν체λ null κ°μ νμ©νμ§ μλλ€. μ΄λ nullμ΄ νμ λμ λνλ΄κ±°λ νΉλ³ν μλ―Έλ₯Ό κ°μ§ μ μκΈ° λλ¬Έμ μμΈλ₯Ό λ°μμν¨λ€.
λκΈ°ν μ§μ
Queue μΈν°νμ΄μ€λ λ©ν°μ€λ λ νκ²½μμ λμ μ κ·Όμ μμ νκ² μ²λ¦¬ν μ μλ λκΈ°ν ν ꡬνμ(ConcurrentLinkedQueue, BlockingQueue λ±)λ₯Ό μ 곡νλ€.
2. Queue μΈν°νμ΄μ€μ μ£Όμ λ©μλ
Queue μΈν°νμ΄μ€λ μμλ₯Ό μ½μ , μ κ±°, μ‘°ννλ λ©μλλ€μ μ 곡νλ©°, κ° μμ μ λν΄ λ κ°μ§ λ³νμ μ 곡νλ€.
- μμΈλ₯Ό λ°μμν€λ λ©μλ
- null λλ falseλ₯Ό λ°ννλ λ©μλ
1. μ½μ κ΄λ ¨ λ©μλ
boolean add(E e)
νμ 맨 λ€μ μμλ₯Ό μ½μ νλ€. νμ ν¬κΈ° μ νμ μ΄κ³Όν κ²½μ° μμΈλ₯Ό λμ§λ€.
boolean offer(E e)
νμ 맨 λ€μ μμλ₯Ό μ½μ νλ€. νκ° κ°λ μ°¬ κ²½μ° falseλ₯Ό λ°ννλ©°, μμΈλ₯Ό λ°μμν€μ§ μλλ€.
2. μ κ±° κ΄λ ¨ λ©μλ
E remove()
νμ 첫 λ²μ§Έ μμλ₯Ό μ κ±°νκ³ λ°ννλ€. νκ° λΉμ΄ μμΌλ©΄ μμΈλ₯Ό λμ§λ€.
E poll()
νμ 첫 λ²μ§Έ μμλ₯Ό μ κ±°νκ³ λ°ννλ€. νκ° λΉμ΄ μμΌλ©΄ nullμ λ°ννλ€.
3. μ‘°ν κ΄λ ¨ λ©μλ
E element()
νμ 첫 λ²μ§Έ μμλ₯Ό λ°ννλ, μ κ±°νμ§ μλλ€. νκ° λΉμ΄ μμΌλ©΄ μμΈλ₯Ό λμ§λ€.
E peek()
νμ 첫 λ²μ§Έ μμλ₯Ό λ°ννλ, μ κ±°νμ§ μλλ€. νκ° λΉμ΄ μμΌλ©΄ nullμ λ°ννλ€.
3. Queue μΈν°νμ΄μ€ λ©μλ λμ λΉκ΅
λ©μλ | μ±κ³΅ μ λμ | μ€ν¨ μ λμ |
add(e) | μμλ₯Ό νμ μ½μ | μμΈ(IllegalStateException) λ°μ |
offer(e) | μμλ₯Ό νμ μ½μ | false λ°ν |
remove() | 첫 λ²μ§Έ μμ μ κ±° λ° λ°ν | μμΈ(NoSuchElementException) λ°μ |
poll() | 첫 λ²μ§Έ μμ μ κ±° λ° λ°ν | null λ°ν |
element() | 첫 λ²μ§Έ μμ μ‘°ν | μμΈ(NoSuchElementException) λ°μ |
peek() | 첫 λ²μ§Έ μμ μ‘°ν | null λ°ν |
4. Queue μΈν°νμ΄μ€μ ꡬν ν΄λμ€
Queue μΈν°νμ΄μ€λ₯Ό ꡬνν μ£Όμ ν΄λμ€λ€μ κ°κΈ° λ€λ₯Έ νΉμ±κ³Ό μ©λλ₯Ό κ°μ§λ©°, λ€μν μν©μμ μ¬μ©ν μ μλ€.
LinkedList
μΈν°νμ΄μ€λ₯Ό ꡬνν μΌλ°μ μΈ μ°κ²° 리μ€νΈ κΈ°λ° νλ‘, null κ°μ νμ©νλ€. ν¬κΈ°μ μ νμ΄ μμΌλ©°, ν μΈμλ 리μ€νΈλ‘ μ¬μ©ν μ μλ€.
PriorityQueue
μ°μ μμ νλ‘, μ½μ λ μμλ€μ΄ μ°μ μμμ λ°λΌ μ λ ¬λλ©°, FIFO κ·μΉ λμ μ μ μμ κ·μΉμ λ°λ₯Έλ€. κΈ°λ³Έμ μΌλ‘ μ΅μ νμ μ¬μ©ν΄ μ°μ μμλ₯Ό κ΄λ¦¬νλ€.
ArrayDeque
λ°°μ΄ κΈ°λ°μ νλ‘, μμͺ½μμ μ½μ κ³Ό μμ κ° κ°λ₯ν Deque(Double-Ended Queue)λ₯Ό ꡬννλ€. μ€νκ³Ό νμ λμμ λͺ¨λ μ§μνλ€.
ConcurrentLinkedQueue
λΉλκΈ°μ (μ€λ λ μμ )μΌλ‘ λμνλ μ°κ²° 리μ€νΈ κΈ°λ° νλ‘€, λ©ν°μ€λ λ νκ²½μμ μ¬μ©λλ€.
BlockingQueue
λΈλ‘νΉ νλ‘, μμ°μ-μλΉμ ν¨ν΄μμ μ£Όλ‘ μ¬μ©λλ©°, νκ° λΉμ΄ μμΌλ©΄ μμκ° μΆκ°λ λκΉμ§ κΈ°λ€λ¦¬κ³ , νκ° κ°λ μ°¨λ©΄ 곡κ°μ΄ μκΈΈ λκΉμ§ κΈ°λ€λ¦¬λ λμμ νλ€. μ£Όμ ꡬν체λ‘λ ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue λ±μ΄ μλ€.
5. Queue μμ
1. LinkedListλ₯Ό μ΄μ©ν κΈ°λ³Έ ν ꡬν
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// νμ μμ μ½μ
queue.offer("apple");
queue.offer("banana");
queue.offer("cherry");
// νμ 첫 λ²μ§Έ μμλ₯Ό λ°ννκ³ μ κ±°
System.out.println("Poll: " + queue.poll()); // μΆλ ₯: apple
// νμ 첫 λ²μ§Έ μμλ₯Ό μ‘°ν (μ κ±°νμ§ μμ)
System.out.println("Peek: " + queue.peek()); // μΆλ ₯: banana
// νμμ μμλ₯Ό μ κ±°
System.out.println("Remove: " + queue.remove()); // μΆλ ₯: banana
// λ¨μ μμλ€ μΆλ ₯
System.out.println("Remaining Queue: " + queue); // μΆλ ₯: [cherry]
}
}
2. PriorityQueueλ₯Ό μ΄μ©ν μ°μ μμ ν
import java.util.PriorityQueue;
import java.util.Queue;
public class PriorityQueueExample {
public static void main(String[] args) {
Queue<Integer> priorityQueue = new PriorityQueue<>();
// μ°μ μμ νμ μμ μ½μ
(κΈ°λ³Έμ μΌλ‘ μ€λ¦μ°¨μ μ λ ¬)
priorityQueue.offer(40);
priorityQueue.offer(10);
priorityQueue.offer(30);
priorityQueue.offer(20);
// μ°μ μμκ° κ°μ₯ λμ μμλ₯Ό λ°ννκ³ μ κ±°
System.out.println("Poll: " + priorityQueue.poll()); // μΆλ ₯: 10
// νμ 첫 λ²μ§Έ μμλ₯Ό μ‘°ν (μ κ±°νμ§ μμ)
System.out.println("Peek: " + priorityQueue.peek()); // μΆλ ₯: 20
// λ¨μ μμλ€ μΆλ ₯
System.out.println("Remaining Queue: " + priorityQueue); // μΆλ ₯: [20, 40, 30]
}
}
3. ArrayDequeλ₯Ό μ΄μ©ν νμ μ€ν λμ
import java.util.ArrayDeque;
import java.util.Deque;
public class ArrayDequeExample {
public static void main(String[] args) {
Deque<String> deque = new ArrayDeque<>();
// νμ²λΌ λμ (FIFO)
deque.offer("apple");
deque.offer("banana");
deque.offer("cherry");
System.out.println("Queue Poll: " + deque.poll()); // μΆλ ₯: apple
System.out.println("Queue Remaining: " + deque); // μΆλ ₯: [banana, cherry]
// μ€νμ²λΌ λμ (LIFO)
deque.push("date");
System.out.println("Stack Pop: " + deque.pop()); // μΆλ ₯: date
System.out.println("Stack Remaining: " + deque); // μΆλ ₯: [banana, cherry]
}
}
6. BlockingQueue μμ (μμ°μ-μλΉμ ν¨ν΄)
BlockingQueueλ μμ°μ-μλΉμ(Producer-Consumer) ν¨ν΄μμ μ£Όλ‘ μ¬μ©λλ€. νκ° λΉμ΄ μμΌλ©΄ μλΉμλ κΈ°λ€λ¦¬κ³ , νκ° κ°λ μ°¨λ©΄ μμ°μλ κΈ°λ€λ¦¬λ λμμ μννλ€.
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueExample {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<Integer> blockingQueue = new ArrayBlockingQueue<>(2);
// μμ°μ μ€λ λ
new Thread(() -> {
try {
blockingQueue.put(1);
System.out.println("Produced: 1");
blockingQueue.put(2);
System.out.println("Produced: 2");
blockingQueue.put(3); // μ΄ μμ μμ λΈλ‘νΉλ¨ (νκ° κ°λ μ°ΌκΈ° λλ¬Έ)
System.out.println("Produced: 3");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
// μλΉμ μ€λ λ
new Thread(() -> {
try {
Thread.sleep(2000); // μ μ λκΈ° ν μλΉ μμ
System.out.println("Consumed: " + blockingQueue.take());
System.out.println("Consumed: " + blockingQueue.take());
System.out.println("Consumed: " + blockingQueue.take());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
}
}
μ΄ μμμμλ μμ°μκ° νμ μμλ₯Ό μ½μ νκ³ , νκ° κ°λ μ°¨λ©΄ λ€μ μμλ₯Ό μ½μ νκΈ° μν΄ λ€κΈ°νλ€. μλΉμλ μΌμ μκ°μ΄ μ§λ ν νμμ μμλ₯Ό κΊΌλ΄κ³ , νκ° λΉμ΄ μμΌλ©΄ λ€μ μμκ° μ¬ λκ°μ§ λκΈ°νλ€.
7. Queue μΈν°νμ΄μ€μ μ©λ
μμ λκΈ°μ΄
μ¬λ¬ μμ μ μ°¨λ‘λλ‘ μ²λ¦¬ν΄μΌ ν λ νλ₯Ό μ¬μ©ν΄ μμ μ μ μ₯νκ³ , μ²λ¦¬ μλ£ ν νμμ μ κ±°νλ λ°©μμΌλ‘ νμ©λ μ μλ€.
λ©μμ§ μ²λ¦¬ μμ€ν
λ©μμ§ ν μμ€ν μμ λ©μμ§λ₯Ό μ°¨λ‘λλ‘ μ²λ¦¬νκΈ° μν μλ£κ΅¬μ‘°λ‘ μ¬μ©λλ€.
λ©ν°μ€λ λ νκ²½
BlockingQueueλ λ©ν°μ€λ λ νκ²½μμ μμ νκ² λ°μ΄ν°λ₯Ό κ΅νν μ μλ νλ₯Ό μ 곡ν΄, μμ°μ-μλΉμ ν¨ν΄μ μ ν©νλ€.
κ²°λ‘
Queue μΈν°νμ΄μ€λ μλ°μμ FIFO λ°©μμ νλ₯Ό ꡬννλ λ° μ¬μ©λλ©°, λ€μν ꡬνμ²΄κ° μμ΄ κ°κΈ° λ€λ₯Έ νΉμ±μ λ§κ² μ¬μ©ν μ μλ€. μ°μ μμ ν, λκΈ°ν ν, λΈλ‘νΉ ν λ± λ€μν μν©μ λ§λ ꡬν체λ€μ΄ μ 곡λμ΄, λ©ν°μ€λ λ νκ²½μμλ μμ νκ³ ν¨μ¨μ μΌλ‘ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μ μλ€.
'λΉ κ΅¬λ© μ±μ°κΈ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] μμ μ μΈ μ λ ¬ Stable Sorting (1) | 2024.09.15 |
---|---|
[μκ³ λ¦¬μ¦] μ μ리 μ λ ¬ In-Place Sorting (1) | 2024.09.15 |
[λμμΈ ν¨ν΄][Java] μμ°μ-μλΉμ ν¨ν΄ Producer-Consumer Pattern (0) | 2024.09.14 |
[Java] TreeMap ꡬν (0) | 2024.09.14 |
[Java] NavigableMap (0) | 2024.09.14 |