이식성 관점
: 언리얼 엔진은 다양한 플랫폼에서 작동. 각 플랫폼마다 데이터 타입의 크기나 특성이 다를 수 있다. 예를 들어, int가 어떤 플랫폼에서는 32비트이고 다른 플랫폼에서는 64비트일 수 있다. 언리얼 엔진은 int32, uint32 같은 고정 크기 타입을 사용하여 모든 플랫폼에서 일관된 동작을 보장.
에디터 및 리플렉션 시스템 관점
: 언리얼 엔진의 많은 기능들은 리플렉션(reflection) 시스템에 의존. UPROPERTY 매크로를 사용하여 변수들을 에디터에 노출할 때, 엔진은 자체 데이터 타입을 통해 이러한 변수들을 관리하고 직렬화함. 따라서 언리얼 엔진의 데이터 타입을 사용하면 이러한 기능을 보다 원활하게 활용할 수 있음.
bool에 대한 국제적인 표준 규약이 없어서 1byte 크기인 uint8을 쓰고 있지만, 용량을 최적화 하기 위해 bit field operator를 사용해서 1bit로 나타낼 수 있다. 일반 uint8과의 구분을 위해서 ‘b’접두사를 사용한다.
언리얼은 int를 사용하지 않고 int32를 사용한다.
float와 double은 공통적으로 4byte와 8byte를 사용하기 때문에 따로 float32, double64가 아닌 그냥 vanilla로 “float”, “double”을 사용한다.
언리얼은 TCHAR
라는 자기만의 문자열 시스템을 가지고 있다.
영어는 사실상 1byte로 표현가능하지만 다른 나라의 언어들은 그렇지 않기 때문에 Unicode라는 것이 등장하게 되었다. 하지만 윈도우 OS를 포함해서 아직도 이런 문자열은 계속 쓰이고 있다. 따라서 Unreal은 TCHAR라는 고유 문자열 시스템을 가지게 된 것.
UTF-8
: 가변길이 방식. 영문권 국가권에서는 캐릭터당 1byte, 동아시아 국가권에서는 캐릭터당 2byte. 메모리를 적게 사용한다는 장점이 있음.
UTF-16
: 무조건 2byte. 우리가 데이터를 받아올때 균일하게(2byte로) 정렬된 데이터를 받아올 수 있다는 점
모든 String은 FString 혹은 TCHAR 정렬 상태로 UTF-16 format 메모리에 저장된다.
만약 Unreal Engine 소스 코드에 한글을 사용하겠다고 하면 UTF-8 형태로 저장하면 된다.
GameInstance Class를 상속받은 C++ 클래스에서 테스트 해보기
Project settings -> Maps&Modes에서 GameInstance를 우리가 만든 custom GameInstance로 설정.
항상 명심할 것!
Unreal에서 함수를 overriding할때는 반드시 Super로 부모의 함수를 한번 불러주어야 한다.
문자열을 다양하게 조작하고 싶다면 TCHAR를 사용하는 것이 아니라 FString을 사용하여야 한다.
중간 정리!
Unicode
를 사용해 문자열 처리를 통일.
문자열은 언제나 TEXT macro
를 사용해 지정.
문자열을 다루는 클래스로 FString
를 제공함.
언리얼 엔진에서 TCHAR
는 플랫폼 독립적인 텍스트 문자를 의미하며, 주로 유니코드와 ANSI 문자 형식 모두를 지원하기 위해 사용됨. FString
은 언리얼 엔진에서 제공하는 문자열 클래스이며, 동적 메모리 할당을 통해 가변 길이의 문자열을 처리하고 다양한 문자열 조작 기능을 제공. FCString
은 문자열 작업을 위한 정적 함수들의 집합으로, 주로 TCHAR 배열에 대한 저수준 문자열 조작을 수행.
요약하면, TCHAR
는 기본 문자 타입, FString
은 고수준 문자열 클래스, FCString
은 저수준 문자열 함수 집합으로, 이들은 서로 보완하여 문자열 처리를 효율적으로 수행.
...
// FString 예제
// 기본적으로 TEXT()는 TCHAR로 이루어진 배열이다.
TCHAR StringArray[] = TEXT("Hello Unreal");
UE_LOG(LogTemp, Log, StringArray);
// FString을 UE_LOG로 찍는 방법
FString TestFString = StringArray;
UE_LOG(LogTemp, Log, TEXT("%s"), *TestFString);
// Contains함수와 Find 함수
if (TestFString.Contains(TEXT("Unreal"), ESearchCase::IgnoreCase))
{
int32 index = TestFString.Find(TEXT("Unreal"), ESearchCase::IgnoreCase);
}
// Split하는 방법
FString Left, Right;
if(TestFString.Split(TEXT(" "), &Left, &Right))
{
UE_LOG(LogTemp, Log, TEXT("Splitting string with " ", %s와 %s"), *Left, *Right);
}
FName
은 Asset 관리를 위해 사용되는 문자열 체계. 그냥 FString으로 저장하면 찾는데 시간이 오래 걸려서 FName을 사용한다고 함.
Unreal System에서는 FName만을 보관하는 Singleton형식으로 되어 있는 global pool을 제공한다. 이 pool(FNamePool
)은 key-value로 이루어져 있다. 여기에서 key가 FName에 해당. 이 key값을 사용해서 FNamePool에 있는지 없는지 빠르게 확인할 수 있음.
FName key1 = TEXT("PELVIS");
FName key2 = TEXT("pelvis");
UE_LOG(LogTemp, Log, TEXT("key1와 key2는 서로 %s"), key1 == key2 ? TEXT("같다") : TEXT("다르다"));