Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# Queue.Peek 메서드 완벽 정리: 큐의 첫 번째 요소 제거 없이 확인하기

Queue.Peek() 메서드란?

C#의 Queue.Peek() 메서드는 큐(Queue)의 맨 앞에 있는 객체를 제거하지 않고 그대로 반환하는 데 사용됩니다. Dequeue() 메서드와 달리 큐의 상태를 변경하지 않기 때문에, 다음에 처리될 요소를 미리 살펴봐야 할 때 매우 유용합니다.

주의할 점은 큐가 비어 있는 상태에서 Peek()를 호출하면 InvalidOperationException이 발생한다는 것입니다. 따라서 호출 전에 Count 속성으로 큐에 요소가 존재하는지 먼저 확인하는 것이 안전한 코딩 습관입니다.

구문

Queue.Peek() 메서드의 구문은 다음과 같습니다.

public virtual object Peek ();

예제 1: 비제네릭 Queue에서 Peek 사용하기

먼저 System.Collections 네임스페이스의 비제네릭 Queue에서 Peek() 메서드를 사용하는 기본 예제입니다.

using System;
using System.Collections;
public class Demo {
   public static void Main() {
      Queue queue = new Queue();
      queue.Enqueue("AB");
      queue.Enqueue("BC");
      queue.Enqueue("CD");
      queue.Enqueue("DE");
      queue.Enqueue("EF");
      queue.Enqueue("FG");
      queue.Enqueue("GH");
      queue.Enqueue("HI");
      Console.WriteLine("Queue...");
      IEnumerator demoEnum = queue.GetEnumerator();
      while (demoEnum.MoveNext()) {
         Console.WriteLine(demoEnum.Current);
      }
      Console.WriteLine("Queue element at the beginning = "+queue.Peek());
      Console.WriteLine("Is Queue synchronized? = "+queue.IsSynchronized);
      Queue queue2 = Queue.Synchronized(queue);
      Console.WriteLine("Is Queue synchronized now? = "+queue2.IsSynchronized);
   }
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Queue...
AB
BC
CD
DE
EF
FG
GH
HI
Queue element at the beginning = AB
Is Queue synchronized? = False
Is Queue synchronized now? = True

출력 결과를 보면 Peek() 호출 후에도 큐의 모든 요소(AB부터 HI까지)가 그대로 유지되는 것을 확인할 수 있습니다. 또한 Queue.Synchronized() 메서드로 감싼 새 큐는 스레드로부터 안전(thread-safe)하게 동작하며, IsSynchronized 속성 값이 True로 변경된 것을 통해 이를 검증할 수 있습니다.

예제 2: 제네릭 Queue<T>에서 Peek 사용하기

이번에는 형식 안정성(type safety)이 보장되는 제네릭 Queue<string>에서 Peek() 메서드를 활용하는 예제입니다.

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 element at the beginning = "+queue.Peek());
      Console.WriteLine("Does the queue has element Jack? = "+queue.Contains("Jack"));
      queue.Clear();
      Console.Write("Count of elements (updated) = ");
      Console.WriteLine(queue.Count);
   }
}

출력 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Count of elements = 8
Queue element at the beginning = Gary
Does the queue has element Jack? = True
Count of elements (updated) = 0

Peek() 메서드가 첫 번째 요소인 "Gary"를 반환한 후에도 큐에는 여전히 8개의 요소가 남아 있습니다. 이후 Clear() 메서드를 호출하면 모든 요소가 한꺼번에 제거되어 Count가 0으로 변경됩니다.

Peek()과 Dequeue()의 차이점

두 메서드 모두 큐의 맨 앞 요소를 반환하지만 동작 방식에 중요한 차이가 있습니다.

  • Peek(): 첫 번째 요소를 반환만 하며, 큐에서 아무것도 제거하지 않습니다.
  • Dequeue(): 첫 번째 요소를 반환하고 해당 요소를 큐에서 실제로 제거합니다.

따라서 큐의 데이터를 훑어보기만 할 필요가 있다면 Peek(), 요소를 실제로 처리하고 소비해야 한다면 Dequeue()를 사용하는 것이 적절합니다.