티스토리 뷰
🟩 오늘의 목표
- 언리얼의 가비지 컬렉션(GC)과 일반 C++의 자원 관리 방식의 차이를 이해한다.
- UObject 전용 포인터와 일반 C++ 객체용 포인터를 상황에 맞게 선택하는 능력을 기른다.
- RAII 패턴이 실제 메모리 관리에서 어떻게 안전장치 역할을 하는지 파악한다.
🟧 1. 두 종류의 관리 시스템 : 급식실 vs 도시락
컴퓨터 메모리 관리를 이해하기 위해 두 가지 상황을 가정해 보자.
🟦 UObject 관리 (급식실)
- UObject는 학교 급식실과 같다. 다 먹은 식판을 테이블 위에 두고 가면, 청소부(가비지 컬렉터, GC)가 돌아다니며 아무도 앉아 있지 않은 테이블의 식판을 수거한다.
- 내가 직접 식판을 버리겠다고 delete를 호출하면 청소부의 업무 루틴과 충돌하여 문제가 발생한다. 따라서 메모리 소유권을 직접 다루지 않는다.
🟦 비-UObject 관리 (도시락)
- 일반 C++ 객체는 내가 직접 챙겨온 도시락통과 같다. 다 먹었으면 내가 직접 가방에 넣어서 챙겨 나가야 한다.
- 이때 도시락통을 잊어버리고 그냥 나가면 메모리 누수(Leak)가 발생한다. 이를 자동으로 챙겨주게 만든 도구가 바로 스마트 포인터다.
🟧 2. UObject 전용 스마트 포인터
언리얼 엔진이 제공하는 UObject 관리용 도구들이다.
🟦 TObjectPtr<T> : 꽉 잡고 있는 손
- 의미: 엔진에게 "이 물건은 내가 지금 쓰고 있으니 절대 치우지 마!"라고 강하게 말하는 포인터다.
- 특징: 멤버 변수로 쓸 때는 UPROPERTY()를 반드시 붙여야 청소부(GC)가 내 손을 인지할 수 있다.
- 용도: 컴포넌트나 에셋을 내 클래스의 핵심 부품으로 들고 있을 때 사용한다.
🟦 TWeakObjectPtr<T> : 그냥 지켜보기
- 의미: "저기 물건이 있는 건 아는데, 청소부가 치우고 싶으면 치워도 돼"라고 하는 약한 참조다.
- 특징: 대상이 치워지면 내 손가락은 자동으로 허공(null)을 가리키게 된다. 사용 전 항상 유효한지(IsValid) 확인해야 한다.
- 용도: 적이 나를 타겟팅할 때처럼, 언제든 사라질 수 있는 대상을 참조할 때 쓴다.
🟦 TSoftObjectPtr<T> : 지도상의 보물 표시
- 의미: "지금 당장 물건이 필요한 건 아니지만, 어디 있는지는 알아"라고 하는 경로 참조다.
- 특징: 에셋이 메모리에 없어도 경로만 들고 있다가, 정말 필요할 때(LoadSynchronous)만 가져온다.
- 용도: 초기 로딩 시간을 줄이기 위해 나중에 불러올 무거운 텍스처나 메시에 사용한다.
🟧 3. 일반 C++ 객체용 스마트 포인터
언리얼에서 UObject가 아닌 일반 객체를 관리할 때 쓰는 도구들이다.
🟦 TUniquePtr<T> : 나만 가질 거야
- 의미: 이 도시락통의 주인은 오직 나 하나뿐이다. 내가 죽으면 도시락통도 같이 사라진다.
- 특징: 복사가 안 되고 소유권을 넘겨주는 것만 가능하다. RAII 패턴의 가장 교과서적인 모습이다.
🟦 TSharedPtr<T> & TSharedRef<T> : 우리 같이 쓰자
- 의미: 여러 명이 같이 도시락을 공유한다. 마지막으로 도시락을 들고 있던 사람이 방을 나갈 때 도시락을 치운다.
- 특징: 참조 카운팅 방식을 사용하여 관리를 자동화한다.
🟧 4. RAII와 자원 관리의 핵심
🟦 RAII란 무엇인가?
- "자원 획득은 초기화다"라는 뜻으로, 객체가 태어날 때 자원을 잡고 죽을 때 자동으로 놓아주는 기법이다.
- 사람이 일일이 "이제 지워야지"라고 기억하는 대신, 코드의 범위(스코프)가 끝나면 알아서 정리되게 하여 실수를 방지한다.
🟦 주의사항 : 시스템을 섞지 마라
- UObject의 메모리 관리 책임을 TSharedPtr나 TUniquePtr에게 맡기면 안 된다.
- 급식실 식판을 내 개인 도시락 가방에 넣어 가려 하면 학교 규칙(엔진 수명 모델)과 충돌하여 큰 오류가 발생하기 때문이다.
🟧 핵심 요약표
| 분류 | 타입 | 소유권/수명 영향 | 대표 용도 |
| UObject(강한 참조) | TObjectPtr<T> | 강하게 유지 (GC 방지) | 멤버 변수로 보관할 때 |
| UObject(약한 참조) | TWeakObjectPtr<T> | 수명에 영향 없음 (자동 null화) | 타겟 액터 등 참조만 할 때 |
| UObject(지연 로딩) | TSoftObjectPtr<T> | 경로만 참조 (필요 시 로드) | 대용량 에셋 관리 |
| 비-UObject(단독) | TUniquePtr<T> | 단독 소유 (RAII 기반 자동 해제) | 한 곳에서만 관리하는 힙 객체 |
| 비-UObject(공유) | TSharedPtr<T> | 여러 명이 공유 (참조 카운팅) | UI나 툴 제작 시 공유 데이터 |
'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글
| TIL - 43일차 (1) | 2026.01.28 |
|---|---|
| TIL - 42일차 (0) | 2026.01.27 |
| TIL - 40일차 (0) | 2026.01.23 |
| TIL - 39일차 (0) | 2026.01.22 |
| TIL - 38일차 (1) | 2026.01.21 |

