내가 개발한 프로그램이 어떻게 동작하는지 파악하기 위해서는 메모리 구조에 대해서 알아야 합니다.
내가 선언한 변수가 메모리 공간 중 어디에 속하고, 내가 만든 함수, 객체가 어디에서 어떻게 동작하는지 알아보도록 하겠습니다.
조금 더 넓은 범위에서 메모리 구조를 알고 싶다면 제가 이전에 포스팅했던 [OS] 5. 프로세스란?과 [OS] 5-1. 프로스세 주소공간을 참고하시면 더 좋을 것 같습니다.
실행 중인 프로그램을 프로세스라고 이야기합니다. 이 때 프로그램이 메모리에서 실행되는 것입니다.
프로세스는 메모리에서 다음과 같이 공간을 사용합니다.
프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되는 공간입니다.
쉽게 말해서 직접 작성하는 코드들이 있는 곳입니다.
실행중에는 수정될 수가 없는 영역입니다. (ReadOnly 상태)
프로그램을 실행하고 나면 클래스 내부의 변수나 함수를 수정할 수 없습니다.
class Player
{
string name = "KIm";
int level = 1;
int HP = 5;
int attackPower = 2;
void Attack()
{
Console.WriteLine("플레이어가 공격합니다.");
}
}
데이터 영역에는 static
으로 선언된 정적 변수와 전역 변수가 저장됩니다.
프로그램이 시작되는 동시에 정적 키워드로 선언된 것들이 저장됩니다.
컴파일 시점에 크기를 할당하는 영역입니다.
힙 영역에는 클래스를 통해 생성한 인스턴스가 저장됩니다.
사용자 관리 영역으로 사용자 정의에 의해 할당된 메모리를 저장하거나 해제하는 동적 할당을 사용합니다.
스택 영역은 함수가 실행될 때 사용되는 공간입니다.
지역 변수, 매개 변수가 저장되고 컴파일 시점에 크기를 할당하는 정적 할당을 사용하는 영역입니다.
C# 프로그램의 시작점인 메인 함수도 스택에 공간을 할당받습니다.
함수가 실행이 종료되면 자동으로 해제되는 영역입니다.
값(Value) 형식의 변수와 참조(Reference) 형식의 변수는 메모리를 참조하는 방식이 다릅니다.
일반적인 값 형식인 int, char, bool 등의 값과 사용자가 선언한 구조체(struct)도 값 형식으로 스택 영역에 저장됩니다.
참조 형식의 변수는 스택 영역과 힙 영역을 동시에 사용합니다.
스택 영역에는 데이터의 주소, 힙 영역에는 데이터의 값을 저장합니다.
string, object가 참조 형식의 변수에 해당합니다.
C#은 개발자가 메모리 해제에 크게 신경쓰지 않아도 됩니다.
가비지 콜렉터(Garbage Collector)가 메모리를 알아서 관리해주기 때문입니다.
정확히는 힙 영역에서 더 이상 참조되지 않는 메모리를 주기적으로 정리해줍니다.
만약 함수 안에서 new로 생성된 클래스 인스턴스는 그 함수가 종료되었다면 더 이상 사용하지 않는 가비지가 됩니다.
가지비 콜렉터는 이런 가비지를 주기적으로 정리해주는 역할을 하고 있습니다.
그리고 앞서 설명드렸듯이 스택 영역은 함수가 종료되면 저절로 정리 되기 때문에 C#은 메모리 해제에 개발자가 직접 관여하지 않아도 됩니다.
정말 잘 읽었습니다, 고맙습니다!