값 형식(Value Types)과 참조 형식(Reference Types)
C#에서는 메모리에 공간에 데이터를 할당하는 두 가지 방법이 있습니다.
값 형식(Value Types)은 스택(Stack) 공간에 데이터를 할당하며, 참조 형식(Reference Types)은 힙(Heap) 공간에 데이터를 할당합니다.
이번 포스팅에서는 값 형식과 참조형식에 대해 정리하였습니다.
목차
스택(Stack)과 힙(Heap)
스택(Stack)
- 정적으로 메모리에 할당됩니다.
- 스택 영역에 있는 변수들은 선언된 함수를 빠져나가면 소멸됩니다.(= 블록을 닫는 괄호 "}"를 만나면 소멸됩니다.)
- FILO(First In Last Out) 또는 LIFO(Last In First Out)구조라고도 하는데, 스택 영역에 처음에 생성되었던 변수는 마지막에 소멸되고 마지막에 생성되었던 변수는 처음으로 소멸됩니다.
힙(Heap)
- 동적으로 메모리에 할당됩니다.
- 프로그래머가 원하는 시점에 동적으로 메모리를 할당하는데, 바로 이러한 유형의 변수들이 할당되는 영역이 힙 영역입니다.
- CLR의 가비지 컬렉터(Garbage Collector)가 힙 영역에 사용되지 않는 데이터들을 소멸시킵니다.
스택(Stack)과 값 형식(Value Type)
값 형식은 스택 메모리 공간에 데이터가 생성이 되며 값을 직접적으로 가지고 있습니다.
"{"를 시작으로 데이터가 순차적으로 생성이되며, "}"를 만나면 데이터가 순차적으로 소멸이 됩니다.
{ // 1. 블록 시작
int a = 100; // 2. 변수 a 선언 및 초기화
int b = 200; // 3. 변수 b 선언 및 초기화
} // 4. 블록 종료
1. 블록 시작
블록 시작 시점에는 스택 영역에 아무것도 존재하지 않습니다.
2. 변수 a 선언 및 초기화
int a = 100; 코드가 실행이 되면서 변수 a가 스택 영역에 쌓이게 됩니다.
3. 변수 b 선언 및 초기화
int b = 200; 코드가 실행이 되면서 변수 b가 a위에 쌓이게 됩니다.
4. 블록 종료
블록을 종료하는 "}"를 만났으므로 블록 사이({ ~ })에 있는 변수들이 소멸됩니다.
① 스택은 마지막에 들어온 변수가 제일 먼저 소멸되므로 변수 b가 소멸됩니다.
② 변수 b 이전에 들어온 변수 a가 그다음으로 소멸됩니다.
③ 변수 a, b가 모두 소멸된 스택의 메모리 공간입니다.
힙(Heap)과 참조 형식(Refenect Type)
참조 형식은 힙 영역에 데이터가 저장이 되고 스택 영역에서는 데이터가 저장되어 있는 힙 영역의 메모리의 주소를 저장합니다.
스택 영역에 실제로 값을 가지고 있는게 아니라 힙 영역의 데이터를 참조하고 있으므로 "참조 형식"이라고 합니다.
{ // 1. 블록 시작
object a = 100; // 2. 변수 a 생성 및 초기화
object b = 200; // 3. 변수 b 생성 및 초기화
} // 4. 블록 종료
1. 블록시작
블록 시작 시점에는 스택 영역과 힙 영역에는 아무것도 존재하지 않습니다.
2. 변수 a 생성 및 초기화
object는 참조 형식이므로 변수 a는 스택 영역에 생성되고 변수 a의 실제 값인 100은 힙 영역에 생성이됩니다.
스택 영역에 생성된 변수 a는 힙 영역에 생성된 100의 주소값인 1000을 가지고 있습니다.
변수 a는 주소값 1000으로 힙 영역에 접근하게 됩니다.
3. 변수 b 생성 및 초기화
스택 영역에 생성된 변수 b는 힙 영역에 생성된 200의 주소값을 가지고 있습니다.
4. 블록 종료
블록을 종료하는 "}"를 만났으므로 블록 사이({ ~ })에 있는 변수들이 소멸됩니다.
스택 영역에서는 변수가 소멸되었지만, 힙 영역은 가비지 콜렉터가 소거하므로 아직 소멸이 되지 않은 상태입니다.
값 형식(Value Types)과 참조 형식(Reference Types)의 주요 차이점
- 값 유형은 스택 메모리에 저장되고 참조 유형은 힙 메모리에 저장됩니다.
- 구조체, 문자열, 열거형을 제외한 모든 기본 데이터 유형은 값 유형의 Example입니다. Class, string, array, delegate, interface는 참조 유형의 Example입니다.
- 값 유형이 다른 값 유형에 복사되면 실제 값은 복사되지만 참조 유형이 다른 참조 유형에 복사되면 값의 참조 주소는 복사입니다.
- 값 유형은 0 으로 초기화 하고 참조 유형은 NULL 로 초기화 할 수 있습니다 .
'C#' 카테고리의 다른 글
[C#]ref와 out 키워드 (0) | 2021.05.16 |
---|---|
[C#]Call By Value, Call By Reference (0) | 2021.05.16 |
[C#]물음표(?) 사용 (2) | 2021.05.13 |
[C#]Nullable 타입 (3) | 2021.05.13 |
[C#]자동 구현 프로퍼티(Auto Property) (0) | 2021.05.08 |
댓글