티스토리 뷰
🟩 오늘의 목표
- 메모리 누수와 자원 관리의 중요성을 이해한다.
- 스택(Stack)과 힙(Heap)의 차이를 알고 동적 할당을 올바르게 수행한다.
- 스마트 포인터(unique_ptr, shared_ptr)를 활용해 안전한 코드를 작성한다.
- 언리얼 엔진의 가비지 컬렉션과 리플렉션 시스템을 이해한다.
🟧 1. 메모리 구조 (Stack vs Heap)
🟦 스택 (Stack)
- 함수 내 지역 변수가 저장됨.
- 스코프(})가 끝나면 자동으로 메모리가 회수되어 관리가 편함.
- 공간이 한정적임.
🟦 힙 (Heap)
- 사용자가 new로 할당하고 delete로 해제하는 공간.
- 메모리 크기와 수명을 유연하게 관리 가능.
- 위험 요소:
- Memory Leak (누수): delete를 안 해서 쓰레기 메모리가 쌓임.
- Dangling Pointer: 이미 해제된 주소를 계속 참조함.
🟧 2. 스마트 포인터 (Smart Pointer)
🟦 개념
- 직접 delete 하지 않아도, 스코프를 벗어나면 자동으로 메모리를 해제해 주는 C++ 기능.
🟦 종류와 특징
- unique_ptr (독점): 객체를 오직 하나의 포인터만 소유. 복사 불가, 이동(move)만 가능.
- shared_ptr (공유): 여러 포인터가 객체를 공유. 참조 카운트(Ref Count)가 0이 되면 자동 해제.
- weak_ptr (관찰): shared_ptr의 순환 참조 문제를 막기 위해 사용. 카운트를 올리지 않고 관찰만 함.
🟧 3. 복사의 종류
🟦 얕은 복사 (Shallow Copy)
- 주소값만 복사함. 원본과 사본이 같은 메모리를 가리켜서 위험함(Dangling Pointer 발생 가능).
🟦 깊은 복사 (Deep Copy)
- 실제 데이터를 새로운 메모리에 복사함. 원본과 사본이 완전히 독립적이라 안전함.
🟧 4. 언리얼 엔진의 메모리 관리
🟦 가비지 컬렉션 (Garbage Collection)
- Mark and Sweep: 주기적으로 메모리를 검사하여 사용하지 않는 객체(Mark가 없는 객체)를 자동으로 청소함.
- 개발자가 일일이 delete 할 필요가 없음.
🟦 리플렉션 (Reflection)
- C++ 클래스 정보를 엔진이 알 수 있도록 등록하는 시스템.
- 매크로: UCLASS(), UPROPERTY(), UFUNCTION() 등을 사용해야 GC가 관리할 수 있음.
🟫 오늘 느낀 점
- 메모리 관리의 까다로움과 스마트 포인터의 필요성을 깨닫고, 언리얼 엔진의 자동 관리 시스템이 주는 편리함과 그 기반 기술을 이해했다.