[C#] 메모리

KYJ의 Tech Velog·2023년 7월 19일
0

C#

목록 보기
2/6

내가 개발한 프로그램이 어떻게 동작하는지 파악하기 위해서는 메모리 구조에 대해서 알아야 합니다.

내가 선언한 변수가 메모리 공간 중 어디에 속하고, 내가 만든 함수, 객체가 어디에서 어떻게 동작하는지 알아보도록 하겠습니다.


메모리 구조

조금 더 넓은 범위에서 메모리 구조를 알고 싶다면 제가 이전에 포스팅했던 [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 vs Reference

값(Value) 형식의 변수와 참조(Reference) 형식의 변수는 메모리를 참조하는 방식이 다릅니다.

Value

일반적인 값 형식인 int, char, bool 등의 값과 사용자가 선언한 구조체(struct)도 값 형식으로 스택 영역에 저장됩니다.

Reference

참조 형식의 변수는 스택 영역과 힙 영역을 동시에 사용합니다.

스택 영역에는 데이터의 주소, 힙 영역에는 데이터의 값을 저장합니다.

string, object가 참조 형식의 변수에 해당합니다.


C#의 메모리 관리

C#은 개발자가 메모리 해제에 크게 신경쓰지 않아도 됩니다.

가비지 콜렉터(Garbage Collector)가 메모리를 알아서 관리해주기 때문입니다.

Garbage Collector

정확히는 힙 영역에서 더 이상 참조되지 않는 메모리를 주기적으로 정리해줍니다.

만약 함수 안에서 new로 생성된 클래스 인스턴스는 그 함수가 종료되었다면 더 이상 사용하지 않는 가비지가 됩니다.

가지비 콜렉터는 이런 가비지를 주기적으로 정리해주는 역할을 하고 있습니다.

그리고 앞서 설명드렸듯이 스택 영역은 함수가 종료되면 저절로 정리 되기 때문에 C#은 메모리 해제에 개발자가 직접 관여하지 않아도 됩니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

정말 잘 읽었습니다, 고맙습니다!

답글 달기