언리얼 C++ 코딩 표준
언리얼의 독특한 클래스 이름 규칙과 작명규칙 이 2가지를 확실히 익혀본다.
코딩 표준 (Coding Standard)
- 프로그래밍을 작성해야 하는데 지켜야 하는 프로그래밍 이름 규칙, 작성 방법 등을 지정한 가이드라인
- 코딩 스타일, 코딩 컨벤션
한 마디로, 코딩 표준은 어떤 그룹, 직장에서 코딩할 때 지켜야하는 규칙 같은 느낌.
(인턴십에서 이전 코드 리뷰를 했던 이유 : 코딩 표준을 파악하기 위해서)
코딩 표준을 지켜서 프로젝트의 모든 코드는 한 사람이 만든 것처럼 보여야 한다.
언리얼 코딩 표준
1. 클래스 체계
이런식으로 public을 선언 후, private을 선언해야 한다.
→ 읽는 사람 입장에서, public으로 선언된 클래스를 찾을 일이 더 많기 때문
2. 저작권 고지
중요하다.. 안지키면 나락가니까.
배포용으로 만든 에픽의 소스파일(.h, .cpp등)은 파일 첫 번째 줄에 저작권 고지를 포함
// Copyright Epic Games, Inc. All Rights Reserved.
3. 명명규칙 (네이밍 컨벤션)
언리얼에서는 파스칼 케이싱을 사용한다.
- 파스칼 케이싱 : 합성어의 첫 자를 대문자 UnrealEngine
- 소문자는 가급적 사용하지 않고, 언더바 사용금지 unreal_engine (X)
추가적으로 클래스 네이밍에는 접두사를 앞에 붙인다.
- 템플릿 클래스 : 접두사 T
- UObject : 접두사 U (언리얼 오브젝트의 U)
- AACtor : 접두사 A (액터도 오브젝트지만, 액터니까 예외. A+Actor)
- SWidget : 접두사 S (UI 전용 클래스 Slate의 S)
- 추상 인터페이스, 언리얼 인터페이스 클래스 : 접두사 I
- 열거형 : 접두사 E
- 부울 변수 : 접두사 b (소문자 b 맞음)
- 그외 C++클래스, 구조체 : 접두사 F (언리얼 오브젝트로부터 상속받지 않는 클래스)
파라미터중 Input으로 들어가기도, Out으로 나오기도 하기 때문에
파라미터에 In / Out 접두사를 사용해 명시하는게 좋다.
코드 작성시 명시내용
4. 포터블 C++ 코드
이제부턴 int는 없다. 더 자세하게 int의 크기까지 명명해줘야한다.
bool - 부울 값(부울 크기 추정 금지). BOOL 은 컴파일되지 않습니다.
TCHAR - character(문자) (TCHAR 크기 추정 금지)
uint8 - unsigned byte(부호 없는 바이트) (1바이트)
int8 - signed byte(부호 있는 바이트) (1바이트)
uint16 - unsigned 'shorts'(부호 없는 'short') (2바이트)
int16 - signed 'short'(부호 있는 'short')(2바이트)
uint32 - unsigned int(부호 없는 int) (4바이트)
int32 - signed int(부호 있는 int) (4바이트)
uint64 - unsigned 'quad word'(부호 없는 '쿼드 단어') (8바이트)
int64 - signed 'quad word'(부호 있는 '쿼드 단어') (8바이트)
float - 단정밀도 부동 소수점(4바이트)
double - 배정밀도 부동 소수점(8바이트)
PTRINT - 포인터를 가질 수 있는 정수(PTRINT 크기 추정 금지)
이 중에서 자주쓰는건 TCHAR, uint8, int32
※ C++의 int는 기본적으로 32bit로 보장
게임은 결국 사용자의 싱글머신 컴퓨터에서 최적으로 돌아가게 만들어야 하기 때문에 메모리 관리가 중요하다.
5. 표준 라이브러리 사용X
언리얼에서는 C++의 STL을 사용하지 않는다. 언리얼엔진만의 라이브러리를 사용하기 때문에 앞으로 잘 구분해서 사용해야한다.
6. Const 정확도
언리얼, C++ 뿐만아니라 코딩을 할 때, 가능하면 모든 변수에 const를 달아서 변경불가능하게 만드는게 권장된다.
7. Null은 nullptr로 사용
8. auto는 거의 사용X
9. 코드 포맷
1) 중괄호
if (bThing)
{
return;
}
이런식으로 새 줄에 중괄호를 사용한다.
2) 네임스페이스
언리얼에서 게임을 만들면 네임스페이스를 사용하는 일은 거의 없을 것이다.
3) 물리적 종속성
- 클래스에는 접두사를 붙였지만, 파일에는 가급적 접두사를 붙이지 않는다.
- 모든 헤더에 #pragma once 를 작성해서 헤더 중복 선언을 막는다.
- 전방선언을 이용한다.(어떤 클래스를 사용하는지 미리 명명)
4) 캡슐화
- private으로 멤버를 지정하고, Getter & Setter을 이용해서 접근한다.
- 더 이상 파생시키지 않을 거면 final을 사용한다.
5) 그 외
- 의존성, 종속성을 최대한 낮춘다. (스파게티 코드 만들지 말아라)
- String 관련해서는 항상 TEXT() 매크로를 사용한다.
- 언리얼 코드를 볼 때 Find in Files를 통해 특정 타입에 대한 포인터, 레퍼런스를 찾을 수 있는데, 반드시 아래와 같이
Type* 변수명 으로 작성한다.
FShaderType* Ptr
- 헤더에 특수한 static 변수를 정의하지 않는다.
(헤더에 static 변수를 선언하게 되는 경우, 헤더를 참조하는 모든 인스턴스들이 컴파일되기 때문)
// 안좋은 예
// SomeModule.h
static const FString GUsefulNamedString = TEXT("String");
// 좋은 예
// SomeModule.h
extern SOMEMODULE_API const FString GUsefulNamedString;
// SomeModule.cpp
const FString GUsefulNamedString = TEXT("String");
'하고싶은거 > Unreal' 카테고리의 다른 글
Part1 04. 언리얼 오브젝트 (0) | 2024.03.03 |
---|---|
Part1 03. 기존 C++과 다른 언리얼 C++ (0) | 2024.03.02 |
Part1 01. Hello Unreal! (0) | 2024.02.28 |
Part2 섹션1. 게임 콘텐츠의 기본 구조 (0) | 2024.02.13 |
이득우의 언리얼 프로그래밍 start (0) | 2024.02.11 |
#개발 #게임 #일상
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!