💻 프로그래밍

스택

Stack

LIFO(후입선출) 자료구조. 함수 호출, 재귀에서 사용. 또는 기술 스택(Tech Stack)을 의미.

📖 상세 설명

스택(Stack)은 LIFO(Last In, First Out) 원칙을 따르는 선형 자료구조입니다. 마지막에 추가된 요소가 가장 먼저 제거되는 특성을 가지며, 접시를 쌓는 것과 같은 원리입니다. push로 요소를 추가하고 pop으로 요소를 제거하는 단순하지만 강력한 구조입니다.

프로그래밍에서 스택은 함수 호출 관리에 핵심적입니다. 함수가 호출되면 반환 주소, 매개변수, 지역 변수가 콜 스택에 푸시되고, 함수가 끝나면 팝됩니다. 재귀 함수가 깊어지면 스택 오버플로우가 발생하는 이유이기도 합니다. 각 스레드는 독립적인 콜 스택을 가집니다.

스택은 다양한 알고리즘에서 활용됩니다. 괄호 매칭 검사, 수식의 후위 표기법 변환, 깊이 우선 탐색(DFS), 실행 취소(Undo) 기능 등이 대표적입니다. 브라우저의 뒤로 가기 버튼도 방문 기록을 스택으로 관리하여 구현됩니다.

기술 스택(Tech Stack)은 다른 의미로 사용됩니다. 웹 개발에서 LAMP(Linux, Apache, MySQL, PHP)나 MERN(MongoDB, Express, React, Node.js)처럼 소프트웨어 개발에 사용되는 기술들의 조합을 말합니다. 프론트엔드, 백엔드, 데이터베이스 등 각 레이어의 기술 선택을 포괄합니다.

💻 코드 예제

// 스택 자료구조 구현 및 활용 예제

// JavaScript 스택 구현
class Stack {
    constructor() {
        this.items = [];
    }

    push(element) {
        this.items.push(element);
    }

    pop() {
        if (this.isEmpty()) return null;
        return this.items.pop();
    }

    peek() {
        if (this.isEmpty()) return null;
        return this.items[this.items.length - 1];
    }

    isEmpty() {
        return this.items.length === 0;
    }

    size() {
        return this.items.length;
    }
}

// 스택 사용 예시
const stack = new Stack();
stack.push(10);
stack.push(20);
stack.push(30);
console.log(stack.pop());   // 30
console.log(stack.peek());  // 20

// 괄호 매칭 검사 (스택 활용)
function isBalanced(str) {
    const stack = [];
    const pairs = { ')': '(', ']': '[', '}': '{' };

    for (const char of str) {
        if ('([{'.includes(char)) {
            stack.push(char);
        } else if (')]}'.includes(char)) {
            if (stack.pop() !== pairs[char]) return false;
        }
    }
    return stack.length === 0;
}

console.log(isBalanced('({[]})')); // true
console.log(isBalanced('([)]'));   // false

🗣️ 실무 대화 예시

PM: "신규 프로젝트 기술 스택을 어떻게 결정하면 좋을까요?"

기술 리더: "요구사항과 팀 역량을 고려해야 해요. 실시간 기능이 많으니 Node.js와 Socket.io, 프론트는 React가 적합할 것 같습니다."

백엔드 개발자: "데이터베이스는 PostgreSQL을 제안드립니다. 복잡한 관계형 쿼리가 많을 예정이라서요."

기술 리더: "좋습니다. PERN 스택(PostgreSQL, Express, React, Node.js)으로 가죠."

면접관: "스택과 큐의 차이점과 각각 어떤 상황에서 사용하는지 설명해 주세요."

지원자: "스택은 LIFO로 마지막 요소가 먼저 나오고, 큐는 FIFO로 첫 요소가 먼저 나옵니다. 스택은 함수 호출, Undo 기능, DFS에 사용되고, 큐는 작업 대기열, BFS, 이벤트 처리에 사용됩니다."

면접관: "스택 오버플로우는 언제 발생하나요?"

지원자: "재귀 함수의 종료 조건이 없거나 깊이가 너무 깊을 때 콜 스택이 한계를 초과하면 발생합니다. 이를 방지하려면 반복문으로 변환하거나 꼬리 재귀 최적화를 사용합니다."

리뷰어: "이 재귀 함수는 입력이 크면 스택 오버플로우가 발생할 수 있어요."

작성자: "맞네요. 깊이가 예측 불가능한 상황이라 문제가 될 수 있겠어요."

리뷰어: "명시적 스택을 사용한 반복문으로 변환하면 힙 메모리를 사용하니까 더 안전해요."

작성자: "좋은 제안이에요. while 루프와 배열 스택으로 리팩토링하겠습니다."

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기