본문 바로가기
C#

C#] 값 형식 VS 참조 형식

by Fastlane 2021. 12. 16.
728x90
반응형

1. 두 가지 저장소 : Stack VS Heap

스택 : 개별 스레드마다 할당된 메모리 영역

힙 : 필요에 의해서 사용요청을 해야하는 저장소. 요청 후, 메모리를 할당받았으면 사용 후, 해제해야 한다. 

      C#의 경우 가비지 collector가 메모리해제를 처리해준다. 

 

2. 값 형식 : sbyte, char, short, ushort, int, uint, long, ulong, float, double, decimal, bool

변수 type 에 따라 무조건 스택영역에 저장소 크기가 할당되고, 값이 저장된다. 

값이 초기화되지 않았으면 숫자형은 0, bool은 false를 기본값으로 갖는다. 

 

3. 참조 형식 : object, string, array, class

값은 힙 영역에 저장하고, 스택에는 힙의 데이터 주소를 저장한다. 

string text;

값이 없으므로 힙에 아무것도 저장되지 않고, 스택에 null이 저장된다. 

 

4. 박싱/언박싱

값 형식 -> 참조 형식 : 박싱

참조 형식 -> 값 형식 : 언박싱

 

int a = 5; 

  => stack에 5 저장

object obj = a; //박싱

  => heap에 5 저장, stack에 주소 저장

int b = (int)obj; //언박싱

  => stack에 주소 복사 

 

박싱할 때, 힙에 메모리를 할당하는 작업이 발생한다. 

 

5. Generics 

박싱, 언박싱에 제네릭이 나오는 이유를 살펴보자. 

 

int n = 5;

ArrayList ar = new ArrayList();

ar.Add(n);

ArrayList.Add(Object) 

Add는 value로 object를 받는다. 따라서, int 5는 박싱되어 힙에 저장되고, 주소를 반환한다. 

박싱을 피하려면, ArrayList.Add(int)로 고정이 되어야 한다. 

 

.NET Framework 2.0에서 ArrayList를 보완한 List<T>가 발표되었다. 

 

int n = 5;

List<int> list = new List<int>();

list.Add(n);

List<T>.Add(T)

 

제네릭의 사용은 value의 박싱/언박싱으로 발생하는 힙 메모리 사용문제를 없애고, 코드 중복 문제고 해결해 준다. 

 

 

 

 

728x90
반응형

댓글