TCHAR와 FString
🍋 TCHAR
- 유니코드를 사용해 문자열 처리를 통일한다.
- 이중 2byte로 사이즈 균일한 UTF-16을 사용한다.
- 유니코드를 위한 언리얼 표준 캐릭터 타입: TCHAR
- 문자열은 언제나 TEXT매크로를 사용한다.
- TEXT매크로로 감싼 문자열은 TCHAR배열로 지정된다.
🍋FString
FName 이나 FText 와는 달리, FString 은 조작이 가능한 유일한 스트링 클래스입니다. 대소문자 변환, 부분문자열 발췌, 역순 등 사용가능한 메서드는 많습니다. FString 은 검색, 변경에 다른 스트링과의 비교도 가능합니다. 그러나 바로 그것이 FString 이 다른 불변의 스트링 클래스보다 비싸지는 이유입니다.
- FString은 TCHAR 배열을 포함하는 헬퍼 클래스
Fstring 만들기:
FString TestHUDString = FString(TEXT("This is my test FString."));
FString 으로
변수 유형 | 스트링에서 변환 | 스트링 포맷 |
---|---|---|
float | FString::SanitizeFloat(FloatVariable); |
|
int | FString::FromInt(IntVariable); |
|
bool | InBool ? TEXT("true") : TEXT("false"); |
‘true’ 거나 ‘false’ 거나 |
FVector | VectorVariable.ToString(); |
‘X= Y= Z=’ |
FVector2D | Vector2DVariable.ToString(); |
‘X= Y=’ |
FRotator | RotatorVariable.ToString(); |
‘P= Y= R=’ |
FLinearColor | LinearColorVariable.ToString(); |
‘(R=,G=,B=,A=)’ |
UObject | (InObj != NULL) ? InObj->GetName() : FString(TEXT("None")); |
UObject 의 FName |
FString 에서
FString
에서 int
나 float
숫자 변수로의 변환은 물론, 부울 변수로의 변환도 존재합니다.
변수 유형 | 스트링에서 변환 | 참고 |
---|---|---|
bool | TestHUDString.ToBool(); |
|
int | FCString::Atoi(*TestHUDString); |
|
float | FCString::Atof(*TestHUDString); |
Printf
FString::Printf
로 조립된 FString 은 FString 에 저장 가능할 뿐만 아니라, UE_LOG 디버그 메시징 으로 화면에 출력시킬 수도 있습니다. 형식 인수는 지정자는 아래 예제에서 볼 수 있듯이 C++ printf
함수와 같습니다.
FString AShooterHUD::GetTimeString(float TimeSeconds)
{
// 분과 초만 관련이 있습니다.
const int32 TotalSeconds = FMath::Max(0, FMath::TruncToInt(TimeSeconds) % 3600);
const int32 NumMinutes = TotalSeconds / 60;
const int32 NumSeconds = TotalSeconds % 60;
const FString TimeDesc = FString::Printf(TEXT("%02d:%02d"), NumMinutes, NumSeconds);
return TimeDesc;
}
FString 포함을 위해 %s
파라미터를 사용하는 경우, 반드시 연산자를 사용해 줘야 %s 파라미터에 필요한 TCHAR 가 반환됩니다.
비교
오버로딩된 ==
연산자를 사용해서 두 FString 을 비교하거나, 하나의 FString 과 TCHAR*s 배열을 비교할 수 있습니다. FString::Equals()
메서드도 있는데, 검사 대상 FString 과, 비교시 대소문자를 무시할 것인지를 나타내는 ESearchCase
Enum 을 받습니다. 대소문자 상관없는 비교를 하려는 경우 ESearchCase::IgnoreCase
를, 아닌 경우 ESearchCase::CaseSensitive
를 사용합니다..
TestHUDString.Equals(TEXT("Test"), ESearchCase::CaseSensitive);
TCHAR LogCharArray[] = TEXT("Hello Unreal");
UE_LOG(LogTemp, Log, TEXT("%s"), LogCharArray);
FString LogCharString = LogCharArray;
UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString);
const TCHAR* LogCharPtr = *LogCharString;
TCHAR* LogCharDataPtr = LogCharString.GetCharArray().GetData();
TCHAR LogCharArrayWithSize[12];
FCString::Strcpy(LogCharArrayWithSize, LogCharString.Len(), *LogCharString);
if(LogCharString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase))
{
int32 Index = LogCharString.Find(TEXT("unreal"), ESearchCase::IgnoreCase);
FString EndString = LogCharString.Mid(Index);
UE_LOG(LogTemp, Log, TEXT("Find Test: %s"), *EndString);
}
FString Left, Right;
if(LogCharString.Split(TEXT(" "), &Left, &Right))
{
UE_LOG(LogTemp, Log, TEXT("Split Test: %s, 와 %s"), *Left, *Right);
}
int32 IntValue = 32;
float FloatValue = 3.14f;
FString FloatIntString = FString::Printf(TEXT("Int: %d, Float: %f"), IntValue, FloatValue);
FString FloatString = FString::SanitizeFloat(FloatValue);
FString IntString = FString::FromInt(IntValue);
UE_LOG(LogTemp, Log, TEXT("FloatIntString Test: %s"), *FloatIntString);
UE_LOG(LogTemp, Log, TEXT("FloatString: %s IntString: %s"), *FloatString, *IntString);
int32 IntValueFromString = FCString::Atoi(*IntString);
float FloatValueFromString = FCString::Atof(*FloatString);
UE_LOG(LogTemp, Log, TEXT("IntValueFromString: %d, FloatValueFromString: %f"), IntValueFromString, FloatValueFromString);
🍋FName
언리얼은 FName과 관련 된 글로벌 Pool 자료구조(singleton)를 가지고 있음.
문자열이 들어오면 해시 값을 추출해 키를 생성하고 FName에서 보관
FName값에 저장된 값을 사용해 전역 Pool에서 원하는 자료를 검색해 반환
- 애셋 관리를 위해 사용되는 문자열 체계.
- 대소문자 구분없음.
- 한번 선언되면 바꿀 수 없음.
- 가볍고 빠름.
- 문자열을 표현하는 용도가 아닌 애셋 키를 지정하는 용도로 사용. 빌드시 해시값으로 변환.
FName key1(TEXT("PELVIS"));
FName key2(TEXT("pelvis"));
UE_LOG(LogTemp, Log, TEXT("key1 == key2: %d"), key1 == key2);
🍋FText
- 다국어 지원을 위한 문자열 관리 체계
- 일종의 키로 작용함.
- 별도의 문자열 테이블 정보가 추가로 요구됨.
- 게임 빌드 시 자동으로 다양한 국가별 언어로 변환됨.
Leave a comment