개요
이번 글에서는 C#에서 Queue에 대해 알아보겠습니다. C#에서 큐를 사용하기 위해서는 Queue<T> 제네릭 컬렉션 클래스를 사용하고, 이 클래스는 FIFO(First In First Out) 구조를 따릅니다. T에는 모든 타입의 자료형을 넣을 수 있습니다. 만약 여러 스레드에서 동시에 액세스해야 하는 경우 ConcurrentQueue<T>를 사용합니다.
선언
Queue<T>를 선언하는 방법은 아래와 같습니다.
Queue<T> queue = new Queue<T>();
큐를 설명하기에는 프린트 대기열 구현하는 것 만큼 적합한 예제는 별로 없습니다. 프린터는 FIFO의 대표적인 예시로 먼저 들어온 작업을 출력합니다. 이 예시로 설명 하겠습니다. T에 출력 될 문서를 의미하는 CPrintDocument 클래스를 만들어줍니다.
class CPrintDocument
{
private string m_strDocument;
public string DOCUMENT
{
get
{
return m_strDocument;
}
}
public CPrintDocument(string strName)
{
m_strDocument = strName;
}
public override string ToString()
{
return $"document name[{DOCUMENT}]";
}
}
Queue<CPrintDocument> queuePrint = new Queue<CPrintDocument>(); // Queue 생성
추가
큐에 요소를 추가하는 방법은 Enqueue 함수를 사용하면 됩니다.
queuePrint.Enqueue(new CPrintDocument("보고서.pdf"));
queuePrint.Enqueue(new CPrintDocument("사진.jpg"));
queuePrint.Enqueue(new CPrintDocument("계약서.docx"));
queuePrint.Enqueue(new CPrintDocument("정리.xlsx"));
이렇게 입력된 큐를 foreach를 사용하여 조회할 수 있습니다.
foreach (CPrintDocument person in queuePrint)
{
Console.WriteLine(person.ToString());
}
요소 반환
큐에서 요소를 받기 위해서는 Peek 또는 Dequeue 함수를 사용하면 됩니다. Peek은 큐에서 제거하지 않고 반환하는 방법이고, Dequeue는 큐에서 제거하면서 반환하는 방식 입니다.
// 제거 없이 요소 반환
Console.WriteLine($"첫 번째 문서 확인: {queuePrint.Peek()}");
// 요소 제거 및 반환
Console.WriteLine($"첫번째 문서 출력 중 ...: {queuePrint.Dequeue()}");
Console.WriteLine("출력이 완료 되었습니다.");
Console.WriteLine($"두번째 문서 출력 중 ...: {queuePrint.Dequeue()}");
Console.WriteLine("출력이 완료 되었습니다.");
요소 개수, 존재 유무 확인
큐에 요소 개수를 확인하기 위해서 Count 속성을 사용하면 됩니다.
Console.WriteLine($"남은 문서 수: {queuePrint.Count}");
큐에 요소의 존재 유무를 확인 하기 위해서는 Contains 함수를 사용하면 됩니다.
CPrintDocument clsContain = queuePrint.Peek();
bool bContain = queuePrint.Contains(clsContain);
Console.WriteLine($"{clsContain} 문서 존재 유무 : {bContain}");
배열에 복사
큐에 있는 요소를 새 배열에 복사하는 방법은 ToArray 함수를 사용하면 됩니다.
CPrintDocument[] arr = queuePrint.ToArray();
foreach (CPrintDocument person in arr)
{
Console.WriteLine(person.ToString());
}
요소 삭제
큐에서 요소를 삭제하는 방법은 Clear 함수를 사용하면 됩니다.
queuePrint.Clear();
github : https://github.com/3001ssw/c_sharp/tree/main/Data_Struct/Queue