Queue는 실제 생활에서의 줄서기와 완전히 동일한 구조이다.
가장 먼저 도착한 사람이 가장 먼저 처리된다.
그래서 Queue는 FIFO(First-In, First-Out) 구조라고 한다.
[Front] 사람1 사람2 사람3 [Rear]
Dequeue() → 사람1 나감
[Front] 사람2 사람3 [Rear]
Enqueue(사람4)
[Front] 사람2 사람3 사람4 [Rear]
✔ Enqueue = 맨 뒤(Rearmost)에 줄 추가
✔ Dequeue = 맨 앞(Front)에서 꺼내기
✔ FIFO = 먼저 들어온 것이 먼저 나간다
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Queue queue = new Queue();
queue.Enqueue(10);
queue.Enqueue(20);
queue.Enqueue(30);
Console.WriteLine("Peek: " + queue.Peek()); // 10
Console.WriteLine("Dequeue: " + queue.Dequeue()); // 10
Console.WriteLine("Peek: " + queue.Peek()); // 20
Console.WriteLine("Dequeue: " + queue.Dequeue()); // 20
Console.WriteLine("Count: " + queue.Count); // 1
}
}
출력:
Peek: 10
Dequeue: 10
Peek: 20
Dequeue: 20
Count: 1
아래는 위 코드가 실행될 때 Queue 내부 상태가 어떻게 변하는지 그림으로 표현한 것이다.
Enqueue(10)
Front → [10] ← Rear
Enqueue(20)
Front → [10][20] ← Rear
Enqueue(30)
Front → [10][20][30] ← Rear
Peek()
Front 값 = 10 (제거 X)
Dequeue() → 10 제거 후
Front → [20][30] ← Rear
Dequeue() → 20 제거 후
Front → [30] ← Rear
Count = 1
Queue는 “먼저 요청된 작업을 먼저 처리해야 하는 상황”에서 가장 많이 사용된다.
using System;
using System.Collections.Generic;
class PrintJob
{
public string Title { get; set; }
public PrintJob(string title) => Title = title;
}
class Program
{
static void Main()
{
Queue printQueue = new Queue();
printQueue.Enqueue(new PrintJob("A문서"));
printQueue.Enqueue(new PrintJob("B문서"));
printQueue.Enqueue(new PrintJob("C문서"));
while (printQueue.Count > 0)
{
var job = printQueue.Dequeue();
Console.WriteLine("인쇄 중: " + job.Title);
}
}
}
출력:
인쇄 중: A문서
인쇄 중: B문서
인쇄 중: C문서
→ Queue는 프린터처럼 “먼저 요청된 작업을 먼저 처리하는 구조”와 완벽하게 일치한다.