CS
메모리 구조 - 힙(Heap) & 스택(Stack)
이덩우
2023. 5. 26. 16:07
- 주기억장치 (RAM)
- 프로그램이 실행되기 위해서는 운영체제로부터 메모리 공간을 할당받게된다.
- 이처럼 할당받는 메모리공간은 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 구분된다.
- 코드 영역에는 실행할 프로그램의 코드가 한줄한줄 저장이되어 CPU에서 이를 처리한다.
- 데이터 영역에는 프로그램에 사용되는 전역 변수와 정적 변수들이 저장된다.
아래의 힙 영역과 스택 영역은 조금 더 자세히 살펴보자.
- 힙(Heap)
- 힙 영역은 프로그래머가 직접 공간을 할당, 해제하는 메모리 공간이다. C언어의 malloc() 또는 자바의 new 연산자를 통해 메모리를 할당하고, free() 또는 delete 연산자를 통해 메모리를 해제한다.
힙 영역은 가장먼저 들어온 데이터가 가장 먼저 빠져나가는, FIFO(First In - First Out) 규칙을 따른다. 이는 데이터가 주소가 낮은 곳에서 높은 곳으로 데이터가 쌓이고 빠져나가기 때문이다.
추가로, 힙 영역의 크기는 런타임에 따라 결정된다. (런타임, 컴파일타임의 정확한 의미는 뒷부분에 자세하게 알아보자.)
- 스택(Stack)
- 힙 영역과 다르게, 스택 영역은 프로그램이 자동으로 할당하고 사용하는 메모리 공간이다. 함수 호출, 메소드 호출 시 생성되는 지역 변수와, 매개 변수들이 저장되는 공간이다. 스택 영역은 가장 나중에 들어온 데이터가 가장 먼저 빠져나가는, LIFO(Last In - First Out) 규칙을 따른다. 이는 데이터가 주소가 높은 곳에서 낮은 곳으로 데이터가 쌓이고 빠져나가기 때문이다. 스택 영역은 스택 프레임으로 구성되는데, 이해하기 쉽게 자바에서는 A라는 메소드를 호출하게 되면, 메소드에 담겨있는 파라미터, 지역변수, 리턴값 등이 A() 스택 프레임안에 저장된다. 스택 영역에서는 push, pop을 통해 데이터를 저장하고 빼올 수 있다. 또한 스택 영역은 런타임의 크기가 아닌 컴파일 타임에 따라 크기가 결정된다
- 컴파일타임 vs 런타임
- 프로그램을 생성하기 위해 개발자는 첫째로 소스코드를 작성하고 컴파일이라는 과정을 통해 기계어코드로 변환 되어 실행 가능한 프로그램이 되며, 이러한 편집 과정을 컴파일타임(Compiletime) 이라고 부른다.
- 컴파일과정을 마친 프로그램은 사용자에 의해 실행되어 지며, 이러한 응용프로그램이 동작되어지는 때를 런타임(Runtime)이라고 부른다.
- 컴파일에러는 코드의 문법적 오류, 참조오류와 같은 상황을 이야기하며 일반적으로 문제가 있는 소스코드의 라인을 제시해준다.
- 반면 런타임에러는 컴파일을 마친 후 프로그램 실행 중, 예기치 못한 문제가 일어났을 때 발생한다. 예를들어 0으로 나누는 과정이 포함되어 있거나, 메모리 부족, null값의 참조 등이 이를 유발한다.