게임 개발 일지/내일배움캠프 TIL

(C#) 메모리 관리 / Generic Class

빛하_ 2023. 12. 27. 17:12

메모리

컴퓨터는 메모리에 올라온 데이터들만 처리할 수 있다.

메모리에서 해제된 데이터는 더 이상 유효하지 않다.

 

(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이 발생한다.