1-2강 Unreal Coding Convention

Ryan Ham·2024년 6월 25일
1

이득우 Unreal

목록 보기
2/23

Unreal C++ Coding Convention

Unreal Coding Convention

Coding Convention이 필요한 이유
한 프로젝트의 코드를 마치 한 사람이 작성한 것처럼.

Unreal의 명명 규칙은 Pascal Casing을 사용하고 있다.
합성어의 첫 글자를 대문자를 사용해 명명 UnrealEngine

접두사

Teamplate 클래스에는 접두사 T, UObject에서 상속받는 클래스에는 접두사 U, AActor에서 상속받는 클래스에는 접두사 A, SWidget에서 상속받는 클래스에는 접두사 S, 추상적 Interface인 클래스에는 접두사 I가 있다.

Template Class -> 접두사 T
UObject 상속 -> 접두사 U
AActor 상속 -> 접두사 A
SWidget 상속 -> 접두사 S
추상적 Interface Class -> 접두사 I
열거형 -> 접두사 E
Bool 변수 -> 접두사 b
Unreal Object를 상속받지 않는 대부분 class -> 접두사 F


중요하게 볼 변수들

uint8 - unsigned byte(1 Byte)
int32 - signed int(4 Byte)

TCHAR - character(TCHAR 크기 추정 금지)

Const 정확도

void SomeMutatingOperation(FThing& OutResult, const TArray<Int32>& InArray)
{
	// InArray는 여기서 수정되지 않지만, OutResult는 수정될 수도 있습니다.
}

void FThing::SomeNonMutatingOperation() const
{
	// 이 코드는 자신을 호출한 FThing을 수정하지 않습니다.
}

TArray<FString> StringArray;
for (const FString& : StringArray)
{
	// 이 루프의 바디는 StringArray를 수정하지 않습니다. 
}

// 나쁜 예 - const 배열 반환
const TArray<FString> GetSomeArray();

// 좋은 예 - const 배열로의 reference 반환
const TArray<FString>& GetSomeArray();

범위 기반 for 문

TMap<FString, int32> MyMap;

// 기존 스타일
for (auto It = MyMap.CreateIterator(); It; ++It)
{
	UE_LOG(LogTemp, Log, TEXT("Key: %s, Value : %d"), It.Key(). *It.Value());
} 

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

Enum

NameSpace와 Enum을 섞어서 사용하지 말고 Enum class를 사용하자!

Move Semantic

Unreal에서 STL의 std::move에 해당되는 함수는 MoveTemp

메모리의 복사없이 데이터를 이동할 수 있다.

모든 header는 #pragma once 지시어(directive)로 복수의 inclue를 방지해야 한다.
header include 대신 전방 선언(forward declaration)이 가능한 경우 그렇게 한다.

문자열을 사용할때는 꼭 TEXT 사용하기!

헤더에 특수한 스태틱 변수를 정의하지 않도록 한다. 특수한 스태틱 변수는 해당 헤더가 포함된 이동 단위마다 인스턴스를 컴파일하기 때문.

// SomeModule.h
static const FString GUsefulNamedString = TEXT("String");

	 

//이러한 코드는 다음으로 대체해야 함

// SomeModule.h
extern SOMEMODULE_API const FString GUsefulNamedString;

// SomeModule.cpp
const FString GUsefulNamedString = TEXT("String");   

Interface

  • C++에 없지만 다른 상위 OOP(C#, Java) 같은 언어들에는 존재하는 개념. Unreal에서도 따로 구현해 놓았다.
    항상 추상형이어야 하며, member variable이 있어서는 안된다.

  • 꼭 순수 가상(pure virutal)인 method만 있어야 하는 것은 아님.

class A
{
 public:
	virtual void F() {}
};
            
class B : public A
{
public:
	virtual void F() override;
}
profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

0개의 댓글