(C#) 메모리 관리 / Generic Class
메모리
컴퓨터는 메모리에 올라온 데이터들만 처리할 수 있다.
메모리에서 해제된 데이터는 더 이상 유효하지 않다.
(1) 코드 영역
실행할 프로그램의 코드.
텍스트 영역이라고도 하는데, 사람이 입력해서 눈으로 보이는 모든 문자와 숫자들을 의미한다.
(2) 데이터 영역
주로 static 과 같은 전역 변수, 정적 변수를 사용해서 메모리에 할당하는 것.
데이터 영역에 올라오면 메모리 어느 곳에서든 자료를 인식하고 처리할 수 있다.
* CS 지식
참조(reference) 형식 : String(캐릭터의 배열), Array, Delegate, 사용자 생성 클래스들
값(value) 형식 : Enum(사용자 열거형), Int32, Double, 사용자 구조체 등등
(3) 힙(Heap)
동적으로 관리된다.
힙 메모리는 참조(reference) 형식이다.
C#에서는 힙 영역의 용량이 크다.
null 로 초기화 되는 자료형을 담는다.
힙 메모리의 단점 ) 데이터를 사용하고 난 뒤에도 해당 데이터가 메모리에 남아있게 된다.
(4) 스택(Stack)
지역변수와 매개변수를 사용한다.
지역변수 (Loacal Variable) : 블록 안에서 선언된 변수들.
매개변수 (Parameter) : 함수에서 사용하기 위해 선언하는 변수들.
스택 메모리는 값(value) 형식이다.
C#에서는 스택 영역의 용량이 작다. (약 1MB 정도)
0으로 초기화 되는 자료형 (ex. public int n 까지만 선언해도 알아서 0으로 초기화)
스택 메모리의 경우 가지고 있는 데이터 (주소값 등)는 사용하면 사라진다.
GC (Garbage Collector)
Heap 메모리에 사용하고 난 잔여 데이터가 계속 쌓이면 메모리는 과부하에 걸린다.
따라서 GC를 이용해 사용하고 남은 데이터를 파괴한다.
Boxing 과 UnBoxing
스택의 데이터를 힙으로 보내거나, 힙의 데이터를 스택으로 보내야하는 경우 (특히 object 변수를 사용할 때)
해당하는 자료형에 맞게 데이터를 가공하는데, 이 때 boxing과 unboxing을 사용한다.
이 작업도 결국 GC를 발생시킨다. (메모리 성능에 좋지 않음)
C#에서 형변환 작업을 할 때
System.Collections.ArrayList 를 사용하면 boxing과 unboxing이 발생하지만
System.Collections.Generic.List<T>는 boxing이 발생하지 않는다. (T는 자료형)
제너릭(Generic) 클래스의 역할 : boxing unboxing이 모두 일어나는 것을 방지. (unboxing만 발생하도록)
메모리 효율을 위해 object 대신 T(자료형)를 사용하자.
Action<T>, GetComponent<T>, Func<T>, Singleton<T> 등등
Debug.Log의 경우도 매개변수 자료형이 object이기 때문에 boxing이 발생한다.