큐(Queue)는 컴퓨터 과학과 데이터 구조에서 사용되는 중요한 추상 자료 구조입니다.
큐는 데이터를 저장하는 컨테이너로, 일반적으로 "선입선출" (First-In-First-Out, FIFO) 원칙에 따라 데이터를 처리합니다. 즉, 가장 먼저 들어온 데이터가 가장 먼저 나가게 됩니다.
FIFO 원칙 : 큐는 데이터를 저장할 때 가장 먼저 들어온 데이터가 가장 먼저 나갑니다. 이것은 대기열(대기 리스트)을 모델링하거나 작업을 순차적으로 처리할 때 유용합니다.
삽입과 삭제 : 큐는 주로 두 가지 주요 작업을 지원합니다.
Enqueue(삽입) : 큐의 끝 부분에 데이터를 추가하는 작업입니다. 이 작업은 큐에 새로운 항목을 추가합니다.
Dequeue(삭제) : 큐의 처음 부분에서 데이터를 제거하고 반환하는 작업입니다. 이 작업은 큐에서 가장 오래된 항목을 제거합니다.
스레드 안전성 : 멀티스레드 환경에서 여러 스레드가 큐에 접근하는 경우, 큐는 스레드 간의 동기화를 통해 안전하게 데이터를 처리할 수 있어야 합니다.
일반 큐(Generic Queue) : 데이터의 일반적인 형태를 저장하는 큐입니다.
우선순위 큐(Priority Queue) : 각 항목에 우선순위를 부여하여 가장 높은 우선순위를 가진 항목이 먼저 나가게 하는 큐입니다.
환형 큐(Circular Queue) : 큐의 끝과 시작이 연결된 큐로, 일정한 크기를 가지고 데이터를 순환하도록 구성됩니다.
응용 분야 : 큐는 컴퓨터 과학 및 소프트웨어 개발에서 다양한 응용 분야에 사용됩니다.
예를 들어, 운영 체제에서 프로세스 스케줄링, 데이터 버퍼링, 대기열 관리, 그래프 알고리즘 등에 큐가 활용됩니다.
자료 구조 : 큐는 주로 배열(Array) 또는 연결 리스트(Linked List)를 기반으로 구현됩니다. 배열을 사용한 큐는 크기가 고정되어 크기를 동적으로 조절할 수 없지만 빠른 접근 속도를 제공합니다. 연결 리스트를 사용한 큐는 크기를 동적으로 조절할 수 있지만 접근 속도가 느릴 수 있습니다.
import java.util.LinkedList;
public class Queue<T> {
private LinkedList<T> list = new LinkedList<T>();
// 큐에 항목 추가
public void enqueue(T item) {
list.addLast(item);
}
// 큐에서 항목 제거 및 반환
public T dequeue() {
if (isEmpty()) {
throw new IllegalStateException("Queue is empty");
}
return list.removeFirst();
}
// 큐가 비어 있는지 확인
public boolean isEmpty() {
return list.isEmpty();
}
// 큐의 크기 반환
public int size() {
return list.size();
}
}
이것은 간단한 제네릭 큐의 구현 예제이며, 일반적인 큐의 기본 동작을 보여줍니다.
큐는 프로그래밍에서 다양한 상황에서 데이터를 효율적으로 관리하기 위해 사용되며, 데이터를 순서대로 처리하고 보관하는 데 유용한 자료 구조입니다.