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의 박싱/언박싱으로 발생하는 힙 메모리 사용문제를 없애고, 코드 중복 문제고 해결해 준다.
'C#' 카테고리의 다른 글
C#] Value type은 어디에 저장되는가? Stack or Heap?? (0) | 2021.12.24 |
---|---|
C#] 제네릭 제약조건 : where, default 연산자 (0) | 2021.12.16 |
IEnumerable vs ICollection vs IList 차이점 (0) | 2021.12.02 |
C#] LINQ 쿼리 키워드 let (0) | 2021.11.05 |
C#] Lambda (0) | 2021.11.05 |
댓글