큐(Queue)
데이터 구조 중 하나로, 데이터를 선입선출(First-In-First-Out, FIFO) 순서로 저장하고 관리하는 자료 구조.
실생활에서 대기열과 유사한 동작을 수행합니다. 가장 먼저 도착한 항목이 가장 먼저 처리되는 원리.
주요 특징
선입선출(FIFO): 큐에 데이터를 추가할 때, 가장 먼저 추가한 항목이 가장 먼저 처리.
큐의 맨 앞에서부터 항목이 제거.
두 가지 주요 연산: 큐는 주로 두 가지 주요 연산을 지원.
Enqueue: 큐에 데이터를 추가하는 작업입니다. 이 작업은 큐의 끝(뒤)에 데이터를 추가.
Dequeue: 큐에서 데이터를 제거하고 반환하는 작업입니다. 이 작업은 큐의 맨 앞에서 데이터를 제거.
Peek: 큐에서 데이터를 제거하지 않고 맨 앞의 데이터를 확인하는 연산.
큐의 맨 앞에 있는 데이터를 반환하지만 큐에서는 삭제하지 않음.
사용 사례: 큐는 대기열 모델링, 작업 관리, 이벤트 처리 및 데이터 버퍼링과 같은 다양한 응용 프로그램에서 사용.
예제
using System.Collections; using System.Collections.Generic; using UnityEngine; public class QueueExample : MonoBehaviour { // 큐를 선언. Queue<string> myQueue = new Queue<string>(); void Start() { // 큐에 아이템을 추가합니다. myQueue.Enqueue("아이템 1"); myQueue.Enqueue("아이템 2"); myQueue.Enqueue("아이템 3"); // 큐에서 아이템을 제거하면서 출력합니다. while (myQueue.Count > 0) { string item = myQueue.Dequeue(); Debug.Log("Dequeued: " + item); } } }
주의할 점
비어 있는 큐에 접근하지 않기
큐에서 데이터를 가져오기 전에 큐가 비어있는지 확인.
큐가 비어 있는 상태에서 Dequeue를 호출하면 오류가 발생하므로 보통 myQueue.Count 속성을 사용하여 큐의 요소 수를 확인하는 것이 좋음.
스레드 안전성
멀티스레드 환경에서 큐를 사용하는 경우, 큐가 스레드 안전하도록 관리해야 함.
여러 스레드가 큐에 동시에 액세스하면 데이터 무결성 문제가 발생할 수 있으므로 스레드 동기화 기술을 사용하여 큐를 안전하게 관리해야 함.
메모리 누수 방지
큐에 데이터를 추가한 후 꼭 처리해야 함.
큐에 데이터를 계속 쌓아두면 메모리 누수가 발생할 수 있으므로 큐를 사용한 후에는 필요한 경우 데이터를 제거하고 정리.
적절한 데이터 유형 사용
큐에 저장되는 데이터 유형을 신중하게 선택.
예를 들어, 특정 데이터 유형을 큐에 저장할 때 형 변환 문제에 유의해야 함.
컬렉션의 복사와 참조
큐를 다른 큐에 복사하거나 전달할 때, 실제 데이터가 복사되는 것이 아니라 참조만 전달.
필요한 경우 데이터를 복사하여 의도치 않은 데이터 변경을 방지.