언리얼 엔진

[언리얼 엔진] FString, FName, FText 차이 정리

dhlee-dev 2026. 6. 10. 22:03

언리얼 엔진에서 문자열을 다루다 보면 FString, FName, FText를 상황에 따라 다르게 사용하는 것을 볼 수 있다.

처음에는 모두 문자열처럼 보이는데 왜 여러 타입으로 나누어 사용하는지 조금 복잡하게 느껴졌다.

예를 들어 FString::Printf(TEXT("")), FText::FromString(TEXT("")) 같은 코드를 처음 볼 때는
왜 이렇게 문자열을 다루는지 헷갈리고 애매했다.

하지만 FString, FName, FText를 찾아서 공부해보니 왜 이렇게 사용하는지 알게 되었고,
각 문자열 타입마다 사용 목적이 다르다는 것을 알게 되었다.

이번 글에서는 언리얼 엔진의 대표적인 문자열 타입인
FString, FName, FText의 차이와 사용 기준을 간단히 정리해보려고 한다.


FString

FString은 언리얼에서 문자열을 직접 수정하거나 조작할 때 사용하는 타입이다.
세 타입 중에서 문자열 수정, 병합, 검색, 파싱이 가장 자유롭다.

FString PlayerName = TEXT("Player");
PlayerName += TEXT("_01");

FString은 실제 문자열 데이터를 가지고 있기 때문에 직접 문자열을 다루기에는 편하다.
대신 문자열을 복사하거나 조작하는 비용이 상대적으로 클 수 있다.

그래서 보통 다음과 같은 경우에 사용한다.

  • 문자열 조합
  • 문자열 검색
  • 문자열 파싱
  • 파일 입출력
  • 로그 출력

즉, 문자열을 직접 다뤄야 한다면 FString이 적합하다.


FName

FName은 이름이나 식별자로 사용되는 문자열 타입이다.

FName은 내부 이름 테이블에 문자열을 저장하고, 실제 비교는 문자열 전체가 아니라 인덱스 기반으로 처리한다.
그래서 같은 이름을 반복해서 사용할 때 비교 속도가 빠르고,
문자열을 매번 따로 저장하는 방식보다 효율적으로 다룰 수 있다.

FName SocketName = TEXT("WeaponSocket");

FName의 특징은 다음과 같다.

  • 식별자 용도로 사용한다.
  • 대소문자를 구분하지 않는다.
  • 생성된 뒤 변경할 수 없다.
  • 비교 속도가 빠르다.
  • 에셋 이름, 본 이름, 소켓 이름 등에 자주 사용된다.

예를 들어 스켈레탈 메시의 본 이름이나 소켓 이름처럼 자주 비교해야 하는 값은 FName으로 다루기 좋다.
다만 FName은 대소문자를 구분하지 않기 때문에 대소문자 정보가 중요한 문자열에는 적합하지 않을 수 있다.


FText

FText는 UI에 표시되는 텍스트에 사용하는 타입이다.
가장 중요한 특징은 현지화를 지원한다는 점이다.

따라서 FText는 단순 문자열이라기보다 사용자에게 보여줄 텍스트를 표현하기 위한 타입에 가깝다.

FText DisplayText = FText::FromString(TEXT("Start Game"));

다만 FText::FromString()으로 만든 텍스트가 자동으로 현지화되는 것은 아니고,
여기서는 FText 타입을 만드는 간단한 예시이다.

예를 들어 다음과 같은 값은 FText로 다루는 것이 적합하다.

  • UI 버튼 텍스트
  • 아이템 설명
  • 대사
  • 안내 문구

FText는 현지화 정보를 가질 수 있기 때문에 단순 문자열처럼 ==로 비교하는 것은 적합하지 않다.
또한 FTextFString으로 변환하면 표시되는 문자열은 얻을 수 있지만, 현지화 관련 정보는 손실될 수 있다.


FString, FName, FText 비교

세 타입을 비교하면 다음과 같다.

구분 FString FName FText
주요 목적 문자열 조작 이름 식별자 UI 표시 텍스트
수정 가능 여부 가능 불가능 직접 조작용 아님
비교 비용 상대적으로 큼 빠름 단순 문자열 비교에 부적합
현지화 지원하지 않음 지원하지 않음 지원
사용 예시 파싱, 로그, 파일 입출력 에셋 이름, 본 이름, 소켓 이름 UI 텍스트, 대사, 설명

간단히 정리하면 다음과 같다.

  • FString: 문자열을 수정하거나 조작할 때
  • FName: 이름이나 식별자로 사용할 때
  • FText: 사용자에게 보여줄 텍스트를 다룰 때

복사 비용

복사 비용은 대략 다음과 같이 볼 수 있다.

FString은 실제 문자열 데이터를 복사할 수 있기 때문에 비용이 상대적으로 크다.

반면 FName은 내부 이름 테이블의 인덱스와 번호를 복사하는 방식에 가깝기 때문에 비용이 저렴하다.

FText도 내부 데이터를 공유 참조 형태로 관리하기 때문에 단순 복사 자체는 비교적 저렴하다.

다만 FText는 현지화 정보를 가진 타입이므로 복사 비용만 보고 아무 곳에나 사용하면 안 된다.


GC 대상인가?

FString, FName, FTextUObject 계열 클래스가 아니다.
따라서 이 타입들 자체가 언리얼 GC의 대상이 되는 것은 아니다.

다만 UPROPERTY로 선언하면 리플렉션 시스템에 등록할 수 있다.

UPROPERTY(EditAnywhere)
FString PlayerName;

UPROPERTY(EditAnywhere)
FName ItemID;

UPROPERTY(EditAnywhere)
FText DisplayName;

즉, UPROPERTY로 에디터에 노출하거나 직렬화 대상으로 만들 수는 있지만,
UObject 계열 클래스가 아니기 때문에 GC가 생명주기를 관리하는 대상은 아니다.


문자열 변환

세 타입은 서로 변환할 수 있다.
다만 변환 과정에서 정보가 손실될 수 있으므로 주의해야 한다.

FName Name = TEXT("Player");
FString StringValue = Name.ToString();
FString StringValue = TEXT("Player");
FName Name = FName(*StringValue);

FStringFName으로 변환할 수는 있지만,
FName은 대소문자를 구분하지 않으므로 대소문자 정보가 중요한 경우 주의해야 한다.

FString StringValue = TEXT("Start Game");
FText TextValue = FText::FromString(StringValue);

FStringFText로 변환할 수는 있지만, 이렇게 만든 FText가 자동으로 현지화되는 것은 아니다.

FText TextValue = FText::FromString(TEXT("Start Game"));
FString StringValue = TextValue.ToString();

FTextFString으로 변환하면 표시 문자열은 얻을 수 있으나,
현지화 정보는 손실될 수 있다.

FText에서 FName으로 바로 변환하는 함수는 제공되지 않는다.
필요하다면 FTextFString으로 변환한 뒤, 다시 FName으로 변환해야 한다.


TEXT 매크로

언리얼 C++에서 문자열 리터럴을 사용할 때는 보통 TEXT() 매크로로 감싸서 사용한다.

FString Name = TEXT("Player");
FName SocketName = TEXT("WeaponSocket");

C++에서 "Player"처럼 작성한 문자열 리터럴은 일반 문자열 리터럴이다.
하지만 언리얼의 문자열 타입인 FString, FName, FText는 기본적으로 TCHAR 기반 문자열을 사용한다.

TEXT() 매크로는 문자열 리터럴을 언리얼이 사용하는 TCHAR 형식에 맞게 만들어준다.
그래서 언리얼 C++에서 문자열 리터럴을 넘길 때는 TEXT("문자열") 형태로 작성하는 것이 좋다.

정리하면 TEXT()는 단순히 문법적으로 감싸는 것이 아니라,
언리얼 문자열 타입이 기대하는 문자 형식에 맞춰주기 위해 사용하는 매크로라고 볼 수 있다.


정리

FString, FName, FText는 모두 문자열과 관련된 타입이지만 사용 목적이 다르다.

FString은 문자열을 직접 수정하거나 조작할 때 사용한다.
FName은 이름이나 식별자를 빠르게 비교할 때 사용한다.
FText는 사용자에게 보여줄 텍스트와 현지화가 필요한 문자열에 사용한다.

또한 세 타입은 서로 변환할 수 있지만,
변환 과정에서 대소문자 정보나 현지화 정보가 손실될 수 있으므로 주의해야 한다.


마무리

이번에 FString, FName, FText를 정리하면서
언리얼에서 문자열 타입을 구분해서 사용하는 이유를 알게 되었다.

처음에는 모두 문자열처럼 보였지만,
각각 문자열 조작, 이름 식별자, UI 표시 텍스트라는 역할이 나뉘어 있었다.

앞으로 언리얼 C++ 코드를 작성할 때는 단순히 문자열이라는 이유로 아무 타입이나 사용하지 않고,
목적에 맞는 문자열 타입을 선택해야겠다.