큐(Queue)는 데이터 구조 중 하나로, 데이터를 먼저 집어넣은 순서대로 꺼낼 수 있는 구조를 의미합니다. 쉽게 말해, 큐는 '선입선출(First In, First Out, FIFO)'의 원칙을 따릅니다. 이를 통해 큐에서는 가장 먼저 들어온 데이터가 가장 먼저 나가게 됩니다.
큐는 특정한 순서대로 데이터를 처리해야 할 때 유용합니다. 예를 들어, 인쇄 대기열이나 프로세스 스케줄링 등에서 큐를 많이 사용합니다. 큐를 사용하면 데이터의 순서를 유지하면서 효율적으로 처리할 수 있습니다.
인쇄 대기열: 여러 사용자가 인쇄를 요청할 때, 먼저 요청한 사용자의 문서가 먼저 인쇄됩니다.
프로세스 스케줄링: 운영 체제에서 여러 프로세스를 순서대로 실행할 때 큐를 사용합니다.
메시지 큐: 분산 시스템에서 메시지를 주고받을 때 큐를 사용하여 메시지의 순서를 유지합니다.
파이썬에서는 큐를 쉽게 사용할 수 있도록 queue 모듈을 제공합니다. 기본적인 큐를 사용하는 방법은 다음과 같습니다.
import queue
# 큐 생성
q = queue.Queue()
# 큐에 데이터 추가 (Enqueue)
q.put(1)
q.put(2)
q.put(3)
# 큐에서 데이터 제거 (Dequeue)
print(q.get()) # 1 출력
print(q.get()) # 2 출력
print(q.get()) # 3 출력
위 예제에서 볼 수 있듯이, put 메서드를 사용하여 큐에 데이터를 추가하고, get 메서드를 사용하여 큐에서 데이터를 제거할 수 있습니다.
좀 더 실용적인 예시로, 고객 서비스 센터의 대기열을 관리하는 프로그램을 작성해보겠습니다.
import queue
# 고객 대기열 생성
customer_queue = queue.Queue()
# 고객이 대기열에 들어옴
customer_queue.put("고객 1")
customer_queue.put("고객 2")
customer_queue.put("고객 3")
# 고객을 순서대로 처리
while not customer_queue.empty():
print(f"{customer_queue.get()} 처리 중")
위 코드에서는 고객이 대기열에 들어오고, 들어온 순서대로 고객을 처리하는 모습을 보여줍니다. 큐가 비어있지 않은 동안(while not customer_queue.empty()) 고객을 하나씩 꺼내서 처리합니다.
큐를 사용할 때 몇 가지 주의해야 할 점이 있습니다.
큐 오버플로우(Overflow): 큐가 가득 찼을 때 더 이상 데이터를 추가하려고 하면 오류가 발생할 수 있습니다. 이를 방지하려면 큐의 크기를 미리 설정하고, 크기를 초과하지 않도록 주의해야 합니다.
큐 언더플로우(Underflow): 큐가 비어있을 때 데이터를 제거하려고 하면 오류가 발생합니다. 따라서 데이터를 제거하기 전에 큐가 비어있는지 확인해야 합니다.
동시성 문제: 멀티스레딩 환경에서 여러 스레드가 동시에 큐에 접근할 때, 동시성 문제가 발생할 수 있습니다. 이를 해결하기 위해 스레드 안전한 큐를 사용하거나 적절한 동기화 기법을 사용해야 합니다.