C++의 소멸자(Destructor)와 C#의 Finalizer의 공통점과 차이점
공통점
문법적으로 ~Class() {...} 로 코딩
클래스 객체가 소멸될 때 리소스를 해제하기 위해 사용
차이점
C++ 의 소멸자는 delete myObj; 와 같이 명시적으로 호출 시기를 정할 수 있음.
C# 의 소멸자는 C++와 구분하기 위해 Destructor대신 Finalizer로 부름. Finalizer는 개발자가 그 호출을 명시적으로 결정할 수 없고, Garbage Collection 메커니즘에서 호출.
좀 더 구체적으로, C# 클래스에 Finalizer 가 존재하면, 해당 객체의 생성자 호출시 Finalization Queue라는 QC 내부 큐에 레퍼런스 추가. 이후, Managed Heap이 차서 GC처리를 할 때 아래를 따름.
- Finalization Queue 에 레퍼런스가 없는 객체는 Garbage로 판단, 삭제 처리.
- Finalization Queue 에 레퍼런스가 있는 객체는 Freachable Queue라는 다른 큐로 이동.
- GC의 Finalization Thread가 Freachable Queue의 객체들을 꺼내 Finalizer 호출.
- Finalizer 가 호출된 객체들은 다음 GC 시기에 삭제 처리.
즉,C# 클래스에 Finalizer 를 추가하면, GC 가 두 번 동작해야 최종적으로 삭제되기 때문에 메모리에 좀 더 오래 머물게 되고, 내부 Queue를 참조해야 하는 등 오버헤드도 발생함.
그래서, 클래스가 직접 리소스를 로드/언로드 하는 경우, Finalizer 대신 Dispose 패턴을 추가해 명시적으로 해제를 호출할 수 있음. Finalizer도 존재할 경우 아래 API를 호출해서 GC가 객체를 Freachable Queue 로 이동시키기 않고 즉시 삭제하게 할 수 있음.
void Dispose()
{
//clean your resources
...
//let GC know about it
GC.SuppressFinalize(this);
}
.NET, C#, CLR, GARBAGECOLLECTION
What do you know about Freachable queue?
https://nabacg.wordpress.com/2012/03/11/what-do-you-know-about-freachable-queue/
Freachable Queue
F-reachable 로 발음한다.
가비지 컬렉션의 최종화 부분에서 사용되는 CLR 가비지 컬렉터 내부 구조 중 하나.
참고 문서
MSDN Magazine
PART I
Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework
PART II
Garbage Collection Part 2: Automatic Memory Management in the Microsoft .NET Framework
게임 개발에 필수적인 내용을 담는 명서들을 소개합니다.
<유니티 교과서 개정6판>(유니티 최신 버전) 구입 링크
https://link.coupang.com/a/be3P0t
<리얼-타임 렌더링(REAL-TIME RENDERING) 4/e> 구입 링크
https://link.coupang.com/a/8VWas
<이득우의 게임 수학:39가지 예제로 배운다! 메타버스를 구성하는 게임 수학의 모든 것> 구입 링크
https://link.coupang.com/a/9BqLd
유니티 에셋 스토어 링크
https://assetstore.unity.com?aid=1011lvz7h
(링크를 통해 도서/에셋 구입시 일정액의 수수료를 지급받습니다.)
'유니티 엔진 (Unity Engine)' 카테고리의 다른 글
[Unity] Shader Keyword 셰이더 키워드로 동작 조건부 작성 (0) | 2023.12.20 |
---|---|
[Unity] Editor SceneView 에서 카메라 조작하기 (fov, position, rotation) (0) | 2023.12.07 |
[Unity] Addressable.LoadAssetAsync() 동기/비동기 처리 (0) | 2023.12.04 |
[Unity] Flags Attribute (0) | 2023.11.30 |
[Unity] ScriptableObject의 CustomEditor가 있을 때 저장이 안 되는 문제 (0) | 2023.11.22 |
[Unity] 드로우 콜 최적화 (Optimize DrawCall) 요약 정리 (0) | 2023.11.16 |
[Unity] Unity Engine 버전업 후 에러 메시지 Error : "The type or namespace name 'Newtonsoft' could not be found" (0) | 2023.11.16 |