본문 바로가기
Unreal/이득우의 언리얼 프로그래밍

[UE5/Part1-2강] 언리얼 코딩 규칙

by 이제ise이제 2024. 1. 9.

인프런 이득우의 언리얼 프로그래밍 Part1을 수강하며 작성한 강의 노트입니다.

파란색 : 강의 외 추가 조사

빨간색 : 중요 내용


핵심

0. C++ 표준 라이브러리 사용 X

1. public에서 private로 이어지는 클래스 체계(Organization) 준수

2. 명명 규칙

  • 파스칼 케이싱
  • 소문자 가급적 X
  • 공백 X
  • 언더스코어(_) X
  • 모든 클래스와 구조체에는 고유한 접두사 있음

3. 코드의 명확성

  • parameter에 가급적 In, Out 접두사 명시
  • const 지시자(directive) 적극 활용
  • reference를 통한 복사 방지
  • auto 키워드 : 예외 상황 외에는 X

4. Find In Files 활용

5. 헤더 파일 및 #include 구문 : 의존성 최소화 시키기

 

 

언리얼 C++ 코딩 표준

https://docs.unrealengine.com/5.1/ko/epic-cplusplus-coding-standard-for-unreal-engine/

 

코딩 표준

기존에 확립된 표준 및 모범 사례를 준수하여 유지보수 가능한 코드를 작성합니다.

docs.unrealengine.com

 


언리얼에서 명시한 코딩 표준의 중요성


클래스의 체계

읽는 사람은 대부분 클래스의 퍼블릭 인터페이스를 사용할 것이므로, 퍼블릭 인터페이스에서 먼저 선언한 후 클래스의 프라이빗 구현이 뒤따라야 합니다.

 

예시

1강에서 작성한 코드


명명 규칙

언리얼은 파스칼 케이싱을 따르고 있다

케이싱 종류
  • 파스칼 케이싱(Pascal Casing) : 합성어의 첫글자를 대문자로 사용 (Ex. UnrealEngine)
  • 카멜 케이싱(Camel Casing) : 첫 합성어는 소문자, 나머지는 대문자로사용 (Ex. unrealEngine)
  • 스테이크 케이싱(Snake Casing) : 합성어 사이에 언더바(_)를 사용 (Ex. unreal_engine)

 

언리얼의 접두사 규칙

  • 접두사 T : 템플릿 클래스
  • 접두사 U : UObejct에서 상속받는 클래스
  • 접두사 A : AActor에서 상속받는 클래스(UObject를 상속받았지만)
  • 접두사 S : SWidget에서 상속받는 (UI전용)클래스
  • 접두사 I : 추상적 인터페이스
  • 접두사 C : 에픽의 개념이 유사한 클래스타입
  • 접두사 E : enum형
  • 접두사 b : bool형
  • 접두사 F : 대부분의 클래스, 구조체 (일부 서브시스템 제외)
  • Typedef는 해당 타입에 적합한 접두사 사용
    • 구조체 : F
    • UObject의 typedef : U

 

일반적인 코딩 규칙

필수사항

  • bool형 함수 : 질의형 (ex. IsVisible())
  • 프로지서(void형 함수) : 강한 동사 뒤에 오브젝트 붙이기 (명사형은 비추천)

권장사항 

  • In 또는 Out 접두사 : 함수 파라미터가 참조로 전달된 후 함수가 그 값을 쓸 것으로 예상되는 경우
  • In 또는 Out 파라미터가 bool형일 때 : In/Out 접두사 앞에 접두사 'b' 붙이기 (ex. bOutResult)

 포터블 C++ 코드

  • TCHAR : char
  • uint크기추정 : unsigned byte
    • uint8 : 1byte
    • uint16 : 2byte
    • uint32 : 4byte
    • uint64 : 8byte
  • int크기추정 : singed byte
    • int8 : 1byte
    • int16 : 2byte
    • int32 : 4byte
    • int64 : 8byte
  • float : 4byte. 단정밀도 부동 소수점
  • double : 8byte. 배정밀도 부동 소수점
  • PIRINT : 포인터를 가질 수 있는 정수

언리얼은 C++ 표준 라이브러리 사용 지양

이유 : C++ 표준 라이브러리는 범용적으로 설계된 만큼, 사용 시 컴파일 시간이나 복잡도 등이 증가할 수 있기 대문


Const 정확도 맞추기


주석 : 특수한 코멘트 포맷 규칙

언리얼은 JavaDoc 기반 시스템 사용 : 코드에서 주석을 자동 추출하여 문서 제작 가능


auto 키워드 : 사용 X

예외 상황 : 사용 O

  • 변수에 람다 바인딩 : 람다 타입은 코드로 표현 불가하므로
  • iterator 변수 : 가독성이 나쁠 때만
  • 템플릿 코드에서 표현식의 타입을 쉽게 식별할 수 없는 경우. 고급 사용 사례입니다.

중괄호

if (bThing)
{
    return;
}

물리적 종속성

  • #pragma once : 모든 헤더에 사용. 복수의 include를 방지
  • 전방 선언(forward declaration)

포인터

FShaderType* Ptr