1-3강 기본 타입과 문자열

Ryan Ham·2024년 6월 30일
0

이득우 Unreal

목록 보기
8/23
post-thumbnail

강의 목표

  • 언리얼 환경에서 알아두어야 할 기본 타입과 고려할 점
  • 캐릭터 인코딩 시스템에 대한 이해
  • 언리얼 C++이 제공하는 다양한 문자열 처리 방법과 내부 구성의 이해

왜 언리얼은 기본 타입을 따로 지정하는가?

이식성 관점 : 언리얼 엔진은 다양한 플랫폼에서 작동. 각 플랫폼마다 데이터 타입의 크기나 특성이 다를 수 있다. 예를 들어, int가 어떤 플랫폼에서는 32비트이고 다른 플랫폼에서는 64비트일 수 있다. 언리얼 엔진은 int32, uint32 같은 고정 크기 타입을 사용하여 모든 플랫폼에서 일관된 동작을 보장.

에디터 및 리플렉션 시스템 관점 : 언리얼 엔진의 많은 기능들은 리플렉션(reflection) 시스템에 의존. UPROPERTY 매크로를 사용하여 변수들을 에디터에 노출할 때, 엔진은 자체 데이터 타입을 통해 이러한 변수들을 관리하고 직렬화함. 따라서 언리얼 엔진의 데이터 타입을 사용하면 이러한 기능을 보다 원활하게 활용할 수 있음.


Unreal의 변수 타입들

Bool

bool에 대한 국제적인 표준 규약이 없어서 1byte 크기인 uint8을 쓰고 있지만, 용량을 최적화 하기 위해 bit field operator를 사용해서 1bit로 나타낼 수 있다. 일반 uint8과의 구분을 위해서 ‘b’접두사를 사용한다.

Int

언리얼은 int를 사용하지 않고 int32를 사용한다.

float,double

float와 double은 공통적으로 4byte와 8byte를 사용하기 때문에 따로 float32, double64가 아닌 그냥 vanilla로 “float”, “double”을 사용한다.


언리얼의 문자열 시스템

언리얼은 TCHAR라는 자기만의 문자열 시스템을 가지고 있다.

문자열 처리의 종류

  • Single byte(ASCII, …) : 컴퓨터 초창기
  • Multibyte(EUC-KR, …) : 컴퓨터 보급기
  • Unicode(UTF-8, UTF-16) : 국제 표준 정착기

영어는 사실상 1byte로 표현가능하지만 다른 나라의 언어들은 그렇지 않기 때문에 Unicode라는 것이 등장하게 되었다. 하지만 윈도우 OS를 포함해서 아직도 이런 문자열은 계속 쓰이고 있다. 따라서 Unreal은 TCHAR라는 고유 문자열 시스템을 가지게 된 것.

UTF(Unicode Transformation Format)

UTF-8 : 가변길이 방식. 영문권 국가권에서는 캐릭터당 1byte, 동아시아 국가권에서는 캐릭터당 2byte. 메모리를 적게 사용한다는 장점이 있음.
UTF-16 : 무조건 2byte. 우리가 데이터를 받아올때 균일하게(2byte로) 정렬된 데이터를 받아올 수 있다는 점

Unreal Engine에서의 내부 스트링 표현

모든 String은 FString 혹은 TCHAR 정렬 상태로 UTF-16 format 메모리에 저장된다.
만약 Unreal Engine 소스 코드에 한글을 사용하겠다고 하면 UTF-8 형태로 저장하면 된다.

TCHAR와 FString

GameInstance Class를 상속받은 C++ 클래스에서 테스트 해보기
Project settings -> Maps&Modes에서 GameInstance를 우리가 만든 custom GameInstance로 설정.

항상 명심할 것!
Unreal에서 함수를 overriding할때는 반드시 Super로 부모의 함수를 한번 불러주어야 한다.

문자열을 다양하게 조작하고 싶다면 TCHAR를 사용하는 것이 아니라 FString을 사용하여야 한다.


중간 정리!

Unicode를 사용해 문자열 처리를 통일.

  • 이 중에서 2byte로 사이즈가 균일한 UTF-16을 사용.
  • Unicode를 위한 Unreal 표준 캐릭터 타입 : TCHAR

문자열은 언제나 TEXT macro를 사용해 지정.

  • TEXT macro로 감싼 문자열은 TCHAR 배열로 지정됨.

문자열을 다루는 클래스로 FString를 제공함.

  • FString은 TCHAR 배열을 포함하는 helper 클래스

FString

TCHAR, FString, FCString의 관계

언리얼 엔진에서 TCHAR는 플랫폼 독립적인 텍스트 문자를 의미하며, 주로 유니코드와 ANSI 문자 형식 모두를 지원하기 위해 사용됨. FString은 언리얼 엔진에서 제공하는 문자열 클래스이며, 동적 메모리 할당을 통해 가변 길이의 문자열을 처리하고 다양한 문자열 조작 기능을 제공. FCString은 문자열 작업을 위한 정적 함수들의 집합으로, 주로 TCHAR 배열에 대한 저수준 문자열 조작을 수행.

요약하면, TCHAR는 기본 문자 타입, FString은 고수준 문자열 클래스, FCString은 저수준 문자열 함수 집합으로, 이들은 서로 보완하여 문자열 처리를 효율적으로 수행.


	...
   // FString 예제
   
   // 기본적으로 TEXT()는 TCHAR로 이루어진 배열이다. 
   TCHAR StringArray[] = TEXT("Hello Unreal");
   UE_LOG(LogTemp, Log, StringArray);

   // FString을 UE_LOG로 찍는 방법
   FString TestFString = StringArray;
   UE_LOG(LogTemp, Log, TEXT("%s"), *TestFString);

   // Contains함수와 Find 함수
   if (TestFString.Contains(TEXT("Unreal"), ESearchCase::IgnoreCase))
   {
      int32 index = TestFString.Find(TEXT("Unreal"), ESearchCase::IgnoreCase);
   }

   // Split하는 방법
   FString Left, Right;
   if(TestFString.Split(TEXT(" "), &Left, &Right))
   {
      UE_LOG(LogTemp, Log, TEXT("Splitting string with " ", %s와 %s"), *Left, *Right);
   }

FName 이란??

FName은 Asset 관리를 위해 사용되는 문자열 체계. 그냥 FString으로 저장하면 찾는데 시간이 오래 걸려서 FName을 사용한다고 함.

Unreal System에서는 FName만을 보관하는 Singleton형식으로 되어 있는 global pool을 제공한다. 이 pool(FNamePool)은 key-value로 이루어져 있다. 여기에서 key가 FName에 해당. 이 key값을 사용해서 FNamePool에 있는지 없는지 빠르게 확인할 수 있음.

   FName key1 = TEXT("PELVIS");
   FName key2 = TEXT("pelvis");
   UE_LOG(LogTemp, Log, TEXT("key1와 key2는 서로 %s"), key1 == key2 ? TEXT("같다") : TEXT("다르다"));

profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

0개의 댓글