DevDino

[Unity 기술면접] C# vs C++ 메모리 관리 본문

Unity/기술면접

[Unity 기술면접] C# vs C++ 메모리 관리

데브다이노 2025. 12. 29. 19:57

 

"C#과 C++의 메모리 관리 차이점은 무엇인가요?"

C# vs C++ 메모리 관리

게임 클라이언트 개발자 면접에서 단골로 등장하는 질문 중 하나인 "C#과 C++의 메모리 관리 방식의 차이"입니다.

두 언어는 메모리를 다루는 철학이 완전히 다르기 때문에, 이 차이를 명확히 이해하고 게임 성능 최적화에 어떻게 적용할지 고민하는 것이 중요합니다.

 

C#: 자동 메모리 관리 (Garbage Collector 기반)

C#은 개발자의 편의성과 안전성에 초점을 맞춘 언어로, CLR(공용 언어 런타임) 환경 위에서 메모리를 자동으로 관리합니다.

 

동작 방식

개발자가 객체를 new로 할당하면, 이후 참조되지 않는 객체는 가비지 컬렉터(GC, Garbage Collector)가 주기적으로 탐지하여 메모리에서 해제합니다.

 

장점(안전성과 생산성)
- 개발자가 메모리 해제 코드를 직접 작성할 필요가 없어 구현에 집중해 생산성이 높습니다.
- 메모리 누수나 이미 해제된 메모리에 접근하는 이중 해제같은 치명적인 버그의 위험이 크게 줄어듭니다.

 

단점(성능 예측의 어려움)
- GC 스파이크: GC가 실행될 때 메모리를 정리하기 위해 시스템을 잠시 멈추는 STW(Stop-The-World) 현상이 발생할 수 있습니다.
- 실행 타이밍을 개발자가 정확히 예측하거나 제어하기 어려워, 초당 60프레임을 유지해야 하는 실시간 세임 환경에서는 프레임 드랍의 원인이 되기도 합니다.

 

C++: 수동 메모리 관리 (개발자 주도형)

C++은 하드웨어와 가까운 언어로, 개발자에게 메모리에 대한 완전한 제어권을 부여합니다.


동작 방식
new/delete 또는 malloc/free 키워드를 통해 개발자가 직접 필요한 만큼 힙 메모리를 할당하고 해제해야 합니다. (스택에 할당한 객체는 스코프를 벗어나면 자동으로 소멸됩니다.)

 

장점(극대화된 성능)
- 메모리 할당과 해제 시점을 100% 통제할 수 있으므로, 오버헤드 없이 예측 가능하고 일관된 고성능을 낼 수 있습니다.

 

단점(높은 난이도와 위험성)
- 메모리 관리를 온전히 개발자가 책임져야 합니다. 해제를 깜빡하면 메모리 누수가 발생하고, 잘못된 참조를 하면 프로그램이 즉시 크래시(Crash)를 일으킵니다.
- 최근 모던 C++에서는 이러한 실수를 방지하기 위해, 객체의 수명과 메모리 해제를 묶어 관리하는 RAII(Resource Acquisition Is Initialization) 패턴과 스마트 포인터(Smart Pointers: std::unique_ptr, std::shared_ptr)를 적극적으로 사용하여 소유권을 관리합니다.

 

 

Unity는 C#을 사용하므로 GC로 인한 성능 저하를 피하는 것이 핵심 최적화 기법입니다. 따라서 게임 내에서 반복적으로 생성되고 파괴되는 투사체, 몬스터, 혹은 빈번하게 갱신되는 UI 텍스트 요소들은 매번 새로 생성하기보다 오브젝트 풀링(Object Pooling)을 통해 재사용하여 GC의 개입을 최소화하는 설계가 필수적입니다.

 

요약
C#은 메모리를 알아서 청소해 주어 개발이 편하고 안전하지만, 청소부가 일할 때 생기는 렉(GC 비용)을 조심해야 합니다.
C++은 성능이 뛰어나지만, 개발자가 직접 메모리를 철저하게 관리하고 책임져야 합니다.