FString

Windows
MacOS
Linux

FName 이나 FText 와는 달리, FString 은 조작이 가능한 유일한 스트링 클래스입니다. 대소문자 변환, 부분문자열 발췌, 역순 등 사용가능한 메서드는 많습니다. FString 은 검색, 변경에 다른 스트링과의 비교도 가능합니다. 그러나 바로 그것이 FString 이 다른 불변의 스트링 클래스보다 비싸지는 이유입니다.

FString 만들기

FString TestHUDString = FString(TEXT("This is my test FString."));

변환

String 변수

From FString

에서

으로

예제

FString

FName

TestHUDName = FName(*TestHUDString);

FString -> FName 은 손실성 변환이라 위험합니다. FName 은 대소문자를 구분하지 않기 때문입니다.

FString

FText

TestHUDText = FText::FromString(TestHUDString);

FString -> FText 은 가능한 경우도 있지만, FString 의 내용이 FText 의 "자동 현지화" 혜택을 받지 못할 수 있음에 유념해 주시기 바랍니다.

To FString

에서

으로

예제

FName

FString

TestHUDString = TestHUDName.ToString();

FText

FString

TestHUDString = TestHUDText.ToString();

FText -> 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::Printf() 함수에 적합한 인수를 곁들어 사용하면 됩니다.

FString 에서

FString 에서 intfloat 숫자 변수로의 변환은 물론, 부울 변수로의 변환도 존재합니다.

변수 유형

스트링에서 변환

참고

bool

TestHUDString.ToBool();

Converts a string into a boolean value 1, "True", "Yes", GTrue, GYes, and non-zero integers become true 0, "False", "No", GFalse, GNo, and unparsable values become false.

int

FCString::Atoi(*TestHUDString);

float

FCString::Atof(*TestHUDString);

비교

오버로딩된 == 연산자를 사용해서 두 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 오브젝트에 덧붙입니다.

StringResult += AddedString;

+

새 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 은 뷰포트 에 출력할 수도, 디버깅 용으로 출력 로그 에 출력할 수도 있습니다.

뷰포트에 출력

DebugToScreen.png

디버그 메시지를 뷰포트 에 출력하려면 UEngine::AddOnScreenDebugMessage() 를 사용합니다. 이 함수는 다음의 네 파라미터를 (순서대로) 받습니다:

파라미터 이름

파라미터 유형

설명

Key

int

같은 메시지가 여러번 추가되지 않도록 하기 위한 고유 키입니다. 디버그 메시지를 트랜션트(휘발성으)로 만들려면 키 값을 -1 로 사용합니다.

TimeToDisplay

float

메시지를 얼마나 오래 표시할 것인지, 초 단위입니다.

DisplayColor

FColor

표시되는 텍스트의 색입니다.

DebugMessage

FString

표시할 메시지 (FString) 입니다.

예:

GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TestHUDString);

출력 로그에 출력

DebugToLog.png

UE_LOG 는 파라미터에 printf 마크업을 사용합니다.

UE_LOG(LogClass, Log, TEXT("This is a testing statement. %s"), *TestHUDString);
  • LogClass 는 로그 카테고리입니다. (OutputDevices.hDECLARE_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));

Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼