1. 개요
오늘은 언리얼 엔진의 스마트 포인터를 알아보겠습니다.
2. 스마트 포인터?
보통 스마트 포인터 라고 하면 C++이 명시적으로 할당받은 메모리를 해제하기 위해 사용자가 Delete를 해줘야하지만 만약 놓치게 되면, 메모리 누수라는 큰 결함이 생깁니다.
그래서 C++에서 스마트 포인터가 나왔고, 스코프 종료가 되면 자동으로 해제하는 친구입니다.
https://chogyujin-study.tistory.com/27
C++ 스마트 포인터(Unique, Shared, Weak)
오늘은 스마트 포인터에 대해 공부해보겠습니다. 스마트 포인터 란? 자바, C# 등은 가비지 컬렉터(Garbage Collector) 라는 기능을 통해 메모리를 관리합니다. 하지만 C++는 사용자가 스스로 메모리를
chogyujin-study.tistory.com
그럼 C++에 스마트포인터가 있지만, 언리얼에도 스마트 포인터가 있습니다. 한번 확인해보죠
3. 언리얼 스마트 포인터?
근데 생각해보니깐 언리얼은 GC가 있는데 스마트 포인터가 왜 필요할까요?
GC는 UObject 상속받는 클래스 즉 프로퍼티가 되는 애들만 관리가 됩니다.
그럼 언리얼에 F로 시작되는 구조체 및 일반 클래스들은? 관리 대상이 안됩니다.
아무리 UPRPERTY() UCLASS(어차피 UObject 상속 받긴해야지만)
그렇기 위해 언리얼 스마트 포인터를 사용합니다.
4. 언리얼 스마트 포인터 종류
언리얼의 스마트 포인터 종류는 다음과 같습니다.
그룹 UObject 관리용
TObjectPtr<T>, TWeakObjectPtr<T>
그룹 일반 C++ 관리용
TSharedPtr<T>, TSharedRef<T>, TUniquePtr<T>
다음과 같이 있습니다.
하나씩 알아보겠습니다.
5. TObjectPtr<T>
언리얼 엔진 5 부터 도입된 새로운 포인터 래퍼입니다.
아래는 요약입니다.
| 특징 | TObjectPtr<T> (UE5) |
| 주요 용도 | 저장용 (멤버 변수) |
| 에디터 동작 | 지연 로딩 (Lazy Load) 지원 |
| 배포(Shipping) | 생 포인터로 자동 변환 (성능 저하 없음) |
| 권장 위치 | 헤더 파일 (.h) |
6. TWeakObjectPtr<T>
약한 참조 포인터입니다. GC를 방해하지 않고 안전하게 참조하는 포인터입니다.
| 특징 | TWeakObjectPtr |
| 주요 용도 | 안전한 참조 (UI, 타겟팅, 캐싱 등 주인이 아닌 경우) |
| 동작 원리 | 객체 ID 기반 유효성 검사 (IsValid 필수), GC 방해 안 함 |
| 배포(Shipping) | 로직 유지 (일반 포인터로 변환되지 않고 안전성 유지) |
| 권장 위치 | 헤더 파일 (.h)**의 멤버 변수 |
7. TSharedPtr<T>
UObject가 아닌 일반 C++클래스의 메모리를 관리하는 표준 스마트 포인터(std::shared_ptr가 비슷)
| 특징 | TSharedPtr |
| 주요 용도 | 일반 C++ 데이터 공유 (여러 곳에서 참조하는 매니저, 데이터 구조체) |
| 동작 원리 | 레퍼런스 카운팅 (참조하는 곳이 0이 되면 메모리 자동 삭제) |
| UObject 사용 | 절대 불가 ❌ (GC와 충돌하여 크래시 발생, UObject는 TObjectPtr 사용 |
| 특징 | Null 허용 (비어있을 수 있음), 스레드 안전 모드 지원 |
8. TSharedRef<T>
TSharedPtr 와 작동 방식은 같지만, " 절대 비어있지 않음(Null 불가)"을 보장하는 스마트 레퍼런스입니다.
| 특징 | TSharedRef |
| 주요 용도 | UI 위젯 생성 (Slate/UMG), 반드시 존재해야 하는 데이터 전달 |
| 동작 원리 | 참조 카운팅 + Null 불가 보장 (생성 시 반드시 초기화해야 함) |
| UObject 사용 | 절대 불가 ❌ (GC와 충돌, 일반 C++ 클래스 전용) |
| 특징 | Null 체크 불필요 (코드가 간결하고 안전함), TSharedPtr로 암시적 변환 가능 |
8. TUniquePtr<T>
오직 단 하나의 소유자만 허용하는 가장 가볍고 빠른 스마트 포인터입니다. (std::unique_ptr와 동일)
| 특징 | TUniquePtr |
| 주요 용도 | 독점 소유 (나만 쓰는 내부 데이터), 성능이 중요한 로직 |
| 동작 원리 | 복사 불가 ❌ (이동(Move)만 가능), 스코프가 끝나면 메모리 즉시 삭제 |
| UObject 사용 | 절대 불가 ❌ (일반 C++ 클래스 전용) |
| 특징 | 가장 빠름 (참조 카운팅 오버헤드가 없음 = 생 포인터와 성능 동일) |
9. 전체 요약
1. 대상이 UObject 인가? (Actor, Component, Widget 등)
관리자: 가지비 컬렉터(GC)
| 포인터 이름 | Null 허용 | 주요 용도 및 위치 | 핵심 특징 (요약) |
| TObjectPtr<T> (UE5 표준) |
✅ | 헤더 파일 (.h) 멤버 변수 저장용 |
• UE5 저장용 표준. • 에디터에선 지연 로딩(최적화), 배포 시엔 생 포인터로 변환. |
| TWeakObjectPtr<T> | ✅ | 헤더 파일 (.h) 외부 객체 참조용 |
• 안전한 관찰자. • 대상이 Destroy() 되면 자동으로 무효화됨 (IsValid 필수). |
2. 대상이 일반 C++ 인가? (FStruct, SWidget, 커스텀 클래스)
관리자: 언리얼 스마트 포인터 라이브러리 (참조 카운팅)
| 포인터 이름 | Null 허용 | 주요 용도 및 위치 | 핵심 특징 (요약) |
| TSharedPtr<T> (공유 포인터) |
✅ | 데이터 공유 일반적인 매니저/데이터 |
• 공동 소유. • 참조하는 곳이 0이 되면 메모리 자동 삭제. |
| TSharedRef<T> (공유 레퍼런스) |
❌ | UI 생성 (Slate/UMG) 필수 데이터 전달 |
• 필수 소유 (강추). • 절대 Null이 아님을 보장 (체크 불필요, 안전함). |
| TUniquePtr<T> (고유 포인터) |
✅ | 독점 소유 내부 데이터 관리 |
• 단독 소유. • 복사 불가(이동만 가능), 가장 빠름. |
| TWeakPtr<T> (약한 포인터) |
✅ | 순환 참조 방지 캐싱, 관찰 |
• 수명 관여 안 함. • 원본(SharedPtr)이 삭제되면 자동으로 |
'개발자 면접 공부 > 언리얼 엔진' 카테고리의 다른 글
| 언리얼 UAT, UBT, UHT, UnrealPak 이해 (0) | 2025.12.05 |
|---|---|
| 언리얼 엔진 (FString, FText, FName) 비교 (1) | 2025.12.02 |
| 언리얼 엔진 Actor, Pawn, Character 차이 (0) | 2025.11.26 |
| 언리얼 엔진 액터의 생명주기(액터 스폰) (1) | 2024.03.21 |
| 언리얼 엔진 액터의 생명주기(에디터에서 플레이) (0) | 2024.03.20 |