3냥 집사이면서 게임 개발자입니다.
문자열 사용하기 본문
언리얼 환경에서 TCHAR, FString을 사용해 로그를 띄워봤습니다.
HELLO UNREAL! 이라는 문자열은 기본적으로 TCHAR 형이라는 배열입니다.
배열로 변수를 생성한 뒤 문자열을 출력할 수 있습니다.
TCHAR 배열이 아닌 언리얼에서 제공하는 FString 자료형도 같이 사용해 문자열을 출력했습니다.
UE_LOG 매크로 세 번째 구문에는 항상 배열만 들어가기 때문에 FString을 사용할 수 없고,
%s 에 대응될 때 TCHAR의 Pointer Array를 반환해줘야 하기 때문에 TCHAR* 을 반환하기 위해
FString 변수에 포인터 연산자를 전방에 붙임으로써 문자열 데이터를 가져올 수 있습니다.
복잡한 문자열 처리를 하나로.
- 유니코드를 사용해 문자열 처리를 통일합니다.
- 이 중에서 2byte로 사이즈가 균일한 UTF-16을 사용합니다.
- 유니코드를 위한 언리얼 표준 캐릭터 타입 : TCHAR
- 문자열은 언제나 TEXT 매크로를 사용해 지정합니다.
- TEXT 매크로로 감싼 문자열은 TCHAR 배열로 지정됩니다.
- 문자열을 다루는 클래스로 FString를 제공합니다.
- FString은 TCHAR 배열을 포함하는 헬퍼 클래스입니다.
다양한 함수와 Printf 함수 등을 지원하며 Printf 의 경우 C++ 함수와 같습니다.
FString의 구조와 활용
- 다른 타입에서 FString으로의 변환
- FString::Printf
- FString::SanitizeFloat
- FString::FromInt
- C런타임 수준에서 문자열을 처리하는 클래스 FCString
- 예) 문자열을 찾는 strstr을 사용
- FString에서 다른 타입으로의 변환 ( 안전하지 않으므로 주의 )
- FCString::Atoi
- FCString::Atof
FString 의 경우에는 TCHAR 의 배열로 만들어지는데, 생성할 때 TArray 방식으로 TCHAR 동적 배열로 보관됩니다.
전방에 포인터 연산자를 붙인다면 첫 번째 인자의 포인터를 가리킬 수 있습니다.
FString 자체적으로 다양한 기능을 제공하기 때문에 안에 보관된 데이터를 이용해 자르거나 붙이는 등 연산을 할 수 있습니다.
내부적으로 FCString 이라는 클래스가 존재하는데
일종의 C 라이브러리에서 제공하는 String 함수들을 포함하고 있는 레퍼런스 클래스라고 이해하면 되겠습니다.
언리얼이 제공하는 다양한 문자열 처리
FString 이 주체이며 아래 두 가지 방식으로 처리가 가능합니다.
- FName : 애셋 관리를 위해 사용되는 문자열 체계입니다.
(문자열을 사용하지만 내부적으로는 해쉬값을 사용해 탐색이 빠른게 특징입니다. (해시 테이블 사용)
문자열을 해시 함수로 인덱스화해 키 값으로 사용합니다. 탐색 외에 사용을 권하지 않습니다.)
- 대소문자 구분이 없습니다.
- 한번 선언되면 바꿀 수 없습니다.
- 가볍고 빠르다는 이점이 있습니다.
- 문자를 표현하는 용도가 아닌 애셋 키를 지정하는 용도로 사용합니다. 빌드시 해시값으로 변환됩니다.
- FText : 다국어 지원을 위한 문자열 관리 체계
- 일종의 키로 작용합니다.
- 별도의 문자열 테이블 정보가 추가로 요구됩니다.
- 게임 빌드 시 자동으로 다양한 국가별 언어로 변환됩니다.
FName의 구조와 활용
- 언리얼은 FName과 관련된 글로벌 Pool 자료구조를 가지고 있습니다.
- FName과 글로벌 Pool
- 문자열이 들어오면 해시 값을 추출해 키를 생성해 FName에서 보관합니다.
- FName 값에 저장된 값을 사용해 전역 Pool에서 원하는 자료를 검색해 반환합니다.
- 문자 정보는 대소문자를 구분하지 않고 저장합니다. (Ignore Case)
- FName의 형성
- 생성자에 문자열 정보를 넣으면 풀을 조사해 적당한 키로 변환하는 작업이 수반됩니다.
- Find or Add
FString 에 대한 몇가지 API를 적용한 결과입니다.
FName은 해시 테이블 자료구조를 사용해 구현되었기 때문에 문자열을 해시 함수로 인덱스화 해, 주로 애셋을 탐색할 때 사용합니다.
자주 실행되는 함수 안에서 (Tick() 함수와 같은) FName 변수를 탐색 후 참조하지 않도록 조심해야 합니다.
해당 키가 전역 Pool 에 있는지 계속해서 조사하기 때문에 오버헤드를 야기할 수 있습니다.
결과적으로 FName 에 관련 Key값만 저장되면 되기 때문에, const static 으로 처음 초기화 때 데이터를 저장하고,
Local static 으로 저장했으니 그 다음부터 찾을 일이 없도록 하는 방식이 권장됩니다.
참고 사이트 (언리얼 문서)
https://docs.unrealengine.com/5.1/ko/character-encoding-in-unreal-engine/
https://docs.unrealengine.com/5.1/ko/fstring-in-unreal-engine/
https://docs.unrealengine.com/5.1/ko/fname-in-unreal-engine/
'Unreal Engine 5 > 언리얼 C++' 카테고리의 다른 글
언리얼 오브젝트 리플렉션 시스템 1 (0) | 2023.07.25 |
---|---|
언리얼 오브젝트 (0) | 2023.07.20 |
언리얼 C++ 의 이해 (0) | 2023.07.19 |
언리얼 c++ 코딩 규칙 (0) | 2023.07.19 |
언리얼 C++ 특징 (0) | 2023.07.17 |