KoreanFoodie's Study

언리얼 문자열 (FName, FString, FText) 클래스 본문

Game Dev/Unreal C++ : Study

언리얼 문자열 (FName, FString, FText) 클래스

GoldGiver 2022. 4. 1. 15:09

언리얼 문자열 클래스

언리얼 문자열 클래스는 3 가지가 있다. (FName, FString, FText) 이 중, 조작이 가능한 클래스는 FString 이다.

참고 - 문자열의 변환 : 출처

FName 은 FName(*FString) 꼴을, FString 은 .ToString( ) 꼴을, FText 는 FText::FromName( ) 꼴을 활용하는 것을 알 수 있다.
기타 세부 구현은 소제목 링크의 문서를 참고하자.

FName

FName 은 콘텐츠 브라우저에서 애셋 이름을 지을 때, 스켈레탈 메시에서 본에 접근할 때 등등에 사용된다. FName 은 문자열을 하나하나 비교하지 않고, 주어진 문자열을 해싱한 테이블에 저장한 후, index 로 값을 비교한다. 이 때문에 키로 FName 에 접근하는 속도가 빠르며, 스트링에서 FName 으로의 변환도 해시 테이블을 사용하므로 상대적으로 빠르다. FName 은 대소문자를 구분하지 않고, 변경도 불가능하다.

// FName 생성
FName TestFName = FName(TEXT("Test FName"));

 

FString

FString 은 조작이 가능한 유일한 스트링 클래스이다.

// FString 생성
FString TestFString = FString(TEXT("TestFString"));

// 뷰포트에 출력
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TestFString);

// 출력 로그에 출력
UE_LOG(MyClass, Log, TEXT("This is %s"), *TestFString);

// Printf 함수도 있다
FString::Printf(TEXT("I am %s and I am at %.2f", *GetName(), GetActorLocation().X);

Printf 함수나 UE_LOG 에 인자로 전달할 경우, FString 을 넘길 때 %s 로 받게되면 * 를 붙여 주소를 넘겨 주어야 한다.

이는 %s 가 TCHAR* 포인터 타입을 받기 때문이다. 즉, TCHAR 타입 배열의 첫번째 원소의 주소를 받는 것인데, 이는 C 에서도 문자열을 넘길 때 char * 을 받으면서 첫번째 원소의 주소를 읽는 것과 동일하다고 생각하면 된다.

FString 은 실제로 TArray<TCHAR> 을 문자열 데이터로 저장하는 Wrapper 클래스라고 생각해도 무방하다. 실제 내부 구현을 보면 다음과 같다 :

class CORE_API FString
{
private:
	friend struct TContainerTraits<FString>;

	/** Array holding the character data */
	typedef TArray<TCHAR> DataType;
	DataType Data;
    
	/* ... */  
    
	/**
	 * Get pointer to the string
	 *
	 * @Return Pointer to Array of TCHAR if Num, otherwise the empty string
	 */
	UE_NODISCARD FORCEINLINE const TCHAR* operator*() const
	{
		return Data.Num() ? Data.GetData() : TEXT("");
	}
}

즉, FString 은 TArray<TCHAR> 을 데이터로 갖고 있으면서, * 를 사용했을 경우 TArray<TCHAR> (실제로는 TCHAR* 배열의 주소) 를 리턴하도록 구현되어 있음을 확인할 수 있다.

 

그리고 TCHAR 은 다음과 같이 정의되어 있다.

/// Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requirements of the licensee.
typedef FPlatformTypes::TCHAR		TCHAR;

 ANSICHAR 또는 WIDECHAR 이라고 되어 있는데, 각각은 다음과 같다 :

문자형 표현 범위 
AnsiChar  1바이트 크기 또는 ASCII 코드 값에 해당하는 문자 
WideChar  2바이트 크기 또는 유니코드(Unicode) 값에 해당하는 문자 
Char  AnsiChar 형과 같음 

 

FText

FText 는 언리얼 엔진에서 text localization 기능을 제공하는 주 컴포넌트이다. FText 는 현지와, 포맷팅 등을 제공하므로, 문자열을 생성할 때 사용한다.
모든 플랫폼에서 2바이트 문자열로 사용할 수 있다.

Comments