Choose your operating system:
Windows
macOS
Linux
FName 이나 FText 와는 달리, FString 은 조작이 가능한 유일한 스트링 클래스입니다. 대소문자 변환, 부분문자열 발췌, 역순 등 사용가능한 메서드는 많습니다. FString 은 검색, 변경에 다른 스트링과의 비교도 가능합니다. 그러나 바로 그것이 FString 이 다른 불변의 스트링 클래스보다 비싸지는 이유입니다.
FString 만들기
FString TestHUDString = FString(TEXT("This is my test FString."));
변환
String 변수
From FString
에서 |
으로 |
예제 |
---|---|---|
FString |
FName |
FString -> FName 은 손실성 변환이라 위험합니다. FName 은 대소문자를 구분하지 않기 때문입니다. |
FString |
FText |
FString -> FText 은 가능한 경우도 있지만, FString 의 내용이 FText 의 "자동 현지화" 혜택을 받지 못할 수 있음에 유념해 주시기 바랍니다. |
To FString
에서 |
으로 |
예제 |
---|---|---|
FName |
FString |
|
FText |
FString |
FText -> FString 은 안전하지 않습니다. 일부 언어에서는 변환시 손실될 위험이 있습니다. |
숫자 및 기타 변수
FString 으로
변수 유형 |
스트링에서 변환 |
스트링 포맷 |
---|---|---|
float |
|
|
int |
|
|
bool |
|
'true' 거나 'false' 거나 |
FVector |
|
'X= Y= Z=' |
FVector2D |
|
'X= Y=' |
FRotator |
|
'P= Y= R=' |
FLinearColor |
|
'(R=,G=,B=,A=)' |
UObject |
|
UObject 의 FName |
다른 숫자 변환의 경우, FString::Printf()
함수에 적합한 인수를 곁들어 사용하면 됩니다.
FString 에서
FString
에서 int
나 float
숫자 변수로의 변환은 물론, 부울 변수로의 변환도 존재합니다.
변수 유형 |
스트링에서 변환 |
참고 |
---|---|---|
bool |
|
|
int |
|
|
float |
|
비교
오버로딩된 ==
연산자를 사용해서 두 FString 을 비교하거나, 하나의 FString 과 TCHAR*s 배열을 비교할 수 있습니다. FString::Equals()
메서드도 있는데, 검사 대상
FString 과, 비교시 대소문자를 무시할 것인지를 나타내는 ESearchCase
Enum 을 받습니다. 대소문자 상관없는 비교를 하려는 경우 ESearchCase::IgnoreCase
를,
아닌 경우 ESearchCase::CaseSensitive
를 사용합니다..
TestHUDString.Equals(TEXT("Test"), ESearchCase::CaseSensitive);
검색
FString 안에서 검색을 할 때는, 두 가지 검색 유형이 있습니다. 첫째, FString::Contains()
는 서브스트링을 찾은 경우 true 를, 아니면 false 를 반환합니다. FString::Contains()
의 검색 대상은
FString
거나 TCHAR*
의 서브스트링입니다. ESearchCase
Enum 을 사용해서 검색시 대소문자를 무시할 것인지를 지정할 수 있습니다. 또한, ESearchDir
Enum 을 사용해서는
검색 방향을 지정할 수 있습니다. 검색 기본값은 대소문자 무시이며, 처음서부터 시작합니다.
TestHUDString.Contains(TEXT("Test"), ESearchCase::CaseSensitive, ESearchDir::FromEnd);
둘째, FString::Find()
는 처음 찾은 서브스트링 인스턴스의 인덱스를 반환합니다. FString::Find()
의 검색 대상은 FString
또는 TCHAR*
의 서브스트링입니다. FString::Contains()
와 마찬가지로,
대소문자 구분 여부와 검색 방향을 지정할 수 있으며, 기본값은 대소문자 무시에 처음서부터 검색입니다. 또다른 옵션으로는,
스트링 안에서 검색을 시작할 인덱스를 지정할 수도 있습니다. FString::Find()
이 서브스트링을 찾지 못하는 경우, -1 을 반환합니다.
TestHUDString.Find(TEXT("test"), ESearchCase::CaseSensitive, ESearchDir::FromEnd, 10);
FString 조립하기
서브스트링이나 다른 변수 유형으로부터 스트링을 조립하는 메서드는 두 가지 있습니다. 첫째, 접합(concatenation)은 FString 만을 인수로 받습니다. 다른 변수 유형은 FString 으로 변환을 해 줘야
접합시킬 수 있습니다. 둘째, Printf
는 int 나 float 같은 숫자 입력을 받을 수 있으며, 스트링에 추가시킬 입력 형식을 설정할 수도 있습니다.
접합
스트링 접합 연산자는 두 가지입니다:
연산자 |
설명 |
사용법 |
---|---|---|
|
제공된 스트링을 FString 오브젝트에 덧붙입니다. |
|
|
새 FString 오브젝트를 만들어 제공된 스트링을 덧붙입니다. |
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 함수 전체 목록은 UnrealString.h
또는 FString 관련 API 문서를 참고해 주시기 바랍니다.
스트링 서브섹션 복사를 위한 함수는 Left
, Right
, Mid
가 있습니다. 지정된 서브섹션 위치를 기준으로 스트링을 둘로 분할시킬 수 있습니다.
그 작업은 Split
메서드를 통해 이루어집니다. 스트링 분할을 위한 또다른 메서드는 ParseIntoArray
로, 스트링을 지정된 구분자마다 스트링 배열에 분할시킵니다.
대소문자 변환은 ToUpper
, ToLower
를 통해 이루어지며, 각각 스트링을 대문자, 소문자로 변환시킵니다.
HUD 의 FString
캔버스
캔버스 를 사용해서 HUD 에 FString 을 표시하려면, FCanvas::DrawText()
함수를 호출합니다:
Canvas->DrawText(BigFont, TestHUDString, 110.0f,110.0f);
DrawText()
함수의 호출은 HUD 클래스의 DrawHUD()
함수 안에서, 또는 DrawHUD()
로 시작하는 함수 체인에서 해 줘야 합니다.
디버그 메시징
FString 은 뷰포트 에 출력할 수도, 디버깅 용으로 출력 로그 에 출력할 수도 있습니다.
뷰포트에 출력
디버그 메시지를 뷰포트 에 출력하려면 UEngine::AddOnScreenDebugMessage()
를 사용합니다. 이 함수는 다음의 네 파라미터를 (순서대로) 받습니다:
파라미터 이름 |
파라미터 유형 |
설명 |
---|---|---|
Key |
int |
같은 메시지가 여러번 추가되지 않도록 하기 위한 고유 키입니다. 디버그 메시지를 트랜션트(휘발성으)로 만들려면 키 값을 -1 로 사용합니다. |
TimeToDisplay |
float |
메시지를 얼마나 오래 표시할 것인지, 초 단위입니다. |
DisplayColor |
FColor |
표시되는 텍스트의 색입니다. |
DebugMessage |
FString |
표시할 메시지 (FString) 입니다. |
예:
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TestHUDString);
출력 로그에 출력
UE_LOG
는 파라미터에 printf
마크업을 사용합니다.
UE_LOG(LogClass, Log, TEXT("This is a testing statement. %s"), *TestHUDString);
LogClass
는 로그 카테고리입니다. (OutputDevices.h
에DECLARE_LOG_CATEGORY_EXTERN
으로 설정된) 기존 카테고리를 사용할 수도, DEFINE_LOG_CATEGORY_STATIC 을 사용해서 자체적으로 정의할 수도 있습니다.Log
는 상세도입니다. 상세도는ELogVerbosity
Enum 에 정의됩니다. 가능한 값은Fatal
,Error
,Warning
,Display
,Log
,Verbose
,VeryVerbose
입니다.다음 인수는 출력하고자 하는 텍스트로, 파라미터 마크업 포함입니다.
이 예제에서는 %s
파라미터를 사용하기에, %s
파라미터에 필요한 TCHAR*
반환에 *
연산자가 사용되었습니다.
UE_LOG
로 출력된 메시지는 출력 로그 (언리얼 에디터에서 창 > 출력 로그) 에서 확인할 수 있습니다.
인코딩 변환 매크로
FString 클래스는 TCHAR 의 TArray 로 만들어져 있습니다. 응용 스트링 (TCHAR*) 을 ANSI 또는 UNICODE 캐릭터 세트로 변환하거나, 그 반대로 변환하는 매크로는 여럿 있습니다. 매크로 정의는 `Engine\Source\Runtime\Core\Public\Containers\StringConv.h` 에서 찾을 수 있습니다.
상대적으로 작은 스트링이라면, 할당은 변환 클래스의 일환으로 스택에서 이루어지나, 큰 스트링이라면 임시 버퍼 할당에 힙이 사용됩니다. 어느 크기까지 스택을 사용할지는 템플릿 파라미터로 결정되므로, 알맞게 조정해 주면 됩니다. 클래스 영역은 스택 할당에서 팝핑되므로 루프 안에서는 안전합니다.
자주 쓰이는 변환 매크로는 다음과 같습니다:
TCHAR_TO_ANSI
- 엔진 스트링 (TCHAR*) 을 ANSI 로 변환합니다.ANSI_TO_TCHAR
- ANSI 스트링을 엔진 스트링 (TCHAR*) 으로 변환합니다.
이 매크로에 선언되는 오브젝트는 수명이 매우 짧습니다. 함수의 파라미터용으로 쓰라고 만든 것이기 때문입니다. 변환된 스트링에 변수를 할당할 수는 없는데, 오브젝트가 영역을 벗어나므로 스트링이 해제(release)되기 때문입니다.
전달하는 파라미터는 적합한 스트링이어야 하는데, 파라미터는 포인터로의 형 변환이기 때문입니다. TCHAR* 대신 TCHAR 를 전달한다면, 컴파일은 되어도 실행시간에 크래시가 날 것입니다.
사용법: SomeApi(TCHAR_TO_ANSI(SomeUnicodeString));