C#

[C#]컬렉션, 큐(Queue) 자료구조

DevStory 2021. 9. 11.

.NET 프레임워크가 제공하는 컬렉션 클래스에서 큐(Queue)를 소개합니다.

 

Queue는 먼저 들어온 값이 먼저 나중에 나가는 FIFO(First In First Out)이라 부르는 자료 구조입니다. 대기열처럼 먼저 기다리는 사람이 먼저 입장하는 구조이며, Queue는 어떠한 작업을 순서대로 처리해야 하는 경우 사용됩니다.

 

Queue의 구조

Queue는 ArrayList와 마찬가지로 크기가 자동으로 늘어나며, 타입이 서로 다른 값을 추가할 수 있습니다.

 

위 사진에서 볼 수 있듯이 Queue에 값을 추가하는 경우 Enqueue() 메서드를 사용하며, Queue에서 값을 제거하는 경우 Dequeue() 메서드를 사용합니다.

 

이번 포스팅에서는 큐(Queue) 컬렉션을 다루는 방법을 정리하였습니다.

 


Queue 생성

우선, 컬렉션인 Queue를 사용하기 위해 System.Collections using문에 추가합니다.

using System.Collections;

 

Queue 객체는 일반 객체를 생성하는 방법과 동일하며, var 타입도 가능합니다.

Queue queue1 = new Queue();

var queue2 = new Queue();

 

다음과 같이 Queue의 용량을 객체를 생성할 때 설정할 수 있습니다. 만약, Queue에 데이터가 3개가 존재하는데 데이터를 넣는 경우 Queue의 용량이 자동으로 증가합니다.

Queue queue = new Queue(3);

Queue 초기화

Queue 객체의 값을 초기화하는 방법입니다.

int[] arr = { 1, 2, 3, 4, 5 };

Queue queue = new Queue(arr);

Queue 생성자에 배열을 넘기면, 배열의 값으로 queue의 값을 초기화합니다.

 

아래 코드는 queue에 담겨 있는 값을 foreach문으로 출력하는 코드입니다.

int[] arr = { 1, 2, 3, 4, 5 };

Queue queue = new Queue(arr);

foreach (object obj in queue)
{
  Console.WriteLine($"value : {obj }");
}

실행 결과

Queue에 먼저 들어온 순서대로 값을 출력합니다.

 

아래는 Queue 객체의 값을 초기화하는 또 다른 방법입니다.

 

Queue 생성자에 object 타입의 배열을 전달하여 값을 초기화합니다.

Queue queue = new Queue(new object[] { 1, "Hi", 5.5, true, 'A', null, " . " });

즉, 서로 다른 타입의 값을 Queue에 넣어야 하는 경우 object 타입의 배열을 전달하여 값을 초기화할 수 있습니다.

 

그리고 다음과 같이 ArrayList를 전달하여 값을 초기화할 수 있습니다.

ArrayList arrylist = new ArrayList { 1, "Hi", 5.5, true, 'A', null, " . " };

Queue queue = new Queue(arrylist);

 

참고로 Queue는 ArrayList와는 다르게 컬렉션 이니셜 라이즈 기법을 사용할 수 없습니다.

// ArrayList는 가능
ArrayList arraylist = new ArrayList { 1, "Hi", 5.5, true, 'A', null, " . " };

// queue는 불가능
Queue queue = new Queue { 1, "Hi", 5.5, true, 'A', null, " . " };

Queue에 값 추가

Enqueue() 메서드를 사용하여 Queue에 값을 추가할 수 있습니다.

 

대기열의 마지막에 값이 추가되며 Queue의 중간에 값을 추가할 수 없습니다.

Queue queue = new Queue();

queue.Enqueue( 1 );
queue.Enqueue( "2번째" );
queue.Enqueue( 'C' );

Enqueue() 메서드가 실행되면 Queue의 구조는 다음 그림과 같습니다.

 

Queue queue = new Queue();

 

Queue에 용량을 설정하지 않았으므로 빈 공간을 가지는 Queue 객체가 생성됩니다.

 

queue.Enqueue( 1 );

 

 

queue.Enqueue( "2번째" );

 

 

queue.Enqueue( 'C' );

 


Queue에 값을 제거

Dequeue() 메서드를 사용하여 Queue 시작 부분의 값을 제거할 수 있습니다.

 

Enqueue() 메서드와 마찬가지로 중간에 있는 값을 변경할 수 없습니다.

 

Enqueue() 메서드에서 설명한 Queue의 값을 제거하는 코드입니다. 

queue.Dequeue();
queue.Dequeue();
queue.Dequeue();

queue.Dequeue(); // 여기서 에러

4번째 Dequeue() 메서드를 호출하는 코드에서 에러가 발생하는 이유는 Queue에 값이 존재하지 않기 때문입니다.

 

값이 존재하지 않는데, Dequeue() 메서드를 호출하는 경우 다음 사진과 같은 에러가 발생합니다.

 

에러를 방지하기 위해 Count를 사용하여 Queue가 비어있는지 체크하거나 예외처리를 하는 코드를 작성하도록 합니다.

 

Queue의 모든 값을 제거하는 경우 Clear() 메서드를 사용합니다.

queue.Clear();
반응형

댓글