본문 바로가기
게임 개발 일지/내일배움캠프 TIL

[C#] 스택과 힙, 값과 참조, 동적/정적 할당

by 빛하_ 2024. 2. 2.
기술면접 대비하기 #7

 

 

스택, 힙 메모리란 무엇이며 어떤 차이가 있는가?

 

스택과 힙은 동적 메모리의 유형이다. 동적 메모리는 프로그램 실행 중 해제가 가능하다.

 

(1) 스택

지역변수와 매개변수가 저장되는 곳이다. 

스택 메모리는 값(value) 형식이다.

C#에서는 스택 영역의 용량이 작다. (약 1MB 정도)

0으로 초기화 되는 자료형 (ex. public int n 까지만 선언해도 알아서 0으로 초기화)

스택 메모리의 경우 가지고 있는 데이터 (주소값 등)는 사용하면 사라진다. 

 

지역변수 (Loacal Variable) : 블록 안에서 선언된 변수들.

매개변수 (Parameter) : 함수에서 사용하기 위해 선언하는 변수들.

 

(2) 힙

힙 메모리는 참조(reference) 형식이다.

C#에서는 힙 영역의 용량이 크다.

null 로 초기화 되는 자료형을 담는다.

 

힙 메모리의 단점 ) 데이터를 사용하고 난 뒤에도 해당 데이터가 메모리에 남아있게 된다.

 

 

값 형식과 참조 형식의 차이는?

 

값(value) 형식 : Enum(사용자 열거형), Int32, Double, 사용자 구조체 등등

값 형식은 값을 가진 데이터를 동적 메모리 중 스택에 할당한다.

값 형식은 0으로 초기화 된다.

값 형식의 복사는 실제 값의 복사로 이루어진다.

 

참조(reference) 형식 : String(캐릭터의 배열), Array, Delegate, 인터페이스, 사용자 생성 클래스들

참조는 값과 다르게 힙에 데이터를 저장하고, 스택에 힙 영역의 메모리 주소를 저장한다.

참조 형식은 null로 초기화 된다.

참조 형식의 복사는 값의 참조 주소를 복사하는 형태이다.

 

++ 정적 할당과 동적 할당의 차이

(1) 정적 할당

직접 stack 영역까지 가서 메모리 공간을 빌리는 것. 컴파일 단계에서 고정적으로 메모리 공간을 부여하며 이후 조절이 불가능하다. 메모리 공간을 할당 받으면 실행단계에서 해제되지 않기 때문에 안정성이 있다. 함수가 사라지면 알아서 메모리 공간을 회수해가므로 편리하다. 다만, 메모리 공간의 크기를 초기에 설정하면 이후에 수정할 수 없으므로 메모리 공간이 낭비될 수 있다. 메모리가 더 필요한 상황에서 늘리기 어렵고, 노는 메모리를 잡을 수도 없어서 유연성이 떨어진다.

 

(2) 동적 할당

실행 단계에서 메모리 공간을 할당받는다. 포인터를 사용해 heap 영역을 가리켜 해당 공간을 할당한다.

장점은 원하는 만큼의 메모리를 맞춤형으로 할당할 수 있다는 것이다. 실행 단계에서 공간을 할당-해제 하므로 경제적이다. 유연성이 높아서 메모리가 더 필요하거나 필요하지 않을 때 공간을 효율적으로 사용할 수 있다.

단점은 더 이상 사용하지 않는 공간을 사용자가 직접 해제해야 한다는 것이다. 제 때 해제하지 않은 메모리는 누수로 이어진다. 

 

 

댓글