상세 컨텐츠

본문 제목

언리얼 엔진 C++ 코딩 표준 정리

공부/C++

by micalcomanie 2025. 2. 21. 00:53

본문

728x90
반응형
SMALL

 

언리얼 엔진을 개발하는 에픽게임즈는 자체적인 C++ 코딩 표준을 가지고 있으며, 이를 따르는 것이 필수입니다.
이 글에서는 언리얼 엔진의 공식 코딩 스타일을 정리하여 소개합니다.

🎯 좋은 코딩 표준이란?

  • 절대적으로 좋은 코딩 표준은 존재하지 않습니다.
  • 모든 코드가 한 사람이 작성한 것처럼 보이도록 일관성을 유지해야 합니다.
  • 언어와 관계없이 일관된 스타일을 유지하는 것이 중요합니다.

📌 클래스 작성 순서

클래스를 작성할 때 퍼블릭 인터페이스를 먼저 선언한 후, 프라이빗 구현을 배치하는 것이 원칙입니다.

class UExampleClass
{
public:
    void PublicMethod();

private:
    int32 PrivateValue;
};

📝 명명 규칙(Naming Conventions)

언리얼 엔진에서는 **파스칼 케이싱(Pascal Casing)**을 사용하며, 특정한 클래스에는 접두사를 부여해야 합니다.

📍 클래스 및 인터페이스 접두사

  • U → UObject에서 상속하는 클래스
    class UMyObject;
    
  • A → AActor에서 상속하는 클래스
    class AMyActor;
    
  • S → SWidget에서 상속하는 Slate UI 위젯 클래스
    class SMyWidget;
    
  • I → 인터페이스 클래스
    class IMyInterface;
    
  • E → 열거형(enum) 클래스
    enum class EMyEnum;
    
  • b → 부울(bool) 변수
    bool bIsVisible;
    
  • F → 대부분의 일반 클래스
    class FMyStruct;
    

⚠️ 포용적 단어 선택

  • 차별적, 논란이 될 가능성이 있는 단어를 사용하지 않도록 합니다.

🛠️ 포터블 C++ 코드

  • 기본 자료형 대신 언리얼 엔진 타입을 사용해야 합니다.
    uint8, int8, uint16, int16, uint32, int32, uint64, int64
    
  • nullptr을 사용하고 NULL을 사용하지 않습니다.
    int32* Ptr = nullptr;
    
  • C++ 표준 라이브러리는 직접 사용을 지양합니다.

💬 주석(Comment)

  • 코드 이해를 돕기 위한 주석을 적극적으로 사용해야 합니다.
  • 너무 과한 주석보다는 필요한 부분에만 작성하는 것이 좋습니다.

🚀 Const 정확도

  • 모든 변수는 const를 고려하여 선언해야 합니다.
  • 반환값에 const를 사용하지 않습니다.
    // 나쁜 예
    const TArray<FString> GetSomeArray();
    
    // 좋은 예
    const TArray<FString>& GetSomeArray();
    

🚫 Auto 키워드 제한

언리얼 엔진에서는 auto 사용을 지양합니다. 단, 예외적으로 템플릿 코드, 람다 바인딩, 긴 이터레이터 타입에서는 허용됩니다.

TMap<FString, int32> MyMap;
for (TPair<FString, int32>& Kvp : MyMap)
{
    UE_LOG(LogTemp, Log, TEXT("Key: %s, Value: %d"), *Kvp.Key, Kvp.Value);
}

🎛️ 열거형 (Enum) 스타일

  • 기존 스타일
    UENUM()
    namespace EThing
    {
        enum Type
        {
            Thing1,
            Thing2
        };
    }
    
  • 새로운 스타일 (Enum Class 사용)
    UENUM()
    enum class EThing : uint8
    {
        Thing1,
        Thing2
    };
    

🔥 이동 시맨틱(Move Semantics)

  • std::move 대신 MoveTemp를 사용합니다.
    FString MovedString = MoveTemp(MyString);
    

📂 헤더 파일 관리

  • #pragma once를 사용하여 헤더 가드를 설정합니다.
  • 불필요한 헤더 포함을 피하고, 최소한의 의존성만 추가합니다.

📌 캡슐화 원칙

  • 프라이빗이 기본값이어야 합니다.
  • 더 이상 파생시킬 필요 없는 클래스는 final을 선언합니다.
class FMyClass final
{
private:
    int32 PrivateVar;
};

🔠 문자열 리터럴

  • TEXT() 매크로를 항상 사용합니다.
    FString Name = TEXT("Unreal Engine");
    

🎛️ API 디자인 가이드라인

  • 가독성이 좋은 API를 설계해야 합니다.
  • 불필요한 플래그를 나열하는 대신, 비트 플래그를 사용합니다.
    enum class ETeaFlags
    {
        None  = 0x00,
        Milk  = 0x01,
        Sugar = 0x02,
        Honey = 0x04,
        Lemon = 0x08
    };
    ENUM_CLASS_FLAGS(ETeaFlags)
    

🏗️ 플랫폼별 코드 작성

  • 특정 플랫폼에 의존적인 코드가 일반 기능에 영향을 주지 않도록 해야 합니다.

📢 결론

  • 퍼블릭에서 프라이빗으로 클래스 선언을 정리합니다.
  • 명명 규칙을 준수하고, 파스칼 케이싱을 사용합니다.
  • 가독성이 좋은 코드 스타일을 유지합니다.
  • 헤더 파일 포함을 최소화하여 종속성을 줄입니다.

언리얼 엔진의 코딩 스타일을 준수하는 것은 유지보수성과 협업에 필수적인 요소입니다. 이 가이드를 참고하여 더욱 깔끔하고 효율적인 코드를 작성해 보세요! 🚀

728x90
반응형
LIST

관련글 더보기