스택
차곡차곡 쌓아 올린 프링글스 감자칩처럼, 가장 마지막에 넣은 것을 가장 먼저 꺼내는 정리 상자예요.
정의 스택은 컴퓨터가 데이터를 차례대로 정리하는 대표적인 방법(자료구조) 중 하나예요. 좁은 상자에 책을 위로 쌓듯, 새로 들어온 데이터를 맨 위에 얹고 꺼낼 때도 맨 위에 있는 가장 최근 데이터부터 꺼내는 방식을 뜻해요.
식당에 쌓인 접시를 떠올려 보세요
식당 주방에 가면 설거지를 마친 접시들이 위로 높게 쌓여 있어요. 새로운 접시를 둘 때는 당연히 맨 위에 얹어 놓게 되죠. 접시를 쓸 때도 맨 밑에 있는 접시를 억지로 빼내지 않고, 가장 위에 있는 접시부터 자연스럽게 집어 들어요.
컴퓨터 세상에서도 데이터를 이렇게 쌓아 두는 구조를 스택이라고 불러요. 가장 늦게 들어간 데이터가 가장 먼저 나오는 원리예요. 프로그래밍에서는 이를 후입선출(LIFO, Last In First Out)이라고 불러요.
우리가 일상에서 자주 쓰는 기능 속에도 스택이 숨어 있어요. 웹 브라우저의 '뒤로 가기' 버튼이나 문서 작성 프로그램의 '실행 취소(Ctrl+Z)' 기능이 대표적인 예시예요.
컴퓨터가 할 일을 기억하는 방식
여러분이 공부하다가 친구의 전화를 받고, 통화 도중에 택배 기사님의 벨 소리를 들었다고 상상해 보세요. 이때 여러분은 가장 마지막에 일어난 택배를 먼저 받고, 그다음 통화를 마치고, 마지막으로 원래 하던 공부로 돌아올 거예요.
컴퓨터도 프로그램을 실행할 때 함수(특정 동작을 하는 코드 묶음)를 계속 호출하면서 똑같은 방식으로 일해요. 어떤 작업을 하다가 다른 작업을 부르면, 원래 하던 작업의 위치를 스택에 차곡차곡 쌓아 둬요. 이렇게 작업 순서를 기록하는 공간을 호출 스택(Call Stack)이라고 불러요.
부른 작업이 끝나면 컴퓨터는 스택 맨 위에서 기록을 꺼내 바로 직전 작업으로 안전하게 돌아가요. 스택 덕분에 복잡하게 얽힌 작업도 헷갈리지 않고 차례대로 되돌아갈 수 있는 것이죠.
조금 더 정확히 말하면: 넘치면 터지는 상자
스택은 데이터를 넣는 작업(Push)과 꺼내는 작업(Pop)이 오직 한쪽 끝에서만 일어나요. 그래서 맨 위 데이터의 위치만 기억하면 되기 때문에 데이터를 넣고 빼는 속도가 매우 빨라요.
하지만 스택 상자의 크기는 컴퓨터 메모리 안에서 무한하지 않아요. 만약 프로그램에 실수가 생겨서 끝없이 자기 자신을 부르는 오류(무한 재귀)가 발생하면, 스택에 기록이 계속 쌓여 결국 상자 밖으로 넘쳐흐르게 돼요.
이런 사고를 바로 스택 오버플로(Stack Overflow)라고 불러요. 유명한 개발자 질문 사이트 이름도 여기서 따왔을 만큼 프로그래밍에서 매우 유명하고 흔한 현상이에요. 컴퓨터는 메모리를 보호하기 위해 프로그램을 강제로 멈추게 돼요.
🤔 흔한 오해
스택은 중간에 있는 데이터도 쉽게 쏙 골라서 꺼낼 수 있다.
스택은 오직 맨 위에 있는 데이터에만 접근할 수 있어요. 중간이나 맨 아래 데이터를 꺼내려면 위에 쌓인 것들을 먼저 차례대로 다 비워내야 해요.
🧺 일상에서 만나요
가장 늦게 들어온 데이터를 가장 먼저 꺼내는 후입선출(LIFO) 방식의 데이터 보관함이에요.