인프런 커뮤니티 질문&답변

Jay Jae님의 프로필 이미지
Jay Jae

작성한 질문수

이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해

TObjectPtr과 강참조에 관한 질문입니다

해결된 질문

작성

·

120

0

8강 아이템 시스템 마지막에 강참조된 아이템들을 약참조로 바꾸는 부분을 공부하다가 질문드립니다

 

인터넷에서 강참조와 약참조에 대해 좀 더 자세히 공부하다보니

강참조 = TStrongObjectPtr / 약참조 = TSoftObjectPtr 를 사용하며,

TObjectPtr과 강참조가 관련된 정보는 없길래 TObjectPtr에 대해 궁금증이 생겼습니다

 

TObjectPtr에 대해 검색해본 바로는

TObjectPtr은 기존에 사용하던 원시 포인터를 대체하는 포인터를 이용한 단순한 참조에 불과하며, 그러므로 댕글링 포인터 문제 또한 발생할 수 있다.

보통 강참조라고 하는 것은, 객체의 소유권을 가지고 Ref Count를 올리는 역할을 수행해야 하는데, TObjectPtr은 단순히 객체를 참조하는 역할만 하므로 강참조라고 볼 수는 없다

라고 나와 있던데

 

강의에서 TObjectPtr이 강참조라고 하셨던 것은 어떤 의미인지 궁금합니다

 

그리고 만약에 TObjectPtr이 강참조가 아니라면, 이는 어떠한 정도의 참조인건지요...? 중참조? 이런 단어는 없는거같던데..

TObjectPtr은 TStrongObjectPtr(강참조) 와 TSoftObjectPtr(약참조) 사이의 어딘가에 있는 애매한 정도의 참조인것인지요??

 

 

추가질문)

약참조를 공부하는데 약참조에도 또 TSoftObjectPtr과 TWeakObjectPtr의 2가지가 존재하더라구요...

 

TSoftObjectPtr

리소스의 주소는 갖고 있되, 로딩은 시켜놓지 않는 경우에 사용

아직 현재 월드에 인스턴스화되지 않은 객체를 참조할 때 사용

TSoftObjectPtr은 FSoftObjectPath를 감싸는 TWeakObjectPtr이다

 

TWeakObjectPtr

Ref Count를 증가시키지 않아야 하는 경우 / 소유권이 없지만 참조는 필요한 경우에 사용

참조하고 있는 오브젝트가 GC에 넘어간 경우, nullptr로 바뀌며 validation 체크를 가능하게 함

 

이렇게 알고있는데 제가 학습한 내용이 맞는건지요??

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

사전적으로 요약하면 강참조는 메모리에서 반드시 살아있어야 하는 참조, 약참조는 없어도 괜찮은 참조라고 정리할 수 있습니다.

실 사용 예를 들면 공유 포인터(shared pointer)와 같이 레퍼런스를 기반으로 움직이는 참조를 강참조라고도 하고, 약 포인터(weak pointer)를 약참조로 부릅니다.
언리얼 오브젝트의 UPROPERTY 매크로가 지정된 포인터는 공유포인터 방식으로 메모리를 관리합니다. 그렇기에 강참조라고 지칭했습니다.

TStrongObjectPtr은 UPROPERTY 매크로를 사용하지 못하는 특수한 경우에 사용되는 클래스입니다. 사실상 둘은 같은 방식으로 동작하는 강참조라고 생각하면 됩니다.
TStrongObjectPtr은 주로 에디터 개발에서 많이 사용되는데, 게임 로직을 개발하는 과정에서 TStrongObjectPtr를 쓸 일은 거의 없지 않을까 생각합니다.
강의에서도 설명드렸지만 TSoftObjectPtr 과 TWeakObjectPtr의 메커니즘은 동일합니다. 잘 이해하신것 같습니다.

Jay Jae님의 프로필 이미지
Jay Jae
질문자

너무 감사드립니다 강사님!! 정말 명확하게 이해가 갔습니다ㅠㅠ 강참조와 약참조가 비슷한게 많아서 참 많이 헷갈렸는데 오늘 강사님 가르침 덕분에 머리 속 안개가 한층 걷어진 느낌이네요! 정말 덕분에 많은 것을 배우고 늘 감사하고 있습니다 명쾌한 해설 너무 감사드립니다...

0

안녕하세요, 인프런 AI 인턴입니다. Jay Jae님.

TObjectPtr에 대한 설명

TObjectPtr는 언리얼 엔진 5에서 도입된 새로운 포인터 타입으로, UObject 포인터를 안전하게 관리하기 위해 사용됩니다. 기존의 원시 포인터(UObject*)와 달리, TObjectPtr은 포인터가 유효한지(댕글링 포인터가 아닌지)를 더 쉽게 확인할 수 있도록 설계되었습니다. 하지만 언리얼의 가비지 컬렉터에 의해 관리되는 방식에서는 큰 차이가 없습니다.

TObjectPtr는 자체적으로 참조 카운팅을 하지 않기 때문에, 강참조(Strong Reference)로 간주되지 않으며, 이는 기존 원시 포인터와 비슷하게 단순히 객체를 참조하는 역할을 합니다. 그러나, 이를 통해 가비지 컬렉터가 해당 포인터를 추적하는 데 도움을 주는 역할은 합니다.

TSoftObjectPtr와 TWeakObjectPtr의 차이점

  • TSoftObjectPtr: 이 포인터는 리소스의 경로 정보를 저장하고, 실제 객체는 로드되지 않은 상태에서도 포인터를 유지합니다. 경로 정보를 사용하여 필요할 때 객체를 로드할 수 있습니다.

    관련된 상세 내용은 아래 링크를 참조하세요:

  • TWeakObjectPtr: 이 포인터는 객체의 소유권을 가지지 않으며, 참조하고 있는 UObject가 가비지 컬렉션에 의해 삭제되는 경우, 해당 포인터는 nullptr로 설정됩니다. 따라서 객체가 유효한지 체크할 때 유용합니다.

    관련된 유사한 설명은 아래 링크를 참조하세요:

종합 설명

결론적으로, TObjectPtr는 강참조와 관련이 없으며, 단순히 포인터의 유효성을 좀 더 명확하게 관리하기 위한 도구입니다. 강참조와 약참조 사이의 ‘중간 참조’처럼 애매한 개념은 아니며, 강의에서 이 부분이 혼란스러웠다면 객체 관리 방식에 따라 다르게 사용하시는 것이 중요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Jay Jae님의 프로필 이미지
Jay Jae

작성한 질문수

질문하기