C#

[C#]값 형식(Value Types)과 참조 형식(Reference Types)

DevStory 2021. 5. 15.

값 형식(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)의 주요 차이점

  1. 값 유형은 스택 메모리에 저장되고 참조 유형은 힙 메모리에 저장됩니다.
  2. 구조체, 문자열, 열거형을 제외한 모든 기본 데이터 유형은 값 유형의 Example입니다. Class, string, array, delegate, interface는 참조 유형의 Example입니다.
  3. 값 유형이 다른 값 유형에 복사되면 실제 값은 복사되지만 참조 유형이 다른 참조 유형에 복사되면 값의 참조 주소는 복사입니다.
  4. 값 유형은 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

댓글