개발자 면접 공부/언리얼 엔진

언리얼 엔진의 스마트 포인터

chogyujin 2025. 11. 28. 18:45
728x90

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)이 삭제되면 자동으로