Queue(큐) 란?
한마디 버전: (한글) 가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 FIFO(First-In-First-Out) 형식의 선형 데이터 구조 (영문) The linear FIFO data structure that return data which the least recently added. |
사전적 의미 :
- 미국∙영국 [kjuː]
- 1.
명사 英 (무엇을 기다리는 사람자동차 등의) 줄
- 2.
명사 컴퓨터 큐, 대기 행렬
- 3.
동사 英 줄을 서서 기다리다
1. 기본 개념
위의 사전적 의미만 봐도 줄을 서는 것을 알 수 있습니다.
Stack 버전에서도 설명했지만 한번더 복붙 하겠습니다.
딩그르르는 배낭여행을 갔습니다. 제일 아래에는 가벼운 것을 넣는 것이 긴 여행에 유리하다는 말을 듣고 휴지등을 넣었습니다. 하지만, 어느순간 배가 아파서 휴지를 꺼내려고 하는데 위에서 부터 모두 꺼내야 휴지를 꺼낼 수 있는 상황입니다. 이렇게 먼저 들어간 것을 꺼내려면 제일 마지막에 꺼낼 수 있는 구조가 Stack(스택)입니다. 다행히 화장실을 다녀온 후 티켓팅을 위해 공항에서 줄을 섰습니다. 줄은 길지 않았지만, 딩그르르앞에 사람이 모두 끝난 후에야 티케팅을 할 수 있었습니다. 이 구조가 (Queue) 입니다. |
>>> 이 글을 끝까지 읽으시고 Stack에 대해서도 알아보세요.
2. 용어
- enqueue : 줄을 서는 행위(Queue에 데이터를 넣는 행위)
- dequeue : 차례가 되어 승무원이 불러서 줄에서 나오는 행위(Queue에서 데이터를 빼는 행위)
3. 라이브러리
파이썬은 기본적으로 queue 라이브러리를 지원합니다.
Queue만을 위한 것이 아니라 이 안에서는 Queue, LifoQueue(Stack), PriorityQueue(우선순위 큐) 를 지원합니다.
import queue
import random
fifo_que = queue.Queue()
lifo_que = queue.LifoQueue()
priority_que = queue.PriorityQueue()
# 여기서는 put, get 으로 데이터를 넣고 뺍니다.
for i in range(5):
fifo_que.put(i)
lifo_que.put(i)
# 우선순위 큐에는 1~100 사이 난수(정수)를 큐에 넣습니다.
priority_que.put(random.randint(1, 100))
for i in range(5):
print('FIFO {}번째 데이터 :'.format(str(i+1)), fifo_que.get())
print('LIFO {}번째 데이터 :'.format(str(i+1)), lifo_que.get())
print('우선순위큐 {}번째 데이터 :'.format(str(i+1)), priority_que.get()) >>> FIFO 1번째 데이터 : 0 >>> LIFO 1번째 데이터 : 4 >>> 우선순위큐 1번째 데이터 : 5 >>> FIFO 2번째 데이터 : 1 >>> LIFO 2번째 데이터 : 3 >>> 우선순위큐 2번째 데이터 : 32 >>> FIFO 3번째 데이터 : 2 >>> LIFO 3번째 데이터 : 2 >>> 우선순위큐 3번째 데이터 : 68 >>> FIFO 4번째 데이터 : 3 >>> LIFO 4번째 데이터 : 1 >>> 우선순위큐 4번째 데이터 : 81 >>> FIFO 5번째 데이터 : 4 >>> LIFO 5번째 데이터 : 0 >>> 우선순위큐 5번째 데이터 : 85
FIFO 는 넣은 순서대로, LIFO는 넣은 순서의 반대로, 우선순위 큐는 올림차순으로 반환 된 것을 보실수 있습니다.
현재 위에 보이는 우선순위 큐는 Heap에서 다룰 최소힙(Minimum Heap)과 같이 반환됩니다.
4. 어디서 사용되나요 ?
멀티 테스킹을 위한 프로세스 방식을 구현하기 위해 많이 사용됨(운영체제, 네트워크 등등등)
5. 그래서 뭐가 좋아요?
쉽고, 편합니다. 빠르다거나 느리다거나 그런 특별한 장단점은 없습니다. 반드시 알고 있어야 하고, 언제 어디서든 사용될 수 있는 자료구조 입니다.
6. 키포인트
- FIFO 정책을 사용한다.
- 쉽고 구현하기 편하다.
7. 추가 Tip
- 파이썬 내에 Queue 라이브러리 말고도 list 함수를 가지고 구현해 낼 수 있습니다.
- 리스트에서 list.pop(-1) 하면 제일 마지막 엘레멘트가 list에서 삭제됩니다.