[UE5] TIL - 15 <코딩표준>

ChangJin·2024년 4월 2일
0

Unreal Engine5

목록 보기
42/114
post-thumbnail

2024-04-02 (이전에 안올렸던거 채우기!)

깃허브!
https://github.com/ChangJin-Lee/ARproject
https://github.com/ChangJin-Lee/ToonTank

느낀점
언리얼 코딩표준에 대해서 조사해보았다. 접두사가 매우 신기했고 네임스페이스를 두 번 이상 사용하는 것도 신기했다. 언리얼의 코딩 표준에 대해 알 수 있는 시간이었다. 생각보다 양이 많은데 매일 읽어보면서 정리해나가야겠다.

TIL

  • 코딩표준

코딩표준

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/epic-cplusplus-coding-standard-for-unreal-engine?application_version=5.3


  • 명명 규칙에 대해서 궁금했었는데 이번 기회에 정리해보았다. 접두사들이 왜 붙는지 U,F,T 등 각각 무엇을 의미하는지 알 수 있었다.

명명 규칙

명명 규칙을 사용할 때, 모든 코드 및 코멘트는 미국 영어의 철자법 및 문법을 사용해야 합니다.

  • 각 단어의 첫 번째 글자(타입 이름 또는 변수 이름)는 대문자여야 합니다. 일반적으로 단어 사이에는 언더스코어를 사용하지 않습니다. 예를 들어, Health 및 UPrimitiveComponent 는 올바르지만, lastMouseCoordinates 또는 delta_coordinates 는 올바르지 않습니다.

이는 다른 오브젝트 지향 프로그래밍 언어에 익숙한 사용자를 위한 PascalCase 포맷입니다.

  • 타입 이름에는 추가적으로 대문자로 이루어진 접두사를 포함하여 변수 이름과 구분합니다. 예를 들어 FSkin 은 타입 이름이고, Skin 은 FSkin 타입의 인스턴스입니다.

  • 템플릿 클래스에는 접두사 T를 포함합니다.

	class TAttribute
  • UObject에서 상속하는 클래스에는 접두사 U를 포함합니다.
	class UActorComponent
  • AActor에서 상속하는 클래스에는 접두사 A를 포함합니다.
	class AActor
  • SWidget에서 상속하는 클래스에는 접두사 S를 포함합니다.
	class SCompoundWidget
  • 추상적 인터페이스인 클래스에는 접두사 I를 포함합니다.
	class IAnalyticsProvider
  • 에픽의 콘셉트가 유사한 클래스 타입에는 접두사 C를 포함합니다.
	template <typename Concept, typename... Ts>
  • 열거형에는 접두사 E를 포함합니다.
	enum class EColorBits
	{
	   ECB_Red,
	   ECB_Green,
	   ECB_Blue
	};
  • 부울 변수에는 접두사 b를 포함합니다.
	bPendingDestruction

	bHasFadedIn.
  • 그 외 대부분의 클래스는 접두사 F를 포함합니다. 그러나 일부 서브시스템은 다른 글자를 사용하기도 합니다.

  • Typedef의 경우 다음과 같이 해당 타입에 적합한 접두사를 사용합니다.

    	- 구조체의 typedef인 경우 F
    	- UObject 의 typedef인 경우 U
  • 특정 템플릿 인스턴스화의 typedef는 더 이상 템플릿이 아니며, 알맞은 접두사를 붙여야 합니다.

typedef TArray<FMytype> FArrayOfMyTypes;
  • C#에서는 접두사가 생략됩니다.

  • 언리얼 헤더 툴의 경우 대부분 올바른 접두사가 필요하므로, 접두사를 제공하는 것이 중요합니다.

  • 이러한 템플릿 파라미터를 기반으로 하는 타입 템플릿 파라미터 및 중첩된 타입 에일리어스는 타입 카테고리를 알 수 없으므로 상기 접두사 규칙의 대상이 아닙니다.

  • 설명적인 용어 뒤에는 Type 접미사를 사용하는 것이 좋습니다.

  • In 접두사를 사용하여 다음과 같이 템플릿 파라미터를 에일리어스와 구분합니다.

	template <typename InElementType>
				class TContainer
				{
				public:
					using ElementType = InElementType;
				};
  • 타입 및 변수 이름은 명사입니다.

  • 메서드 이름은 메서드의 이펙트를 설명하거나, 이펙트가 없는 메서드의 반환 값을 설명하는 동사입니다.

  • 매크로 이름은 모두 대문자로 구성되고, 단어가 언더스코어로 분리되며, 접두사 UE_ 가 사용되어야 합니다.

	#define UE_AUDIT_SPRITER_IMPORT

변수, 메서드, 클래스 이름은 다음과 같아야 합니다.

  • 명확함

  • 확실함

  • 내용을 파악할 수 있음

이름의 범위가 넓을수록 올바르고 내용을 파악할 수 있는 이름을 사용해야 합니다. 과도한 약어는 피합니다.

각 변수의 의미에 대해 코멘트를 제공할 수 있도록 모든 변수는 자체적인 줄에서 선언해야 합니다.

이는 JavaDocs 스타일에 필요한 부분입니다.

변수 앞에 여러 줄 또는 한 줄의 코멘트를 사용할 수 있으며, 변수 그룹화를 위한 빈 줄은 선택사항입니다.

부울을 반환하는 모든 함수는 IsVisible() 또는 ShouldClearBuffer() 등의 true/false 질문을 해야 합니다.

프로시저(반환 값이 없는 함수)는 강한 동사 뒤에 오브젝트를 붙여 써야 합니다. 메서드의 오브젝트가 그 안에 있는 오브젝트일 때는 예외이며, 이 경우 오브젝트는 컨텍스트에서 이해됩니다. 'Handle' 및 'Process' 등의 모호한 동사로 시작하는 이름은 피해야 합니다.

다음과 같은 경우 함수 파라미터 이름에 접두사 'Out'을 추가할 것이 좋습니다.

  • 함수 파라미터가 레퍼런스로 전달되는 경우

  • 함수를 그 값에 쓸 것으로 예상되는 경우

이렇게 하면 이 실행인자에 전달되는 값이 함수로 대체된다는 것을 확실히 알 수 있습니다.

In 또는 Out 파라미터도 부울인 경우 bOutResult 와 같이 In/Out 접두사 앞에 'b'를 붙입니다.

값을 반환하는 함수는 반환 값을 설명해야 합니다. 함수가 어떤 값을 반환하는지 이름을 보고 정확히 알 수 있어야 합니다. 특히 부울 함수의 경우 이는 매우 중요합니다. 예시로 다음 두 가지 방법을 확인해 보세요.

   // true일 경우 무슨 의미일까요?
   bool CheckTea(FTea Tea);
    
   // 이름을 통해 true일 경우 차가 신선하다는 것을 명확히 알 수 있습니다.
   bool IsTeaFresh(FTea Tea);

   float TeaWeight;
   int32 TeaCount;
   bool bDoesTeaStink;
   FName TeaName;
   FString TeaFriendlyName;
   UClass* TeaClass;
   USoundCue* TeaSound;
   UTexture* TeaTexture;


네임스페이스

해당하는 경우 네임스페이스를 사용하여 클래스, 함수 및 변수를 구성할 수 있습니다. 네임스페이스를 사용하는 경우에는 아래 규칙을 따릅니다.

  • 대부분의 UE 코드는 현재 글로벌 네임스페이스에 래핑되어 있지 않습니다.

    • 특히나 서드 파티 코드를 사용하거나 포함할 때는 전역 범위에서 충돌이 일어나지 않도록 주의를 기울여야 합니다.
  • UnrealHeaderTool에는 네임스페이스가 지원되지 않습니다.

    • UCLASS , USTRUCT 등을 정의할 때는 네임스페이스를 사용할 수 없습니다.
  • UCLASS , USTRUCT 등이 아닌 새 API는 UE:: 네임스페이스에 배치해야 하며, 이상적으로는 중첩된 네임스페이스(예: UE::Audio:: )를 사용하는 것이 좋습니다.

    • 누구에게나 공개되는 API의 일부가 아닌 구현 세부 정보를 포함하는 데 사용되는 네임스페이스는 Private 네임스페이스(예: UE::Audio::Private:: )에 들어가야 합니다.

Using 선언:

  • 전역 범위에는 .cpp 파일에서도 using 선언을 넣지 않습니다('unity' 빌드 시스템에 문제가 생깁니다).
    다른 네임스페이스 안이나 함수 바디 안에는 using 선언을 넣어도 괜찮습니다.

  • 네임스페이스 안에 using 선언을 넣는 경우, 동일 이동 단위 내 해당 네임스페이스의 다른 곳으로 이어지게 됩니다. 일관성만 있으면 괜찮을 것입니다.

  • 위의 규칙을 따라야만 헤더 파일에서 using 선언을 안전하게 사용할 수 있습니다.

    -전방 선언된 타입은 각각의 네임스페이스 안에서 선언해야 합니다.

    • 그렇지 않으면 링크 오류가 발생합니다.
  • 하나의 네임스페이스 안에 다수의 클래스 또는 타입을 선언할 경우 다른 전역 범위의 클래스에서 사용하기 어려울 수 있습니다(예를 들면, 함수 시그니처는 클래스 선언에 나타날 때 명시적 네임스페이스를 사용해야 합니다).

  • using 선언을 사용하여 네임스페이스 안의 특정 변수만 자신의 범위로 에일리어싱할 수 있습니다.

    • using Foo::FBar 를 예로 들 수 있습니다. 그러나 언리얼 코드에서는 보통 그렇게 하지 않습니다.
  • 매크로는 네임스페이스 내에 있을 수 없습니다.

    • 대신 UE_ 접두사를 붙이면 됩니다(예: UE_LOG ).
profile
게임 프로그래머

0개의 댓글