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

상병님의 프로필 이미지
상병

작성한 질문수

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해

UObject의 'Outer'가 무엇인지 궁금합니다.

해결된 질문

작성

·

154

0

안녕하세요 교수님,

강의를 듣고 공부 겸 포트폴리오 하나 만드려고 열심히 코딩하고 있습니다만,

NewObejct<>()의 첫번째 인자인 Outer의 개념이 무엇인지 궁금해서 질문합니다.

 

엔진 코드나 공식 문서를 찾아봐도 그냥 이 'Object this object resides in' 정도의 설명만 적어져 있고, 자세한 Outer의 역할이 작성되어 있지 않습니다.

엔진 코드를 자세히 분석해보기는 너무 어렵고,, 그래서 구글링을 해보았더니 Outer는 Outer Chain, 계층 구조를 표시하는데 유용하다고 합니다.

ex) 월드 -> 레벨 -> 액터 -> 컴포넌트. 등

이런 계층 구조를 유지하고 필요할 때 사용하기 위하여 outer를 지정해야 한다는 것 까지는 이해가 갑니다만,

종종 'GC'에도 관여한다는 사람도 있고 아니라는 사람도 있어서 궁금해서 질문을 올립니다.

 

GC는 1. UPROPERTY() 2. FGCObject 상속 후 구현 3. RootSet의 경우에만 GC와 참조 카운트에 영향을 미치는 것이 아닌가요?

 

GC에 관여하지 않는 것이 맞다면, Outer의 목적은 대체 무엇인가요? 단순히 계층 구조의 표현과 필요할 시 사용을 위한 용도인 것인가요?

 

'Owner'같은 경우는 Part3. 강의에서 오너십과 커넥션 관련 판별에서 유용하게 사용되는 것을 알겠지만

Outer는 정확한 목적을 모르겠습니다.

 

답변 2

1

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

언리얼 오브젝트에서 Outer 주석은 언리얼 오브젝트가 거주하는(reside) 언리얼 오브젝트라고 되어 있습니다.
Outer가 없다면 계층구조에 대한 정보 전달이 끊어지기 때문에, 계층구조를 기반으로 동작하는 다양한 개념의 구현이 어려워집니다. 대표적으로 레벨 > 액터 > 컴포넌트 구조가 되겠죠. 아니면 액터 > 액터 계층구조라던지 계층 구조가 필요한 곳에서 다양한 용도로 사용됩니다.
GC자체는 글로벌 1차원 배열로 관리되기 때문에 기본적으로 계층 구조를 담는 Outer와는 크게 관련이 없다고 봅니다. 소스코드를 봐도 Outer는 필요시 부모와 함께 레퍼런스를 설정하는 개념정도로만 구현되어 있는 것 같습니다. 이것도 제한적인 때만이고, 사실 여기까지는 크게 신경쓰지 않아도 될 것 같습니다.

상병님의 프로필 이미지
상병
질문자

감사합니다. 도움이 많이 되었습니다!

0

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

상병님의 질문에 대해, 질문하신 Outer의 개념과 그 역할에 대해서는 구체적으로 언급된 인프런 강의 내용이나 직접적인 답변을 포함하는 링크를 찾을 수 없어 직접적인 해결책을 제시드리기 어려워 보입니다.

그러나, 우리가 다루고 있는 Unreal Engine의 개념 중 하나인 Outer는, 객체가 생성될 때 다른 객체 안에 포함되어 있는 계층 구조를 정의하는 데 사용됩니다. 이 개념은 객체 간의 상호 관계를 명확히 하고, Unreal Engine의 콘텐츠 관리 시스템과 긴밀하게 작동하여, 개발자가 액세스할 수 있는 엔진의 문서나 튜토리얼, 커뮤니티 포럼 등에서 더 자세히 알아볼 수 있습니다.

Outer 객체는 보통 생성되는 객체가 어떤 컨텍스트나 상위 객체 내에서 작동하는지 정의하는 데 사용되며, 예로 드신 계층 구조(월드 -> 레벨 -> 액터 -> 컴포넌트)에서 각각의 요소가 서로를 어떻게 참조하고 있는지를 결정하는데 기여합니다. 또한, 객체의 로딩과 언로딩, 씬의 구성, 시리얼라이제이션과 같은 과정에서도 Outer의 역할이 중요합니다.

GC(Garbage Collection)와의 관련성에 대해서는, Unreal Engine에서는 Outer 개념과 관련된 객체들이 함께 메모리에서 관리되고, 특정 객체가 더 이상 필요하지 않을 경우 GC에 의해 회수될 수 있도록 도움을 줍니다. Outer는 객체 간의 참조 관계를 정의하므로, GC가 객체의 생명 주기를 정확히 판단하는 데 도움을 줄 수 있습니다.

하지만, 명확한 설명과 예시를 위해서는 Unreal Engine의 공식 문서를 참조하거나 구체적으로 Outer 개념을 언급하고 설명하는 자료를 찾아보시는 것을 권장드립니다.

Unreal Engine 공식 문서(Unreal Engine Documentation)는 다양한 기능, 클래스, 그리고 개념에 대한 상세한 설명을 제공하고, Unreal Engine 커뮤니티 포럼(Unreal Engine Forums)에서는 개발자들 사이의 토론을 통해 구체적인 질문에 대한 답변을 얻을 수도 있습니다.

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

상병님의 프로필 이미지
상병
질문자

'GC의 생명주기를 정확히 판단하는데 도움을 준다'의 정확한 내용을 더 알 수 있을까요?

 

제가 생각해보았는데, 예를 들어

UCLASS()

class A : public UObject

{

GENERATED_BODY()

 

public:

UPROPERTY()

TObjectPtr<UObject> B;

}

 

같은 경우가 있다면,

A가 GC에 의해 회수 되는 경우, A의 회수로 인해 B의 참조 카운트가 0이 된다면 '현재 GC 사이클에서 동시에 제거'를 해버리는데 도움을 주는 것인가요?

다시 정리해서 말해보자면,

A가 제거되어 B의 참조 카운트가 0이 되었지만, 이번 GC 사이클에서 둘 다 해제되지 않고 B가 남아있다가 다음 GC 사이클에서 회수를 할 수도 있는데, 이런 것을 방지해주고 'A가 회수 되는 GC 사이클에서 B까지 같이 회수 될 수 있게 도움을 주는' 용도?

 

이런 케이스 인 것일까요?

상병님의 프로필 이미지
상병

작성한 질문수

질문하기