C#

C# Memory : 메모리

_dev_mu ㅣ 2023. 1. 10. 22:41

Memory : 메모리

운영체제 안에서 프로그램이 실행될 때마다 사용하게 되는 단기 데이터 기억장치를 말합니다.
RAM(렘 : Random Access Memory)라고도 합니다.
용도는 프로그램 안에서 어떤 일을 처리하게 될 때, 처리 대상의 내용이나 처리 결과를 단기로 기억하고 있어야 할 필요성이 생깁니다.
이 때 메모리를 사용하게 됩니다.

즉, 메모리에는 새로운 정보를 기록할 수 도 있고, 잠시 기억되어 있던 정보를 읽어와서 다른 처리에 사용되기도 합니다.

프로그램을 동작시킬 때 필요한 데이터를 임시 저장할 수 있는 공간 정도로 이해하면 됩니다.

 

메모리 영역

Code : 코드 영역
실행할 프로그램의 소스코드입니다. (명령어, 함수, 제어문...)
CPU는 코드 영역에 저장된 명령어를 하나씩 처리합니다.
프로그램이 시작하고 끝날 때까지 유지됩니다.
Data : 데이터 영역
전역 변수, 정적(static)변수가 저장됩니다.
static은 컴파일 시점에 크기를 할당하고 프로그램이 종료될때 까지 데이터 영역에 할당되어 있습니다.
Heap : 힙 영역
사용자에 의해 메모리가 할당 및 해제되는 공간입니다.
이 공간에 할당하는 것은 생성자를 통해 이루어지며 동적할당이라 합니다.
C#은 관리되는 언어입니다. 그래서 메모리 해제는 GC(가비지 컬렉터 : GC : Garbage Collector)에 의해 자동(주기적)으로 이루어 집니다.
런타임시에 크기가 결정됩니다.
낮은 주소에서 높은 주소의 방향으로 할당 됩니다.
int[] b = new int [100]

/*
스택에 배열공간을 확보하고
실제 데이터는 heap에 int형의 100개만큼 값이 들어있습니다.
스택의 배열공간안의 실제 값은 heap에 있기 때문에
stack[heap 주소]를 가리키고 있습니다.

즉, 실제 데이터는 heap에 담겨져있는데
스택은 공간만 확보해 두고 값은 heap주소를 가리키게 됩니다.

스택에서 공간이 매모리 해제가 되어도 heap의 데이터값은 남아있습니다.

heap의 데이터 값이 남아 있다면 G.C가 제거합니다.

만약 int[] b = new b[100]; int[] c = b; 라면
c는 b배열이 가리키고 있는 주소값을 복사해서 같이 가지게 됩니다.

즉, c[0] = 4; 로 다시 할당한다면 b[0] = 4 가 됩니다.

왜냐하면 배열은 스택에서 heap의 주소값만 가지게 되기 때문에
c라는 배열이 b배열이라고 할당하면, 주소값만 복사가 되기 때문이빈다..

스택은 값이 시작되는 시작주소를 가지게 됩니다.
heap
0000
		 int 100
0001

stack
arrayAdress -> 0000을 가리킨다.
*/
Stack : 스택 영역
메서드 호출시 생성되는 지역변수, 매개변수, 반환값이 저장되는 공간입니다.
메서드의 호출과 함께 할당되고 메서드가 종료되면 메모리가 해제됩니다.
후입선출방식에 따라 동작합니다. (메서드 호출  순서와도 관계가 있습니다.)
메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.
컴파일 시점에 크기가 할당됩니다.
//스택 프레임(Stack Frame)
/*
메소드 호출시 메소드에서 사용될 정보(지역변수,
매개변수, 반환값)가 스택에 저장되는데, 이것을
하나의 묶음으로 표현한 것입니다.
*/
Method1()
{
	Method2()
	{
		Method3()
		{
		}
	}
}

/*
위 코드의 호출 순서는 
Method1() -> Method2() -> Method3()
이는 곳 스택에 쌓이는 순서가 됩니다.
끝나는 순서는 Method3()가 마지막에 쌓인 것으로
제일 먼저 종료된다. 그래서
Method3() -> Method2() -> Method1()
순으로 종료되고, 이 순서대로 메모리에서
삭제됩니다.
*/

int a = 10;
int a1 = 20;
int a2 = 30;

/*
후입선출
스택공간에 a부터 a2까지 순서대로 쌓인후
a2부터 a순으로 빠진다.
1,2,3 순으로 쌓였다면 3,2,1 순으로 메모리가 해제된다.
*/

 

'C#' 카테고리의 다른 글

C# Boxing 및 Unboxing : 박싱 및 언박싱  (0) 2023.01.11
C# Type Conversion : 형변환  (0) 2023.01.10
C# 병렬화와 비동기 패턴  (0) 2023.01.09
반복문 : for, foreach, do 및 while  (0) 2023.01.09
if문 - switch문  (0) 2023.01.09