302호 컴퓨터실/언리얼 엔진 5 기초

[UE5] FString은 왜 '*'을 붙여서 읽어야할까?

삼층거주자 2024. 11. 27. 17:21
728x90
반응형

 

1. FString의 구조

  • FString은 언리얼 엔진의 문자열 클래스입니다. 이 클래스는 내부적으로 힙(Heap)에 동적 문자열 데이터를 관리합니다.
  • FString의 핵심은 문자열 데이터를 TArray<TCHAR>를 통해 관리하며, 메모리 관리와 최적화를 위해 다양한 유틸리티 메서드가 포함되어 있습니다.

하지만, FString 자체는 문자열 데이터를 바로 반환하지 않고, 문자열 값을 가리키는 내부 메서드를 제공합니다.


2. C++에서 *의 역할

  • '*'는 C++에서 포인터의 값을 참조하거나 언리얼에서 오버로딩된 특정 연산자를 호출하는 역할을 합니다.
  • FString에서는 * 연산자를 오버로딩하여 내부의 C-Style 문자열 포인터(TCHAR)를 반환하도록 설계되어 있습니다.

오버로딩된 operator*()의 역할

const TCHAR* operator*() const;
  • 이 연산자를 통해 FString의 내부 문자열 데이터(TCHAR 배열)를 직접 접근할 수 있습니다.
FString MyString = TEXT("Hello, Unreal!");
UE_LOG(LogTemp, Log, TEXT("%s"), *MyString);

3. 왜 직접 접근이 아닌 오버로딩 방식을 사용할까?

  • FString은 단순한 문자열 데이터가 아니라 클래스이기 때문에 직접적으로 문자열 데이터를 반환하는 것이 아니라 메서드나 연산자를 통해 데이터를 반환하도록 설계되었습니다.
  • 이 방식은 다음과 같은 장점을 제공합니다:
    1. 메모리 관리: 문자열 데이터는 FString이 관리하며, 외부에서 메모리 할당/해제를 신경 쓸 필요가 없습니다.
    2. 안전성: 문자열 데이터에 대한 읽기/쓰기 작업이 FString 내부 메서드를 통해 제어됩니다.
    3. 최적화: FString 내부에서 데이터 변환 및 캐싱을 통해 성능 최적화를 구현할 수 있습니다.

4. FString의 대안: TEXT 매크로와의 관계

  • 언리얼에서는 TEXT() 매크로를 사용하여 기본적으로 FString과 호환되는 리터럴 문자열을 작성합니다.
  • TEXT와 FString의 결합 덕분에, C++의 문자열 처리보다 더 직관적이고 간편하게 작업할 수 있습니다.

결론

FString에서 *를 사용하는 이유는 내부 문자열 데이터(TCHAR*)를 반환하기 위한 연산자 오버로딩 때문입니다. 이는 C++의 기본 동작과 언리얼 엔진의 메모리 관리 및 최적화 설계 철학에 따른 것입니다.

 

- 만약 * 없이 데이터를 읽으려면 MyString 객체를 직접 사용하지 않고 ToString() 메서드를 호출해야 할 수도 있습니다.

FString MyString = TEXT("Hello, Unreal!");
std::string StdString = MyString.ToString();
반응형