게임 엔진/Unreal

[Unreal] 언리얼 C++ 코딩 표준

겜도리도리 2023. 12. 19. 16:58
반응형

클래스 체계

public을 선언 후 private 구현이 따라야 한다.

-> 읽는 사람의 대부분은 클래스의 public 인터페이스를 사용하기 때문

 

명명 규칙

언리얼 엔진은 대부분 파스칼 케이싱을 사용, 단어 사이의 언더스코어( _ )를 사용하지 않음.

타입 이름에는 대문자로 이루어진 접두사를 포함하여 변수 이름과 구분함.

예를 들어서, FSkin은 타입 이름이고, Skin은 FSkin의 인스턴스임.

 

예시

UObject를 상속받으면 접두사 U를 사용

AActor를 상속받으면 (Actor는 UObject를 상속받았지만) 접두사 A 사용

SWidget(UI 관련)에서 상속받으면 접두사 S를 사용

추상 인터페이스 클래스에는 접두사 I를 사용

템플릿 클래스는 T

열거형은 E사용

bool변수는 예외적으로 소문자 b를 사용 (ex : bHasFadeIn)

일반적인 대부분의 클래스나 구조체에는 F사용

매크로는 모두 대문자, 단어 구분시에는 언더스코어( _ )로 구분, 접두사 UE_ 사용

 

표준 라이브러리

표준 라이브러리는 안정적이고 완성도가 높아져왔으나 언리얼에서는 사용하지 않음

FMemory::Memcpy나 FMemory::Memset 사용하지만 퍼포먼스상 이점이 있으면 memcpy, memset을 사용할 수 있음.

 

const

값이 변경되지 않아야 하는 곳에는 const 사용, const는 사용할 수 있는 곳에 다 붙일 것 (특히 루프에서)

레퍼런스에 const는 의미 없으므로 사용하지 말 것

 

최신 C++ 문법들

최소 C++17 버전을 사용할 것

final, override 가급적이면 사용할 것

null대신 nullptr 사용

auto는 특정 경우에만 사용 (람다 바인딩, 이터레이터 변수, 템플릿 코드)

범위 기반 for은 인덱스를 사용하지 않는 루프문에서 적절히 사용

enum은 enum class 사용

std::move (이동 시맨틱)은 MoveTemp를 통해 명시적으로 호출 가능

디폴트 멤버 이니셜라이저 사용는 신중하게 할 것, 가급적 생성자 구문에서 초기화할 것

 

코드 포맷

중괄호 내려쓸 것, 단일 블록 구문에도 중괄호 포함할 것 (return, continue, break 등등...)

들여쓰기는 스페이스가 아니라 탭을 사용, 탭 크기는 4자로 설정

Switch 문에서는 디폴트 케이스를 항상 만들 것, 각각의 경우마다 braek를 넣거나 주석을 달아 명시적으로 볼 수 있게 할 것

 

물리적 종속성

파일 이름에는 가급적 접두사를 붙이지 말 것

#pragma once 사용

가급적 include 선언은 세밀하게 해서 적은 수의 header 인클루드

헤더 대신 전방 선언을 사용할 수 있으면 전방 선언을 쓸 것

 

캡슐화

클래스 멤버는 public/protected 인터페이스 일부가 아닌 경우 항상 private으로 선언, getter나 setter로 접근할 수 있게 할 것

final 명확하게 사용

 

일반적인 스타일

파일 끝에 빈 줄 하나 넣을 것

함수 이름과 아규먼트 사이에 스페이스 넣지 말 것

스트링 리터럴에서는 TEXT() 매크로 사용

복잡한 표현식은 중간 변수를 간소화하여 사용ㅅ

&나 *는 타입옆에 붙여서 쓸 것, 스페이스는 오른쪽에 딱 한 칸만 : Find in Flies 때문

섀도잉된 변수 사용 금지

함수 호출할 때 리터럴 사용 피하기

헤더에 static 변수 정의하지 말 것, extern으로 선언하고 구체적 구현은 .cpp에서 할 것

 

너무 길게 함수파라미터 사용하지 않기, 너무 길어진다면 구조체로 넘기는 것을 고려할 것

인터페이스는 항상 추상형, 멤버 변수가 있어서는 안됨

 

 

출처

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

반응형