C#의 Queue.Dequeue() 메서드는 큐(Queue)의 맨 앞에 위치한 요소를 제거하고 그 요소를 반환하는 역할을 합니다. FIFO(First-In, First-Out, 선입선출) 구조로 동작하는 큐에서 데이터를 저장된 순서대로 하나씩 꺼낼 때 반드시 사용되는 핵심 메서드입니다.
구문
Queue.Dequeue() 메서드의 기본 구문은 다음과 같습니다.
public virtual object Dequeue ();
매개변수는 받지 않으며, 호출 즉시 큐의 첫 번째 요소가 삭제된 후 해당 요소가 반환됩니다.
예제 1
먼저 간단한 예제를 통해 Dequeue 메서드가 어떻게 동작하는지 살펴보겠습니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
Queue<string> queue = new Queue<string>();
queue.Enqueue("A");
queue.Enqueue("B");
queue.Enqueue("C");
queue.Enqueue("D");
queue.Enqueue("E");
queue.Enqueue("F");
queue.Enqueue("G");
Console.WriteLine("Count of elements = "+queue.Count);
Console.WriteLine("Element at the beginning of queue = " + queue.Peek());
queue.Dequeue();
queue.Dequeue();
queue.Dequeue();
Console.WriteLine("Count of elements = "+queue.Count);
}
}위 코드에서는 A부터 G까지 총 7개의 문자열을 Enqueue로 큐에 추가한 후, Dequeue를 세 번 호출하여 맨 앞의 세 요소(A, B, C)를 차례대로 제거했습니다. 그 결과 요소 개수가 7개에서 4개로 줄어든 것을 확인할 수 있습니다.
실행 결과
Count of elements = 7 Element at the beginning of queue = A Count of elements = 4
예제 2
이번에는 Dequeue 호출 전후로 큐의 내부 상태를 직접 출력하여 변화를 확인할 수 있는 예제를 살펴보겠습니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main() {
Queue<string> queue = new Queue<string>();
queue.Enqueue("Gary");
queue.Enqueue("Jack");
queue.Enqueue("Ryan");
queue.Enqueue("Kevin");
queue.Enqueue("Mark");
queue.Enqueue("Jack");
queue.Enqueue("Ryan");
queue.Enqueue("Kevin");
Console.Write("Count of elements = ");
Console.WriteLine(queue.Count);
Console.WriteLine("Queue...");
foreach(string i in queue) {
Console.WriteLine(i);
}
queue.Dequeue();
queue.Dequeue();
Console.WriteLine("Queue...UPDATED");
foreach(string i in queue) {
Console.WriteLine(i);
}
Console.Write("Count of elements (updated) = "+queue.Count);
queue.Clear();
Console.Write("\nCount of elements (updated AGAIN) = ");
Console.WriteLine(queue.Count);
}
}이 예제에서는 8개의 이름을 큐에 담은 뒤 Dequeue를 두 번 실행해 맨 앞의 Gary와 Jack을 제거합니다. 이후 Clear() 메서드를 호출하여 큐의 모든 요소를 한꺼번에 비우는 과정까지 보여줍니다.
실행 결과
Count of elements = 8 Queue... Gary Jack Ryan Kevin Mark Jack Ryan Kevin Queue...UPDATED Ryan Kevin Mark Jack Ryan Kevin Count of elements (updated) = 6 Count of elements (updated AGAIN) = 0
Dequeue 사용 시 주의 사항
- 빈 큐 예외: 큐가 비어 있는 상태에서 Dequeue를 호출하면 InvalidOperationException이 발생합니다. 따라서 호출 전에 Count 속성으로 요소 개수를 확인하는 것이 안전합니다.
- Peek과의 차이: Peek()는 맨 앞 요소를 단순히 조회만 하는 반면, Dequeue()는 해당 요소를 실제로 큐에서 삭제하고 반환한다는 점이 다릅니다.
- 뛰어난 성능: Dequeue는 O(1)의 시간 복잡도로 동작하기 때문에 대용량 데이터를 순차적으로 처리할 때도 효율적입니다.
- 반환 타입: 제네릭 Queue<T>에서는 T 타입의 요소가 그대로 반환되지만, 비제네릭 Queue에서는 object 타입으로 반환되므로 필요에 따라 명시적 형 변환(casting)이 필요할 수 있습니다.