데이터 타입(Data Type)이란?
스택과 큐의 차이점을 본격적으로 살펴보기 전에, 프로그래밍에서 '데이터 타입'이라는 개념부터 짚고 넘어가는 것이 좋습니다. 데이터 타입이란 변수를 생성해 데이터를 저장할 때 그 데이터가 어떤 형태인지를 정의하는 것을 말합니다.
데이터 타입은 크게 두 가지로 나눌 수 있습니다. 첫 번째는 원시(Primitive) 데이터 타입으로, 프로그래밍 언어가 기본적으로 지원하는 미리 정의된 타입입니다. 예를 들어 정수(int), 실수(float), 문자(char), 불리언(boolean) 등이 여기에 해당합니다. 두 번째는 비원시(Non-Primitive) 데이터 타입으로, 프로그래밍 언어에 내장되어 있지 않으며 프로그래머가 직접 정의하여 만들어 사용하는 타입입니다.
스택과 큐는 어떻게 다른가?
스택(Stack)과 큐(Queue)는 모두 비원시 데이터 구조에 속합니다. 하지만 내부 구현 방식을 기준으로 보면 두 자료구조 사이에는 뚜렷한 차이점들이 존재합니다. 아래 표에서 주요 차이점을 한눈에 비교해 보겠습니다.
| 번호 | 구분 기준 | 스택 (Stack) | 큐 (Queue) |
|---|---|---|---|
| 1 | 내부 구현 방식 | 가장 마지막에 삽입된 요소가 가장 먼저 꺼내집니다. 즉, LIFO(Last In, First Out), 후입선출 방식을 따릅니다. | 가장 먼저 삽입된 요소가 가장 먼저 꺼내집니다. 즉, FIFO(First In, First Out), 선입선출 방식을 따릅니다. |
| 2 | 연산 위치 | 리스트의 한쪽 끝, 이른바 탑(Top)이라 불리는 지점에서만 요소 삽입과 삭제가 이루어집니다. | 삽입은 리스트의 뒤(Rear)에서, 삭제는 리스트의 앞(Front)에서 각각 이루어집니다. |
| 3 | 포인터(플래그) 개수 | 리스트에 접근하기 위한 포인터가 하나만 유지되며, 이 포인터는 항상 리스트의 마지막 요소를 가리킵니다. | 두 개의 포인터가 유지됩니다. front는 아직 리스트에 남아 있는 첫 번째 삽입 요소를, rear는 마지막에 삽입된 요소를 각각 가리킵니다. |
| 4 | 연산 이름 | 요소를 넣는 연산을 Push(푸시), 꺼내는 연산을 Pop(팝)이라고 부릅니다. | 요소를 넣는 연산을 Enqueue(인큐), 꺼내는 연산을 Dequeue(디큐)라고 부릅니다. |
| 5 | 변형 구조 | 별도의 변형 구조가 없어 추가적인 확장 구현이 이루어지지 않습니다. | 원형 큐(Circular Queue), 우선순위 큐(Priority Queue), 덱(Deque, Doubly Ended Queue) 등 다양한 변형 구조가 존재합니다. |
| 6 | 복잡도 | 구조와 동작이 단순하여 큐에 비해 구현 난이도가 낮습니다. | 포인터 관리와 다양한 변형 구조로 인해 스택에 비해 상대적으로 복잡합니다. |
실무에서의 활용 예시
개념을 더욱 확실히 이해하기 위해 실제 소프트웨어에서의 활용 사례를 살펴보겠습니다.
스택이 사용되는 곳
함수 호출 시 실행 순서를 관리하는 호출 스택(Call Stack), 문서 편집기의 실행 취소(Undo) 기능, 웹 브라우저의 뒤로 가기 버튼 등이 대표적인 스택 활용 사례입니다. 모두 '가장 최근의 것부터 처리'한다는 공통점이 있습니다.
큐가 사용되는 곳
프린터의 문서 인쇄 대기열, 운영체제의 작업 스케줄링, 메시지 시스템의 메시지 큐(Message Queue) 등이 대표적입니다. 요청이 들어온 순서대로 공정하게 처리해야 하는 상황에 적합합니다.
정리
스택과 큐의 핵심 차이는 결국 데이터를 꺼내는 순서에 있습니다. 나중에 넣은 것을 먼저 꺼내야 한다면 스택(LIFO), 먼저 넣은 것을 먼저 꺼내야 한다면 큐(FIFO)를 선택하면 됩니다. 두 자료구조의 특성을 정확히 이해하면 알고리즘 설계와 문제 해결에서 올바른 선택을 할 수 있습니다.