언리얼 C++ 프로그래밍

[언리얼 C++] 스트링 처리

언린이 2021. 7. 4. 15:59

언리얼 엔진에서 사용가능한 스트링 클래스는 3가지가 존재합니다.

바로 FName, FText, FString 입니다.

이번 글에서 이 3가지 클래스에 대해 자세힝 알아보도록 하겠습니다.

 

 

1. FName

콘텐츠 브라우저에서 새 애셋 이름을 지을때, 다이내믹 머터리얼 인스턴스의 파라미터를 변경할때, 스켈레탈 메시에서 본에 접근할때, 모두 FName을 사용합니다. FName은 문자열 사용에 있어서 초경량 시스템을 제공하는데, 주어진 문자열이 사용된다 해도 데이터 테이블에 한번만 저장되는 것입니다. 또한, FName은 대소문자를 구분하지 않고 변경도 불가능하여, 조작할 수 없습니다. 이처럼 FName의 정적인 속성과 저장 시스템 덕에 키 값으로 FName에 접근하는 속도가 굉장히 빠릅니다. FName 서브시스템의 또 다른 특징은 스트링에서 FName 변환이 해시 테이블을 사용해서 빠르다는 점입니다.

 

- FName 생성하기

FName TestName = FName(TEXT("MyTestFName"));

위 예제 코드처럼 단순히 FName 클래스로의 타입 변환으로 FName 타입의 객체를 생성할 수 있습니다.

 

- FName 클래스의 비교 기능

두 FName 객체를 비교하는 방법은 두가지가 존재합니다.

바로 == 연산자와 Compare 함수입니다.

 

FName TestName = FName(TEXT("MyTestFName"));
FName OtherName = FName(TEXT("MyTestFName"));
FName AnotherName = FName(TEXT("AnotherTestFName"));

bool bCompare1 = (TestName == OtherName); // true 리턴
bool bCompare2 = (TestName == AnotherName); // false 리턴

== 연산자를 사용해서 두 FName 객체가 같은지 다른지를 비교할 수 있습니다.

위 예제 코드에서처럼 == 연산자는 두 FName 객체가 같다면 true를, 다르다면 false를 반환합니다.

 

FName TestName1 = FName(TEXT("A"));
FName TestName2 = FName(TEXT("B"));
FName TestName3 = FName(TEXT("B"));
FName TestName4 = FName(TEXT("C"));

float CompareFloat1 = TestName2.Compare(TestName1); // 양수 값 반환
float CompareFloat2 = TestName2.Compare(TestName3); // 0 반환
float CompareFloat3 = TestName2.Compare(TestName4); // 음수 값 반환

그리고 FName::Compare 함수를 사용해서 두 FName 객체를 비교할 수도 있는데

현재 객체가 파라미터로 넘겨주는 객체의 값보다 크면 양수, 같으면 0, 작으면 음수를 반환합니다.

 

 

2. FText

FText 클래스는 언리얼 엔진에서 텍스트 지역화의 주요 구성 요소 클래스입니다.

모든 사용자 대면 텍스트는 다음 기능을 제공하여 텍스트 지역화를 지원하므로 FText 클래스를 사용해야 합니다.

- 지역화된 텍스트 리터럴을 생성

- 텍스트 서식(자리 표시자 패턴에서 텍스트)를 생성

- 숫자에서 텍스트를 생성

- 날짜와 시간에서 텍스트를 생성

- 텍스트를 상위 또는 소문자로 만드는 것과 같은 파생된 텍스트를 생성

 

- FText 생성하기

FText text = FText::Format(LOCTEXT("ExampleFText", "You currently have {0} health left."), CurrentHealth);

FText 객체는 FText::Format 함수를 사용하여 생성할 수 있습니다.

위 예제 코드에서 CurrentHealth라는 변수를 사용하여 FText 객체를 생성하였는데, 해당 변수는 {0}의 위치에 들어가게 됩니다. 더 많은 변수를 텍스트에 추가하고 싶다면, {1}, {2} ~ 이런식으로 텍스트에 추가해준 후 해당 위치에 들어갈 변수들을 뒤쪽에 추가해주면 됩니다.

 

- FText 클래스의 비교 기능

FText 클래스는 단순한 문자열보다 복잡하기 때문에 오버로드된 연산자 비교를 지원하지 않습니다.

대신 포함된 미묘한 데이터를 인식하는 비교를 수행하는 여러 기능들을 제공합니다.

 

함수 설명
EqualTo 이 함수는 두 FText 객체가 같은지 다른지를 비교합니다.
같다면 true, 다르다면 false를 반환합니다.
EqualToCaseIgnored 이 함수는 대소문자를 구분하지 않고 두 FText 객체가 같은지 다른지를 비교합니다.
같다면 true, 다르다면 false를 반환합니다.
CompareTo 이 함수는 FText 객체가 다른 FText 객체보다 크다면 양수, 같다면 0, 작다면 음수 값을 반환합니다.
CompareToCaseIgnored 이 함수는 대소문자를 구분하지 않고 FText 객체가 다른 FText 객체보다 크다면 양수, 같다면 0, 작다면 음수 값을 반환합니다.

위 표에 나온 비교 함수들을 사용하여 두 FText 객체를 비교할 수 있습니다.

 

bool bCompare1 = TestName.EqualTo(OtherName); // 대소문자를 구분하며 같은지 다른지를 비교, true나 false 반환
bool bCompare2 = TestName.EqualToCaseIgnored(OtherName); // 대소문자를 구분하지 않으며 같은지 다른지를 비교, true나 false 반환

int32 iCompare1 = TestName.CompareTo(OtherName); // 대소문자를 구분하며 TestName 객체가 크다면 양수, 같다면 0, 작다면 음수 값을 반환
int32 iCompare2 = TestName.CompareToCaseIgnored(OtherName); // 대소문자를 구분하지 않으며 TestName 객체가 크다면 양수, 같다면 0, 작다면 음수 값을 반환

위 예제 코드처럼 표의 비교 함수들을 사용하시면 됩니다.

 

 

3. FString

FString 클래스는 FName이나 FText와는 달리 조작이 가능한 유일한 스트링 클래스입니다. 대소문자 변환, 부분문자열 발췌, 역순 등 사용가능한 함수들이 많습니다. 그리고 FString 클래스는 검색, 변경 및 다른 스트링과의 비교 또한 가능합니다.

 

- FString 생성하기

FString TestString = FString(TEXT("TestString"));

FString 객체는 FName과 마찬가지로 간단한 방식으로 생성할 수 있습니다.

 

- FString 클래스의 비교 기능

두 FString 객체를 비교하는 방법은 여러가지가 존재합니다.

  • 오버로딩된 == 연산자 사용
  • FString 변수와 TCHAR* 배열 비교
  • FString::Equals() 함수 사용

FString::Equals() 함수 사용시에는 ESearchCase Enum 값을 파라미터로 넘겨 대소문자 비교 유무를 설정해줘야 합니다.

대소문자를 구분하지 않으려면 ESearchCase::IgnoreCase를, 대소문자를 구분하려면 ESearchCase::CaseSensitive를 사용합니다.

 

bool bCompare1 = TestString.Equals(OtherString, ESearchCase::IgnoreCase); // 대소문자 구분하지 않음
bool bCompare2 = TestString.Equals(OtherString, ESearchCase::CaseSensitive); // 대소문자 구분

위 예제 코드처럼 FString::Equals() 함수를 사용하시면 되며, 해당 함수는 두 FString 객체가 같다면 true를, 다르다면 false를 반환합니다.

 

- FString 클래스의 검색 기능

  • FString::Contains() 함수 사용

찾고자 하는 문자열이 FString에 존재하면 true를, 존재하지 않는다면 false를 반환합니다.

검색 대상으로 FString과 TCHAR* 배열을 사용할 수 있습니다.

ESearchCase Enum 값으로 대소문자 비교 유무를 설정할 수 있고, ESearchDir Enum 값으로 검색 방향을 지정할 수 있습니다.

 

bool bCompare = TestString.Contains(OtherString, ESearchCase::CaseSensitive, ESearchDir::FromEnd);

위 예제 코드는 TestString의 값에서 OtherString의 값을 찾는데, 대소문자를 구분하고 뒤에서부터 검색하는 코드입니다.

여기서 검색에 성공하면 true를, 실패하면 false를 반환합니다.

 

  • FString::Find() 함수 사용

찾고자 하는 문자열의 처음 인덱스를 반환합니다. 못 찾으면 -1을 반환합니다.

FString::Contains() 함수와 동일하게 대소문자 비교 유무와 검색 방향을 지정할 수 있습니다.

그리고 또 다른 옵션으로 검색 시작 인덱스를 지정할 수 있습니다.

 

int32 iCompare = TestString.Find(OtherString, ESearchCase::CaseSensitive, ESearchDir::FromStart, 10);

위 예제 코드는 TestString 값에서 OtherString의 값을 찾는데, 대소문자를 구분하고 인덱스 10의 위치에서부터 뒤쪽 방향으로 검색하는 코드입니다.

여기서 검색에 성공하면 찾고자 하는 문자열의 처음 인덱스를, 실패하면 -1을 반환합니다.

 

- FString 클래스의 이어 붙이기 기능

FString 객체에 다른 FString 객체를 이어 붙일 수 있습니다.

 

TestString += OtherString;
FString AnotherString = TestString + OtherString;

위 예제 코드처럼 += 연산자나 + 연산자를 사용하여 두 FString 객체를 이어 붙일 수 있습니다.

 

 

4. 스트링 변환

지금까지 언리얼 엔진에서 사용가능한 스트링 클래스 FName, FText, FString에 대해 알아보았습니다.

마지막으로 각각의 클래스 타입에서 다른 클래스 타입으로 변환하는 방법에 대해 알아보겠습니다.

 

From To 예제
FName FString TestString = TestName.ToString();
FName FText TestText = FText::FromName(TestName);
FString FName TestName = FName(*TestString);
FString->FName은 손실성 변환이라 위험합니다. FName은 대소문자를 구분하지 않기 때문입니다.
FString FText TestText = FText::FromString(TestString);
FText FString TestString = TestText.ToString();
FText->FString은 안전하지 않습니다.
일부 언어에서는 변환시 손실될 위험이 있습니다.
FText FName FText에서 FName으로의 직접 변환은 없습니다. 대신, FString을 거친 다음 FName으로 변환하는 방법이 있습니다.
FText->FString->FName은 손실성 변환이라 위험합니다.
FName은 대소문자를 구분하지 않기 때문입니다.

위 표의 예제대로 각각의 스트링 클래스 타입에서 다른 스트링 클래스 타입으로 변환할 수 있습니다.