728x90
안녕하세요.
컴퓨터 프로그램이 실행될 때 메모리는 다양한 용도로 나뉘어 사용되는데요,
그래서! 오늘은 메모리의 각 영역이 어떻게 동작하는지에 대해서 정리해보도록 하겠습니다.
1. 코드(Code) 영역
- 프로그램의 기계어 코드(실행할 프로그램의 코드/컴파일된 명령어)가 저장되는 메모리 공간
- 컴파일된 프로그램의 명령어들이 이 영역에서 저장됨
- 읽기 전용 : 보안 및 안정성을 위해 프로그램 실행 중 수정되지 않음
- 고정 크기 : 실행되는 코드의 크기에 따라 공간이 할당됨
- 공유 가능 : 동일한 프로그램을 여러 프로세스가 실행하는 경우 코드 영역은 공유될 수 있음
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!"); // 코드 영역에 저장
}
}
main() 메서드의 기계어 코드가 메모리의 코드 영역에 저장되며 이 코드는 프로그램이 실행되는 동안 그대로 유지됨
2. 데이터(Data) 영역
- 전역 변수, 정적 변수(static variables)가 저장되는 공간
- 영구성 : 프로그램이 실행되는 동안 유지되며 프로그램이 종료될 때까지 살아있음
- 코드 영역처럼 읽기 전용이 아니며 수정 가능
public class DataExample {
static int counter = 0; // 데이터 영역에 저장
int globalVar = 10; // 전역 변수, 데이터 영역에 저장
}
counter와 globalVar는 프로그램이 실행되면 데이터 영역에 저장되며 프로그램이 종료될 때까지 그 값을 유지함
3. 스택(Stack) 영역
- 지역 변수와 함수 호출 정보가 저장되는 공간
- LIFO(Last In First Out) 구조를 가짐
- 함수가 호출되면 해당 함수의 지역 변수, 매개변수 등이 스택에 저장되고 끝나면 자동으로 제거됨 -> 고급 언어(ex. 자바, 파이썬 등)에서는 이 과정을 자동으로 관리하지만, 저급 언어(ex. C)에서는 수동으로 메모리 해제를 해줘야 함
- 메모리 접근 속도가 매우 빠르지만 메모리의 크기가 고정(제한적)되어 있음
- 스택 오버플로우 위험!! : 너무 많은 데이터를 스택에 저장하려 하면 스택 오버플로우(Stack Overflow) 오류 발생
public void stackExample() {
int x = 10;
int y = 20; // 둘 다 스택에 저장
}
위 자바코드에서 x와 y는 함수가 실행될 때 스택에 할당되었다가 함수가 종료되면 자동으로 제거됨
4. 힙(Heap) 영역
- 객체, 배열과 같은 데이터가 저장됨
- 동적 할당 : 동적 메모리 할당이 이루어지는 공간. new 키워드나 메모리 할당 함수를 사용해 메모리를 동적으로 할당
- 크기가 유연하지만 메모리 해제가 늦어질 경우 성능에 영향을 줄 수 있음
- 메모리 해제 : 자바에서는 가비지 컬렉터가 자동으로 메모리를 관리하지만(그 외 고급 언어도 관리해주는 게 있음) C, C++같은 저급 언어에서는 프로그래머가 직접 메모리를 해제해야함
Cat cat = new Cat("뭉이"); // 힙에 객체 저장
위 코드에서 Cat 객체는 힙에 할당되고, 스택에 있는 cat 변수는 이 힙에 할당된 객체를 참조함
요약
메모리 영역 | 설명 | 용도 |
코드(Code) 영역 | 프로그램의 실행 코드가 저장되는 읽기 전용 영역 | 명령어 저장 |
데이터(Data) 영역 | 전역 변수, 정적 변수가 저장되는 공간 | 전역 변수, 정적 변수 저장 |
스택(Stack) 영역 | 함수 호출 시 지역 변수와 매개변수가 저장되는 고정 크기 메모리 공간 | 지역 변수, 함수 호출 데이터 저장 |
힙(Heap) 영역 | 동적 메모리 할당을 위한 유연한 공간 | 객체, 배열 등의 동적 데이터 저장 |
728x90
'CS > 컴퓨터구조' 카테고리의 다른 글
[CS/컴퓨터구조] 3. 명령어 (1) | 2024.01.15 |
---|---|
[CS/컴퓨터구조] 2. 데이터 (1) | 2024.01.14 |
[CS/컴퓨터구조] 1. 컴퓨터 구조 시작하기 (0) | 2024.01.14 |