프로그래밍 기초 · 선형 구조: 매일 쓰는 것들

스택: Cmd+Z와 「스택 오버플로」의 비밀

두 번째 수납 방식은 접시 더미처럼 생겼어요: 맨 위에서만 넣고, 맨 위에서만 꺼낼 수 있어요 — 이게 스택이에요. 제약이 커 보이죠? 그런데 매일 누르는 실행 취소 키, 프로그램의 함수 호출마다, 전부 이것에 기대고 있어요. 이 강의는 문서를 마음껏 망가뜨린 뒤 한 번에 되돌리고, 마지막으로 「스택 오버플로」 사고를 구경해요 — 세계 최대 프로그래머 Q&A 사이트 Stack Overflow의 이름은 그 사고에서 왔어요.

먼저 해보기 · 실행 취소 키의 진짜 모습

왼쪽은 미니 문서예요. 네 버튼으로 마음대로 만져 보세요. 오른쪽을 눈여겨보세요: 매 단계 조작이 카드 한 장으로 푸시되어 「조작 스택」에 쌓여요 — 나중에 한 일이 위에 올라가요. 충분히 만졌으면 「⌘Z 실행 취소」를 몇 번 연타해 보고, 어떤 순서로 되돌아가는지 봐요.

📄 미니 문서

마음대로 만지세요, 아깝지 않아요

🥞 조작 스택

매 단계마다 카드 한 장; 맨 위 = 가장 최근

(아직 조작 없음)
해보기: 두 줄 치기 → 빨강 표시 → 세 번 실행 취소, 복원 순서를 맞춰 보세요
보이시나요? 실행 취소는 언제나 가장 최근 단계부터 취소해요. 그건 프로덕트 매니저의 선택이 아니라, 스택의 본성이에요: 후입선출(LIFO, Last In First Out). 꼭대기에서만 꺼내니, 제일 먼저 손에 잡히는 건 마지막에 올린 것이에요. 실행 취소가 이 순서를 안 따르면 — 열 단계 전 조작부터 취소하면 — 문서는 바로 엉망이 돼요. 「왔던 길로 되돌아가기」라면, 태생적으로 스택으로 수납해야 해요.
프로그램은 「어디로 돌아갈지」를 어떻게 기억하나요?

AI에게 「저녁 만들기」를 시키면, 하다가 채를 썰어야 하고, 썰다가 칼이 무뎌서 갈아야 해요…… 「하던 일을 멈추고 다른 일을 할」 때마다 프로그램은 현재 진행을 스택에 푸시해요. 아래 애니메이션을 보세요(여기로 스크롤하면 자동으로 한 번 재생돼요). 각 작업이 끝난 뒤 프로그램이 어떻게 자동으로 이전 작업을 다시 찾는지 눈여겨보세요.

준비 완료「재생」을 누르거나 여기로 스크롤해서, 호출과 복귀의 한 판을 통째로 보세요
이 스택을 함수 호출 스택이라고 하고, 카드 한 장을 「스택 프레임」이라고 해요. 안에는 「이 작업이 어디까지 했는지, 끝나면 어디로 돌아갈지」가 적혀 있어요. 프로그램에 전역 지휘자가 필요 없어요 — 꼭대기를 팝하면, 자연히 한 단계 위 멈춘 자리로 돌아가요. 배운 Agent도 같아요: 메인 작업 하다가 자료를 먼저 찾아야 하면 메인 작업을 푸시하고 하위 작업을 먼저 하고, 끝나면 팝한 뒤 메인 작업을 이어서 해요.
스택 오버플로 현장 · Stack Overflow는 어떻게 일어나나요

스택 용량은 유한해요. 아래 함수는 자기 자신을 호출해요(이걸 재귀라고 해요). 왼쪽은 코드, 오른쪽은 호출 스택. 먼저 종료 조건을 체크하지 않고 한 번 돌려 보고 무슨 일이 생기는지 봐요; 그다음 체크하고 다시 돌려 비교해 보세요.

function 倒数(n) { if (n === 0) return; // 终止条件(保险丝) 打印(n); 倒数(n - 1); // 自己调用自己 } 倒数(5);
💥 Stack Overflow스택 오버플로, 프로그램 붕괴
먼저 그대로 실행해 보세요 — 퓨즈 없는 재귀의 결말을 봐요
이게 AI랑 무슨 상관인가요? 아주 커요. Agent도 「메인 작업을 푸시하고 하위 작업을 먼저」 해요. 하위 작업이 또 하위 작업을 파생시키고, 끝없이 겹치면? 종료 조건 없는 재귀와 똑같아요 — 그래서 제대로 된 Agent 프레임워크는 전부 최대 걸음 수 / 최대 깊이를 두고, 넘으면 강제 정지해요. 그 퓨즈가 「무한 재귀」에 대한 보험이에요. 다음에 AI가 쓴 재귀 코드를 보면, 검수 목록 첫 줄: 종료 조건이 어디 있나요?

✅ 이 강의가 전하고 싶은 것