코딩 표준
코딩 규칙이 필요한 이유
1. 소프트웨어의 총 수명 비용 중 80%는 유지보수에 소모된다
2. 최초 작성자가 그 소프트웨어의 수명이 다할 때까지 유지보수하는 경우는 거의 없다
3. 코딩 규칙을 사용하면 소프트웨어의 가독성을 향상하여 엔지니어가 새로운 코드를 빠르고 완벽히 이해할 수 있다
4. 에픽에서 소스 코드를 모드 개발자 커뮤니티에 공개할 경우 코딩 규칙을 알고 있으면 이해하기 쉽다
5. 대다수의 코딩 규칙이 크로스 컴파일러 호환성에 필요하다
※크로스 컴파일(corss compile) : 컴파일러가 실행되는 플랫폼이 아닌 다른 플랫폼에서 실행 가능한 코드를 생성할 수 있는 컴파일러이다.
클래스 체계
클래스는 작성자보다 읽는 사람을 염두에 두고 조직되어야한다. 그래서 읽는 사람은 대부분 클래스의 public 인터페이스를 사용할 것이므로, public 구현을 먼저 선언한 후 클랫의 private 구현이 뒤따라야 한다.
UCLASS()
class EXAMPLEPROJECT_API AExampleActor : public AActor
{
GENERATED_BODY()
public:
// 이 액터 프로퍼티의 디폴트값 설정
AExampleActor();
protected:
// 게임 시작 또는 스폰 시 호출
virtual void BeginPlay() override;
};
명명 규칙
1. 각 단어의 첫 번쨰 글자(타입 이름 또는 변수 이름)는 대문자여야 한다. (ex. lastMouse(x), LastMouse(O))
2. 단어 사이에는 '_'를 사용하지 않는다 (ex. Delta_Corrdinates (x), DeltaCorrdinates (O))
3. 타입 이름에는 추가적으로 대문자로 이루어진 접두사를 포함하여 변수 이름과 구분한다
(ex. FSkin은 타입이름, Skin은 FSkin 타입의 인스턴스)
4. 템플릿 클래스에는 접두사 T를 포함한다.
class TAttribute
5. UObject에서 상속하는 클래스에는 접두사 U를 포함한다
class UActorComponent
6. AActor에서 상속하는 클래스에는 접두사 A를 포함한다
class AActor
7. SWidget에서 상속하는 클래스에서는 접두사 S를 포함한다
class SCompoundWidget
8. 추상적 인터페이스인 클래스에는 접두사 I를 포함한다
class IAnalyticsProvider
9. 에픽의 콘셉트가 유사한 클래스 타입에는 접두사 C를 포함한다
template <typename Concept, typename... Ts>
10. 열거형에는 접두사 E를 포함한다
enum class EColorBits
{
ECB_Red,
ECB_Green,
ECB_Blue
};
11. 부울 변수에는 접두사 b를 포함한다
bPendingDestruction
bHasFadedIn.
12. 그 외 대부분의 클래스는 접두사 F를 포함하지만 일부 서브시스템은 다른 글자를 사용한다
13. 구조체의 typedef인 경우 F, UObject의 typedef인 경우 U를 사용한다
14. 특정 템플릿 인스턴스화의 typedef는 더 이상 템플릿이 아니며, 알맞은 접두사를 붙여야 한다.
typedef TArray<FMytype> FArrayOfMyTypes;
15. C#에서는 접두사가 생략된다
16. 언리얼 헤더 툴의 경우 대부분 올바른 접두사가 필요하므로, 접두사를 제공하는 것이 중요하다
17. 템플릿 파라미터를 기반으로 하는 타입 템플릿 파라미터 및 중첩된 타입 에일리어스는 타입 카테고리를 알 수 없으므로 상기 접두사 규칙의 대상이 아니다
18. 설명적인 용어 뒤에는 Type 접미사를 사용하는 것이 좋다
19. In 접두사를 사용하여 아래와 같이 템플릿 파라미터를 에일리어스와 구분한다
template <typename InElementType>
class TContainer
{
public:
using ElementType = InElementType;
};
20. 타입 및 변수 이름은 명사이다.
21. 메서드의 이름은 메소드의 이펙트를 설명하거나, 이펙트가 없는 메서드의 반환 값을 설명하는 동사이다.
22. 매크로 이름은 모두 대문자로 구성되고, 단어가 언더스코어로 분리되며, 접두 UE_가 사용되어야 한다.
#define UE_AUDIT_SPRITER_IMPORT
23. 변수, 매서드, 클래스 이름은 명확함, 확실함, 내용을 파악할 수 있음 과 같아야한다.
24. 각 변수의 의미에 대해 코멘트를 제공할 수 있도록 모든 변수는 자체적인 줄에서 선언해야 한다.
25. 변수 앞에 여러 줄 또는 한 줄의 코멘트를 사용할 수 있으며, 변수 그룹화를 위한 빈 줄은 선택사항이다.
26. 부울을 반환하는 모든 함수는 IsVisible() 또는 ShouldClearBuffer() 등의 true/false 질문을 해야 한다
27. 프로시저(반환 값이 없는 함수)는 강한 동사 뒤에 오브젝트를 붙여 써야 한다. 메서드의 오브젝트가 그 안에 있는 오브젝트일 때는 예외이며, 이 경우 오브젝트는 컨텍스트에서 이해된다. 'Handle' 및 'Process'등의 모호한 동사로 시작하는 이름은 피해야 한다
28. 함수 파라미터가 레퍼런스로 전달되는 경우, 함수를 그 값에 쓸 것으로 예상되는 경우 접두사 'Out'을 추가할 것이 좋다. 그래야 이 실행인자에 전달되는 값이 함수로 대체된다는 것을 확실히 알 수 있다
29. In 또는 Out 파라미터도 부울인 경우 bOutResult와 같이 In/Out 접두사 앞에 'b'를 붙인다
30. 값을 반환하는 함수는 반환 값을 설명해야 한다. 함수가 어떤 값을 반환하는지 이름을 보고 정확히 알 수 있어야 한다.
// 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;
'언리얼엔진' 카테고리의 다른 글
언리얼 엔진 5 코딩 표준 (최신 C++ 언어 문법 및 서드 파티 코드) (0) | 2025.02.19 |
---|---|
언리얼 엔진 5 코딩 표준 2 (포터블 C++ 코드 표준 라이브러리 사용) (0) | 2025.02.17 |
언리얼 엔진 5 (Unreal Engine 5 C++ Developer: Learn C++ & Make Video Games 113~125) (0) | 2023.04.22 |
언리얼 엔진 5 C++ (캐릭터 겹쳐 보이지 않기) (0) | 2023.02.12 |
언리얼 엔진 5 C++ (줌인) (0) | 2023.02.11 |