요약
C 언어로 선형 할당기를 떠올리며, 마지막 요소만 지우는 스택 구조가 함수 호출 스택의 기반이 된다는 점을 설명한다. 이후 지수 함수와 상환액 계산 예제를 통해 지역 변수, 인자, 반환값을 직접 만든 할당기로 옮기는 과정을 따라가며, 되감기와 최상단 포인터의 역할을 보여준다. 언어 내장 메커니즘이 특별한 마법이 아니라는 점을 확인하는 내용이다.
⏱ 00:001. 선형 할당기 복습과 참조 안정성
⏱ 00:00이번 영상은 메모리 관리 시리즈 3편으로, 앞선 2편에서 다룬 메모리 페이징과 가상 주소, 그리고 선형 할당기(linear allocator)를 떠올리며 시작합니다. 예제는 C 언어로 작성되지만 메모리를 직접 다룰 수 있는 언어라면 어디서든 같은 원리를 적용할 수 있다고 설명합니다.
2편에서 문자열 삭제를 단순히 자리만 남겨 두는 방식으로 처리한 이유는, 뒤따르는 요소들의 참조 안정성을 지키기 위해서였습니다. 이 부분이 이번 편의 출발점이 됩니다.
⏱ 01:022. 마지막 요소 삭제와 스택의 원리
⏱ 01:02배열 중간의 요소를 지우면 뒤 요소를 한 칸씩 당겨야 하지만, 마지막 요소를 지우면 옮길 요소가 없어 참조가 깨지지 않습니다. 이처럼 선형 컬렉션에서 가장 최근에 넣은 요소만 제거하는 성질을 살린 구조가 바로 스택입니다.
스택 삭제는 할당기의 길이를 마지막 할당 크기만큼 줄이기만 하면 되므로 매우 빠르고 단순합니다. 이후 새 요소를 넣으면 이전 값이 그 자리에서 덮어쓰여집니다.
⏱ 02:393. 함수 호출 스택과 스택 프레임
⏱ 02:39프로그래밍 언어의 자동 메모리 관리 가운데 가장 보편적인 방식이 함수 호출 스택입니다. C에서도 지역 변수, 함수 인자, 반환 주소가 함수 호출 시 자동으로 할당되고 반환 시 자동으로 해제됩니다.
컴파일러는 함수별로 매개변수, 지역 변수, 반환 주소 슬롯의 총 크기를 계산해 하나의 스택 프레임으로 묶습니다. 호출 때 할당기 길이를 프레임 크기만큼 늘리고, 반환 때는 같은 크기만큼 줄이는 방식입니다. 함수가 반환될 때는 항상 호출 스택의 가장 마지막 프레임이기 때문에 이것이 가능합니다.
반환 후에도 값이 지워지지 않기 때문에 지역 변수를 초기화하지 않으면 이전 호출의 잔여 값이 남아 있을 수 있습니다. 컴파일 옵션으로 새 프레임을 0으로 채울 수 있지만 기본값으로는 꺼져 있는 경우가 많습니다.
⏱ 04:534. 직접 만든 스택으로 지수 계산 구현
⏱ 04:53영상은 스택의 동작을 눈으로 확인하기 위해 주택담보대출 월 상환액 공식을 C로 구현하고, 지역 변수와 함수 인자를 모두 직접 만든 선형 할당기로 옮기는 실험을 진행합니다. 예시 조건은 원금 50만, 금리 5%, 기간 30년이며 월 상환액은 약 2684로 나옵니다.
먼저 지수 함수의 지역 변수들을 구조체로 묶고, 할당기에서 그 크기만큼 공간을 밀어 올려 포인터를 받아 사용합니다. 결과는 기존과 같지만, 함수가 끝난 뒤 길이를 되감지 않아 호출마다 프레임이 쌓이는 문제가 드러납니다.
⏱ 07:585. 되감기 문제와 최상단 포인터
⏱ 07:58함수 안에서는 반환 후의 코드를 실행할 수 없으므로, 할당과 되감기는 함수를 호출하는 바깥쪽 부모 함수에서 처리해야 합니다. 호출 전에 프레임을 밀어 올리고 호출 후 같은 크기만큼 되감는 과정이 스택의 pop에 해당합니다.
다음 문제는 함수 내부에서 프레임에 접근하는 것입니다. 할당기에 가장 최근 할당의 위치를 저장하는 포인터를 두면, 함수 안에서 그 포인터를 프레임 구조체로 캐스팅해 지역 변수를 사용할 수 있습니다. 이는 CPU의 스택 포인터 레지스터가 하는 일과 같은 원리입니다. 디버거로 확인하면 두 번째 호출 때 이전 값이 남아 있어, 초기화를 빠뜨리면 이전 결과가 재사용될 수 있음을 볼 수 있습니다.
⏱ 11:066. 인자와 반환값까지 프레임으로 옮기기
⏱ 11:06마지막으로 함수 인자와 반환값까지 스택 프레임에 넣습니다. 인자를 프레임에 미리 대입하고 반환값도 프레임 안에 기록하면, 함수 시그니처를 void로 바꾸고 호출 측에서 프레임을 통해 결과를 읽을 수 있습니다. 같은 방식을 월 상환액 계산 함수에도 적용해 전체 호출 구조를 직접 만든 스택으로 바꿉니다.
영상은 이것이 실무에서 언어 내장 기능 대신 쓰라는 뜻이 아니라고 강조합니다. 프로그래밍 언어, 런타임, 프레임워크도 같은 메모리 패킹 문제를 풀고 있으며 같은 자료 구조에 기대고 있다는 점을 이해하는 것이 핵심이라고 정리합니다.

