📌 메모리 구조
프로그램이 실행되기 위해선 먼저 프로그램이 메모리에 로드되어야한다.
컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고, 각각의 메모리 공간은 상호 작용하며 프로그램 실행에 기여한다.
아래 그림은 프로그램의 정보를 읽어 메모리에 로드되는 과정을 보여주며, 프로그램을 실행하게 되면 OS는 메모리(RAM)에 공간을 할당해준다.

메모리 공간은(RAM) 크게 코드(Code), 데이터(Data), 스택(Stack), 힙(Heap) 영역으로 나뉜다.
- 코드(Code) 영역: 실행할 프로그램의 코드
- 데이터(Data) 영역: 전역 변수, 정적 변수
- 힙(Heap) 영역: 런타임 시 크기가 결정됨(사용자의 동적 할당)
- 스택(Stack) 영역: 컴파일 타임에 크기가 결정됨
컴파일 타임
작성한 소스코드가 컴파일(compile)이란 과정을 통해 기계가 읽을 수 있는 형태로 변환되는 과정
런타임
컴파일 과정을 마친 컴퓨터 프로그램이 실행되고 있는 환경 또는 동작되는 동안의 시간
▶︎ 코드(Code) 영역
- 작성한 소스코드가 저장되는 영역으로 텍스트 영역이라고도 부른다.
- 기계어 형태(0,1)로 저장한다.
- 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.
- CPU는 코드 영역에 저장된 명령어들을 하나씩 가져가서 실행한다.
▶︎ 데이터(Data) 영역
- 전역 변수와 정적 변수(static)가 할당되는 영역이다.
- 메인 함수 전에 선언되어 프로그램의 시작과 동시에 할당되고 프로그램이 종료돼야 메모리가 소멸된다.
▶︎ 힙(Heap) 영역
- 이 공간에 메모리 할당하는 것을 동적 할당(Dynamic Memory Allocation) 이라고 부른다.
- 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
- 응용 프로그램이 종료될 때까지 메모리가 유지되기 때문에 사용하고 난 후 반드시 매모리 해제를 해줘야 한다.(memory leak 발생), Java에서는 가비지 컬렉터가 자동으로 해제한다
- 영역 중 유일하게 런타임시 크기가 결정
- 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장되는 공간,
단 힙 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 스택에 적재
- 메모리의 낮은 주소부터 할당되는 선입선출(FIFO) 구조
▶︎ 스택(Stack) 영역
- 프로그램이 자동으로 사용하는 임시 메모리 영역
- 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역
- 함수 호출이 완료되면 저장된 메모리도 해제된다
- 메모리의 높은 주소부터 할당되는 후입선출(LIFO) 구조

Heap 영역과 Stack 영역은 사실 같은 공간을 공유한다. Heap이 메모리 위쪽 주소부터 할당되면 Stack은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데, 이를 각각 Heap Overflow, Stack Overflow 라고 칭한다.
따라서 Stack 영역이 클수록 Heap 영역이 작아지고, Heap 영역이 크면 Stack 영역이 작아진다.
참고 https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/
해당 내용 잘 읽었습니다.
혹시 해당글 참조하여 제 블로그에 업로드해도 괜찮을까요?