FString의 구조
TCHAR과 FString의 관계성
- TCHAR 배열의 문자열을 FString에 넣으면, TArray라는 언리얼 엔진이 제공하는 동적배열 클래스 방식으로 HELLO라는 문자열이 보관이 된다.
- 이 후 *연산자를 사용하면 FString 클래스에 담긴 TArray 동적 배열의 문자열의 첫번째 인자의 포인터를 반환해준다.
- FString으로 TCHAR 데이터를 관리하되, TCHAR 형태의 데이터가 필요한 경우에는 포인터 연산자(*)를 써서 사용한다.
- FCString 클래스는 C 라이브러리에서 제공하는 기본적인 스트링 관련 함수들을 포함하고 있는 래퍼 클래스(Wrapper Class)이다.
- FString은 문자열을 보관하는 클래스지만, 내부적으로 FCString를 통해 스트링 관련 연산 함수들을 사용할 수 있다.
FString의 활용
- 다른 타입에서 FString으로 변환하는 함수들
- FString::Printf()
- FString::SanitizeFloat()
- FString::FromInt()
- FString에서 다른 타입으로 변환하는 함수들 (포인터 연산을 하므로 안전하지 X)
- FCString::Atoi()
- FCString::Atof()
TCHAR LogCharArray[] = TEXT("Hello Unreal!");
UE_LOG(LogTemp, Log, LogCharArray);
FString LogCharString = LogCharArray;
UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString);
const TCHAR* LogCharPtr = *LogCharString; //FString을 다시 TCHAR* 형태로 받음
TCHAR* LogCharDataPtr = LogCharString.GetCharArray().GetData(); //FString의 포인터를 받아서 직접 고치고 싶을 경우(const 없음)
TCHAR LogCharArrayWithSize[100]; //다시 배열로 가져오기 위한 문자열 복사
FCString::Strcpy(LogCharArrayWithSize, LogCharString.Len(), *LogCharString); //마지막에 버퍼 지정
//문자열 비교 함수 Contains(), 문자열 찾는 함수 Find(), 문자열 자르는 함수 Mid()
if (LogCharString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase)) //대소문자 구분없이 비교 (대소문자 구분해서 비교는 CaseSensitive)
{
int32 Index = LogCharString.Find(TEXT("unreal"), ESearchCase::IgnoreCase); //unreal이라는 단어가 몇번째 index에 있는지 찾기
FString EndString = LogCharString.Mid(Index); //Mid(): Returns the substring from Start position to the end
UE_LOG(LogTemp, Log, TEXT("Find Test: %s"), *EndString);
}
//문자열 자르는 함수2 Split() - 지정 문자를 기준으로 잘라서 문자열 두개를 반환
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.141592;
FString FloatIntString = FString::Printf(TEXT("Int:%d, Float:%f"), IntValue, FloatValue);
FString FloatToString = FString::SanitizeFloat(FloatValue);
FString IntToString = FString::FromInt(IntValue);
UE_LOG(LogTemp, Log, TEXT("%s"), *FloatIntString);
UE_LOG(LogTemp, Log, TEXT("Int:%s, Float:%s"), *IntToString, *FloatToString);
//FloatToString -> int 변환
int32 FloatStringToInt = FCString::Atoi(*FloatToString);
UE_LOG(LogTemp, Log, TEXT("FloatToString -> int: %d"), FloatStringToInt);