[C# 자료구조] 큐(QUEUE)

혜뜌·2023년 10월 24일

4.4 .NET의 QUEUE 클래스

.NET에서 QUEUE를 지원하는 클래스로는 (1) Queue 요소들이 object 타입인 System.Collections.Queue 클래스와 (2) 개발자가 Queue 생성 시 요소들의 데이터 타입을 결정할 수 있는 Generic 타입의 System.Collections.Generic.Queu 클래스, 그리고 (3) 멀티쓰레딩 환경에서 Queue를 간편하게 사용할 수 있도록 .NET 4.0부터 제공된 ConcurrentQueue클래스가 있다.

.NET의 QUEUE 클래스와 Queue 클래스는 요소 타입을 지정할 수 있는 Generic인가 아닌가 하는 차이가 있으며, 두 클래스는 내부적으로 원형 동적 배열로 구현되어 있다. 즉, 이들 클래스는 원형배열을 사용하여 Queue를 구현하였는데, Queue 클래스의 디폴트 성장인자는 2.0으로서 배열 확장 시 2배씩 확장해 나간다.

아래예제는 Queue를 사용하여 정수형 Queue를 만들고 데이터를 추가하고 읽어내는 샘플코드다.

   static void Main(string[] args)
   {
       // int 타입의 Queue 생성
       Queue<int> q = new Queue<int>();
       q.Enqueue(1);
       q.Enqueue(2);
       q.Enqueue(3);

       // 하나를 Dequeue
       int data = q.Dequeue();
       Console.WriteLine(data);

       // 나머지 모두를 Dequeue
       foreach (var item in q)
       {
           Console.WriteLine(item);
       }

       // int형 Concurrent Queue 생성
       var qupid = new ConcurrentQueue<int>();

       // Item을 큐에 넣는 작업쓰레드
       Task tEnq = Task.Factory.StartNew(() =>
       {
           for (int i = 0; i < 100; i++)
           {
               q.Enqueue(i);
               Thread.Sleep(50);
           }
       });

       // Item을 큐에서 꺼내는 작업쓰레드
       Task tDeq = Task.Factory.StartNew(() =>
       {
           int result;

           for (int i = 0; i < 100; i++)
           {
               if (q.TryDequeue(out result))
               {
                   Console.WriteLine(result);
                   Thread.Sleep(100);
               }
           }
       });

       // 두 쓰레드가 끝날 때까지 대기
       Task.WaitAll(tEnq, tDeq);
   }
}
profile
나는 코딩을 잘 하고 시파.

0개의 댓글