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

용우 유님의 프로필 이미지

작성한 질문수

이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해

7강 액터 리플리케이션 로우레벨 플로우

구조체의 operator()를 사용하는 이유가 뭘까요?

해결된 질문

23.12.04 18:59 작성

·

277

0

액터 우선순위 정렬과정에서 Sort의 매개변수로 FCompoareFActorPriority를 생성해서 넘겨주고 있고, 이 구조체가 operator()를 구현해서 소팅을 진행하는 것 같은데요.

 

기능적으로 그냥 전역함수를 선언하거나, 아니면 static 함수를 선언하고 함수 포인터를 넘겨주는 것과 차이가 없는 것 같은데 혹시 언리얼 엔진에서 굳이 이렇게 하는 이유가 있을까요? 사소한 거긴 한데, 이런 패턴이 꽤나 자주 보여서 여쭤봅니다..!

답변 1

0

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

2023. 12. 04. 19:08

구조체 데이터 소팅을 위해, 구조체를 선언하고 별도로 이를 비교하는 전역함수를 선언하는것이 더 편리하다는 의미일까요?

용우 유님의 프로필 이미지
용우 유
질문자

2023. 12. 04. 22:06

앗 아뇨! 엔진에서는 아래 코드블럭처럼 정렬기준을 서술한 구조체를 선언하고, 사용하더라고요

// Header
struct FCompareFActorPriority
{
	FORCEINLINE bool operator()( const FActorPriority& A, const FActorPriority& B ) const
	{
		return B.Priority < A.Priority;
	}
};


// Usage
// Sort by priority
Sort( OutPriorityActors, FinalSortedCount, FCompareFActorPriority() );

그런데 모던 c++에서는 predicate를 매개변수로 받는다면 보통 람다나 정적 함수, 전역 함수 같은 것들을 넘겨서 정렬하는 경우가 많다보니까 언리얼 엔진이 이렇게 구현한 이유가 따로 있는 걸까? 싶어서 여쭤봤습니다!

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

2023. 12. 04. 23:57

아 이것을 C++에서는 functor라고 보통 표현하는데 몇 가지 장점이 있습니다.

  • 오브젝트라서 상태관리가 가능하고 확장이 용이하다

  • 안정적이고 빠르다. 컴파일러가 해석하기 명확하고 편하다.

언리얼 엔진 소스코드를 보면 새로운 문법에 꽤나 보수적입니다. 지금 C++은 많이 안정화됐지만 예전에는 새로운 구문이 항상 잘동작했던 건 아니거든요. 게임 특성상 오래되고 다양한 플랫폼 지원도 필요하지요.