코린이 탈출기
메모리 구조 본문
메모리는 흔히 RAM을 지칭합니다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 코드, 데이터, 힙, 스택이 있습니다.
메모리 구조를 보기 전 메모리 공간에 대해 PC를 사용할 때 동작하는 것을 예시로 설명하겠습니다.
사용자가 프로그램을 실행하기 위해 클릭하는 동작은 운영체제에 실행파일을 실행하도록 요청하는 것입니다.
운영체제는 프로그램의 정보를 읽고 메모리 공간을 할당해주면 코드를 메모리에 등록하고 실행하며 동작하게 됩니다.

코드(Code) / 텍스트(Text)
- 프로그램의 코드가 실행하기 위해 저장되어 있는 영역으로 '텍스트(Text) 영역'이라고도 부릅니다.
- 저장되는 코드는 기계어 형태(0, 1)로 저장됩니다.
- 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 해당합니다.
- 프로그램이 시작과 종료될 때까지 메모리에 남아있습니다.
- CPU는 코드 영역에 저장된 명령어들을 하나씩 가져가서 실행합니다.
데이터(Data)
- 전역 변수와 정적 변수가 저장되는 영역입니다.
- 메인(main) 함수가 실행되기 전(프로그램 실행 전)에 선언되어 프로그램이 끝날 때까지 남아있는 변수들이라는 특징이 있습니다.
- 프로그램이 시작과 함께 메모리가 할당되며, 종료 시 소멸됩니다.
힙(Heap)
- 프로그래머가 직접 공간을 할당, 제어하는 영역입니다. 즉, 사용자에 의해 관리되는 영역입니다. 프로그래머가 원하는 시점에서 변수를 할당하고 소멸하는 영역입니다.
- 동적으로 할당되는 변수들이 여기에 저장되어 동적 할당 영역이라고도 부릅니다.
- 메모리 영역 중 유일하게 런타임 시 크기가 결정됩니다.
- 메모리가 낮은 주소에서 높은 주소로 할당됩니다.
- 선입선출 형태입니다.
- java로 보면 클래스나, 참조 변수가 해당합니다.
- 사용 후 반드시 메모리를 해제해주어야 하는데, 그렇지 않으면 메모리 누수(Memory Leak)가 발생합니다. 메모리가 응용 프로그램이 종료될 때까지 유지되기 때문입니다. java의 경우에는 가비지 컬렉터가 자동으로 해제합니다.
스택(Stack)
- 프로그램이 자동으로 사용하는 임시 메모리 영역입니다.
- 함수 호출 시 함수 내에 생성된 지역 변수와 매개변수가 저장되는 영역입니다. 메인(main) 함수 안에서의 변수들도 포함됩니다.
- 함수 호출 완료 시 메모리는 삭제됩니다. 즉, 함수가 종료되면 해당 함수에 할당된 변수들을 해제시킵니다. 이는 스택 자료구조의 pop과 기능이 같습니다.
- 컴파일 시 크기가 결정됩니다.
- 메모리가 높은 주소에서 낮은 주소로 할당됩니다.
- 후입선출 형태입니다.

힙(Heap) vs 스택(Stack)
사실 힙과 스택은 같은 공간을 공유하고 있습니다. 그 공간 안에서 힙과 스택은 각각 할당된 영역이 있습니다. 이 영역을 상대가 침범하게 되면 Overflow가 됩니다.
HeapOverFlow
힙 영역에 할당된 영역의 경계선 밖으로 넘어갈 때 발생합니다. 예시로는 매우 큰 데이터를 생성하려고 할 때 발생합니다. 즉, 메모리 부족(OutOfMemory)이 있습니다.
StackOverFlow
호출된 스택이 할당된 스택 영역 경계선 밖으로 넘어갈 때 발생합니다. 예시로는 재귀 호출에서 발생합니다. 재귀 함수를 간단하게 소개하자면 '재귀' 말 그대로 자기 자신을 호출합니다. 이를 무한하게 할 경우 StackOverFlow가 발생하는 것입니다.
'안드로이드 면접 질문 > CS 예상 질문' 카테고리의 다른 글
| 프로세스(Process) vs 스레드(Thread) (0) | 2022.05.19 |
|---|---|
| 동기 VS 비동기 (0) | 2022.01.12 |
Comments