
개발자 면접장에 들어서면 가장 빈번하게 등장하는 질문 중 하나가 바로 "스택(Stack)과 큐(Queue)의 차이점에 대해 설명해 보세요"입니다. 이 질문이 끊임없이 나오는 이유는 두 자료구조가 컴퓨터 공학의 가장 기초적이면서도 상반된 성격을 가진 선형 자료구조(Linear Data Structure)이기 때문입니다. 단순히 "하나는 LIFO고 하나는 FIFO입니다"라고 답변하는 것은 누구나 할 수 있습니다. 합격하는 개발자가 되기 위해서는 이 두 구조가 메모리 상에서 데이터를 처리하는 방식의 근본적인 차이와, 실제 운영체제나 네트워크 환경에서 어떤 문제를 해결하기 위해 선택되는지를 명확하게 제시할 수 있어야 합니다. 이번 글에서는 스택과 큐의 결정적 차이를 심층 분석하고, 현업에서 마주하게 될 실제 사용 사례를 통해 그 개념을 완벽하게 정립해 보겠습니다.
1. 구조적 차이점과 동작 원리 비교
스택과 큐는 모두 데이터를 일렬로 나열하여 저장한다는 공통점이 있지만, 데이터가 들어오고 나가는 '관문'의 형태에서 결정적인 차이를 보입니다.
1-1. 스택(Stack): 폐쇄적인 외길 통로
스택은 바닥이 막힌 깊은 상자와 같습니다. 입구와 출구가 상단(Top) 하나로 통일되어 있습니다. 따라서 데이터를 넣을 때(Push)도 위에서 넣고, 꺼낼 때(Pop)도 위에서 꺼내야 합니다. 이 구조적 특성 때문에 후입선출(LIFO: Last In, First Out)이라는 원칙이 탄생합니다. 가장 나중에 들어온 데이터가 가장 먼저 나가는 방식은 데이터의 '이력(History) 관리'나 '역추적'이 필요할 때 강력한 힘을 발휘합니다.
1-2. 큐(Queue): 개방적인 양방향 통로
반면 큐는 양쪽이 뚫려 있는 긴 터널이나 파이프와 같습니다. 한쪽 끝(Rear)에서는 데이터가 끊임없이 들어오고, 반대쪽 끝(Front)에서는 데이터가 들어온 순서대로 빠져나갑니다. 입구와 출구가 철저히 분리되어 있어 데이터의 흐름이 한 방향으로만 흐릅니다. 이러한 선입선출(FIFO: First In, First Out) 방식은 데이터의 '순서 보장'과 '공평성'이 핵심인 시스템에서 필수적입니다.
2. 스택(Stack)의 심층 활용 사례
스택은 주로 "잠시 하던 일을 멈추고 다른 일을 처리한 뒤, 다시 원래 상태로 되돌아가야 할 때" 사용됩니다.
2-1. 프로그램 메모리의 콜 스택(Call Stack)
우리가 작성하는 모든 코드는 스택 위에서 춤을 춥니다. 함수 A가 함수 B를 호출하면, 컴퓨터는 현재 실행 중이던 함수 A의 위치와 변수 정보(Context)를 스택 메모리에 저장(Push)합니다. 그리고 함수 B를 실행하러 떠납니다. 함수 B가 작업을 마치면, 컴퓨터는 스택의 맨 위에 저장해둔 함수 A의 정보를 꺼내(Pop) 정확히 멈췄던 지점으로 복귀합니다. 만약 스택이 없다면 함수 호출이 종료된 후 어디로 돌아가야 할지 길을 잃게 되어 프로그램 실행이 불가능해집니다.
2-2. 웹 브라우저와 에디터의 히스토리 관리
웹 서핑 중 '뒤로 가기' 버튼을 누르거나, 문서 작성 중 '실행 취소(Ctrl+Z)'를 누르는 행위는 모두 스택의 Pop 연산입니다. 사용자의 행동 하나하나를 스택에 쌓아두었다가, 취소 요청이 들어오면 가장 최근 행동(Top)을 제거하면서 이전 상태(Previous State)를 복원하는 것입니다. 이는 스택의 LIFO 특성을 가장 직관적으로 보여주는 사례입니다.
3. 큐(Queue)의 심층 활용 사례
큐는 "두 개체 간의 처리 속도 차이를 극복하거나, 비동기적으로 작업을 처리해야 할 때" 완충지대(Buffer) 역할을 합니다.
3-1. 비동기 데이터 처리와 메시지 큐(Message Queue)
현대적인 백엔드 시스템 아키텍처에서 큐는 없어서는 안 될 존재입니다. 예를 들어, 쇼핑몰에서 주문이 폭주하여 1초에 1만 건의 결제 요청이 들어온다고 가정해 봅시다. 데이터베이스 서버가 1초에 1천 건밖에 처리하지 못한다면 시스템은 즉시 다운될 것입니다. 이때 개발자는 '메시지 큐(Kafka, RabbitMQ 등)'를 도입합니다. 들어오는 주문 요청을 일단 큐에 안전하게 줄 세워 저장(Enqueue)합니다. 그리고 처리 서버가 자신의 능력에 맞춰 큐에서 하나씩 꺼내어 처리(Dequeue)합니다. 이를 통해 시스템의 과부하를 막고 안정성을 확보할 수 있습니다.
3-2. 운영체제의 프로세스 스케줄링(Scheduling)
컴퓨터의 CPU는 한 번에 하나의 프로세스만 실행할 수 있습니다. 하지만 우리는 음악을 들으며 웹서핑을 하고 문서를 작성합니다. 운영체제는 실행해야 할 프로세스들을 '준비 큐(Ready Queue)'에 순서대로 넣습니다. 그리고 아주 짧은 시간(Time Slice) 단위로 큐의 맨 앞에 있는 프로세스에게 CPU를 할당하고, 시간이 다 되면 다시 큐의 맨 뒤로 보냅니다. 먼저 온 프로세스에게 먼저 기회를 주는 FIFO 방식이 기본이 되기에 큐가 사용됩니다.
1. 스택은 입출구가 하나인 LIFO 구조로, 함수 호출이나 실행 취소 등 '되돌리기' 로직에 사용됩니다.
2. 큐는 입출구가 분리된 FIFO 구조로, 트래픽 폭주 제어나 스케줄링 등 '순차적 처리'에 필수적입니다.
3. 데이터 처리의 목적이 '상태 복원'이냐 '순서 보장'이냐에 따라 적절한 자료구조를 선택해야 합니다.