티스토리 뷰

목차


    반응형

    지금까지 우리는 데이터를 한 줄로 세우는 대표적인 선형 자료구조인 스택(Stack)큐(Queue)에 대해 각각 깊이 있게 알아보았습니다. 두 자료구조 모두 데이터를 임시로 보관하고 꺼내 쓰기 위한 목적을 가지고 있지만, 내부적으로 동작하는 철학은 하늘과 땅 차이입니다. 개발자 채용 면접의 단골 질문으로 "스택과 큐의 차이점을 구체적인 사례를 들어 설명해 보시오"라는 문항이 빠지지 않는 이유는, 개발자가 데이터의 흐름(Data Flow)을 명확히 통제하고, 주어진 상황의 문제 해결에 적합한 도구를 선택할 수 있는지 검증하기 가장 좋은 주제이기 때문입니다. 단순히 LIFO와 FIFO라는 영단어의 뜻을 암기하는 것을 넘어, 두 자료구조의 차이를 입체적으로 비교하고 실무적인 통찰을 길러보겠습니다.

    1. 구조적 차이점: 막힌 골목과 뚫린 터널

    [Image comparing Stack vs Queue data structures side by side]

    두 자료구조를 직관적으로 구분 짓는 가장 큰 특징은 바로 데이터가 들어오고 나가는 '입출구의 개수와 위치'입니다.

    1-1. 스택: 폐쇄적인 외길 구조 (1-Gate)

    스택은 밑바닥이 꽉 막힌 깊은 상자와 같습니다. 데이터가 들어가는 문과 나가는 문이 상단(Top) 한 곳으로 동일합니다. 따라서 데이터를 아무리 많이 밀어 넣어도(Push), 결국 꺼낼 때(Pop)는 가장 마지막에 쌓아 올린 최상단의 데이터부터 꺼내야만 합니다. 이러한 폐쇄적인 구조 때문에 '과거로의 회귀''상태의 역추적'을 해야 하는 로직에서 빛을 발합니다.

    1-2. 큐: 개방적인 양방향 구조 (2-Gate)

    반면 큐는 양쪽이 뻥 뚫려있는 파이프 튜브와 같습니다. 한쪽 끝(Rear)에서는 데이터가 끊임없이 들어오고, 반대쪽 끝(Front)에서는 들어온 순서 그대로 데이터가 빠져나갑니다. 철저하게 방향성이 존재하며, 새치기가 불가능한 구조입니다. 이 때문에 데이터의 '순서 보장''공평한 처리'가 생명인 로직에서 반드시 사용됩니다.

    2. 동작 원리와 철학의 차이 (LIFO vs FIFO)

    스택과 큐는 세상을 바라보고 데이터를 처리하는 철학 자체가 다릅니다.

    비교 항목 스택 (Stack) 큐 (Queue)
    원리 요약 LIFO (후입선출: 나중에 온 놈이 먼저 나감) FIFO (선입선출: 먼저 온 놈이 먼저 나감)
    핵심 키워드 최신순, 역추적, 되돌리기, 재귀 선착순, 순서 보장, 대기열, 버퍼
    조작 명령어 Push (넣기) / Pop (빼기) / Top (확인) Enqueue (넣기) / Dequeue (빼기) / Front (확인)
    접근 가능 구역 오직 한쪽 끝(Top)에서만 가능 양쪽 끝(Front, Rear)에서 각각 분리 수행

    3. 실무 애플리케이션에서의 선택 기준과 활용 사례

    현업에서 개발을 진행할 때, 직면한 문제 상황을 보고 "아, 이건 스택으로 풀어야겠다", "이건 큐가 적합하네"라고 판단할 수 있는 기준이 필요합니다.

    3-1. "최근의 상태를 기억하고 되돌아가야 한다면?" -> 스택(Stack)

    과거의 이력을 차곡차곡 쌓아두었다가 가장 최근의 일부터 하나씩 취소하거나 복구해야 할 때는 무조건 스택을 선택해야 합니다.

    • 텍스트 에디터의 실행 취소 (Ctrl + Z): 글을 쓰다 지웠을 때, 가장 마지막에 한 행동부터 취소되어야 하므로 LIFO 구조가 완벽히 들어맞습니다.
    • IDE의 괄호 짝 맞추기 검사: 코딩을 할 때 괄호 `({[]})` 가 올바르게 닫혔는지 컴파일러가 검사할 때, 여는 괄호를 스택에 넣고 닫는 괄호가 나올 때마다 스택의 맨 위(Top)와 짝을 맞추어 빼냅니다.
    • 웹 브라우저의 뒤로 가기: 최근 방문한 페이지부터 역순으로 보여주어야 하므로 방문 기록을 스택에 담습니다.

    3-2. "공평한 처리와 속도 차이의 극복이 필요하다면?" -> 큐(Queue)

    들어온 순서가 꼬이지 않고 정확히 지켜져야 하거나, 작업이 너무 많이 몰려 잠시 안전한 곳에 줄을 세워두어야 할 때는 큐를 선택해야 합니다.

    • 메시지 큐(Message Queue, Kafka, RabbitMQ): 쇼핑몰 할인 행사로 결제 요청이 초당 만 건씩 폭주할 때, 백엔드 서버가 다운되지 않도록 모든 요청을 큐에 차례대로 줄 세워 두고 서버 용량껏 순서대로 처리하게 만드는 현대 아키텍처의 필수 기술입니다.
    • 너비 우선 탐색 (BFS) 최단 경로: 알고리즘 문제에서 내비게이션처럼 목적지까지의 가장 빠른 최단 거리를 찾을 때, 현재 위치에서 가까운 곳부터 큐에 넣고 순서대로 탐색을 확장해 나갑니다.
    • 운영체제의 프로세스 스케줄링: CPU가 실행해야 할 여러 프로그램(음악 플레이어, 인터넷 창 등)을 준비 큐에 넣어두고, 공평하게 차례대로 실행 권한을 부여합니다.
    [핵심 요약]
    1. 스택(Stack)은 입출구가 같아 가장 최신 데이터가 먼저 처리되는 LIFO 구조로, 상태의 역추적에 적합합니다.
    2. 큐(Queue)는 입출구가 달라 들어온 순서대로 처리되는 FIFO 구조로, 데이터의 순서 보장과 속도 완충에 적합합니다.
    3. 개발자는 해결해야 할 비즈니스 로직이 '되돌리기'가 목표인지, '순차적 처리'가 목표인지 파악하여 구조를 선택해야 합니다.
    반응형