메모리
컴퓨터가 이해하는 정보는 0과 1로 표현된 정보들-데이터, 명령어이다.
메모리는 컴퓨터 구조 중 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품이다.
프로그램이 실행되려면 반드시 메모리에 저장되어 있어야 한다.
또한 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
컴퓨터가 빠르게 작동하기 위해서는 메모리 속에 저장된 명령어와 데이터의 위치가 정돈되어 있어야 하고 이때 메모리에 저장된 값이 빠르고 효율적으로 접근하기 위해 주소 개념을 사용한다.
컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다.
- 코드(code) 영역
- 데이터(data) 영역
- 스택(stack) 영역
- 힙(heap) 영역

코드 영역
실행할 프로그램의 코드가 저장되는 영역으로 '텍스트 영역'이라고도 한다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
데이터 영역
프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
스택 영역
함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장된다.
이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 하고, 함수의 호출이 모두 끝난 뒤 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있다.
스택 프레임 동작 방식
function main() {
func1(); // func1() 호출
return 0;
}
function func1() {
func2(); // func2() 호출
}
function func2() {}


스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출하는 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작한다. 즉 가장 늦게 저장된 데이터가 가장 먼저 인출된다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
스택 오버플로우(stack overflow)
함수의 재귀 호출이 무한히 반복되면 해당 프로그램은 스택 오버플로우에 의해 종료된다.
재귀 호출에 의한 스택 프레임이 계속해서 쌓여만 가고, 스택의 모든 공간을 다 차지하고 더 이상의 여유 공간이 없을 때 또 다시 스택 프레임을 저장하면 해당 데이터는 스택 영역을 넘어가서 저장된다.

해당 스택 영역을 넘어가도 데이터가 저장될 수 있으면, 해당 프로그램은 오동작을 하게 되거나 보안상의 큰 취약점을 갖게 되기 때문에, 실행 중인 프로그램에서 스택 오버플로우가 발생하면 에러를 발생하고 곧바로 강제 종료 시킨다.
힙 영역
메모리의 힙 영역은 사용자가 직접 관리할 수 있는, '그리고 해야만 하는' 메모리 영역이다.
사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
가비지 컬렉션(GC, Garbage Collection)
힙 영역에서 동적으로 할당했던 메모리 영역 중 필요없게 된 메모리 영역을 주기적으로 삭제하는 프로세스
C나 C++에는 가비지 컬렉션이 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야하지만 Java는 JVM에 탑재되어있는 가비지 컬렉터가 메모리 관리를 대행해준다.
스택 vs. 힙
변수가 차곡차곡 쌓이는 스택과는 달리 힙 영역에는 임의의 객체가 생성된다.
스택에 쌓이는 참조변수의 경우 함수가 끝나면 스택에서 해제되지만, 참조변수가 가리키고 있는 객체는 힙에서 지워지지 않는다.
힙 변수는 지역변수가 저장되는 스택과 달리 전역 변수를 저장하고, 힙 영역을 두면 하나의 객체를 여러 참조변수에서 공유하는 형태로 사용할 수 있기 때문에 훨씬 메모리 공간을 절약할 수 있다.
힙은 자유롭게 떠있는 공간에 가깝고 스택보다 크지만, 스택처럼 CPU에 의해 타이트하게 관리되지 않고 힙에 쓸 수 있는 변수 크기에 제한이 없어 메모리 누수(memory leak)의 위험이 있다.
간단하게 비교해보자면
- 스택은 연속적인 메모리 공간에 위치하고, 힙은 불연속한 메모리 공간에 위치
- 스택은 메모리 할당과 할당 해제가 자동으로 수행되고, 힙은 프로그래머가 수동으로 메모리를 할당하고 해제해야 한다.
- 스택은 정적 메모리를 저장하며 컴파일 타임에 크기가 결정되고, 힙은 동적 메모리를 저장하며 런타임에 크기가 결정된다.
- 스택 메모리 처리속도가 더 빠르다
- 스택의 메모리 크기는 변경할 수 없이 정해져 있으며, 힙은 메모리 크기를 유연하게 변경할 수 있다.
참고
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'프로그램 개발(분석, 설계, 코딩, 배포) > 100. 기타' 카테고리의 다른 글
IT, 의미, 2>/dev/null (1) | 2025.07.02 |
---|---|
Solaris11 네트워크 이중화 구성 (IPMP) 방법 (0) | 2025.06.30 |
Linux[vi, vim] 전체 내용 지우기 (0) | 2025.06.23 |
프로세스 매핑 가이드: 정의, 작성 방법, 활용 팁 (0) | 2025.05.26 |
특정금융정보법(특금법), 가상자산사업자 중요사항 정리 (0) | 2025.05.01 |