언리얼 컨테이너 라이브러리 (TMap, TSet)
지난 포스팅에서 언리얼 컨테이너 라이브러리의 정의 및 특징 그리고 STL과의 차이점에 대해 알아보았습니다.
이번시간에는 지난 포스팅에 작성하지 못한 TMap, TSet을 이어서 작성해보도록 하겠습니다.
TSet
- std::set과 유사한 기능을 제공한다.
- 중복된 값을 허용하지 않는다.
- 동적 가변 배열의 형태로 데이터가 이루어져있다.
- 해시 테이블 형태로 해시 기반의 Key데이터가 구축되어있어 빠른 조회가 가능하다.
- 시간복잡도 O(1)를 보장한다.
- 동적 배열 사이에 데이터가 비어있을 수 있다. 순서가 보장되지 않는다.
TSet의 주요 특징은 해당 사항이 있었습니다.
또한 추가 / 제거 / 삽입하는 함수들의 대부분이 TArray와 동일하기 때문에, 그 외 다른 주요 함수들에 대해 알아보겠습니다.
슬랙 (Slack)
- 할당된 메모리에 엘리먼트가 없는것
- Reset() 또는 Empty를 사용하여 메모리 할당 해제 없이 모든 엘리먼트를 제거하여 슬랙을 만들 수 있다.
- TSet을 비우고 엘리먼트 수가 같거나 적은 TSet들을 Append할 시 효율적이다.
정렬 (Sorting)
- 정렬 이후 배열이 수정된다면, 해당 순서를 보장할 수 없다
- Key를 사용해 검색을 해서 시간복잡도가 O(1)이기 때문에 특별한 이유가 없으면 정렬을 하지 않아도 된다.
TMap
- std::unordered_map과 유사한 동작을 가지고 있다.
- TSet과 같이 해시 기반의 Key를 가지고 있어 검색 및 삽입속도가 빠르다.
- Key와 Value 구조로 되어있으며, Key는 중복될 수 없지만, Value는 중복될 수 있다.
- TMultiMap은 중복된 키를 저장할 수 있다.
- TMap은 동일 Key를 사용하면 기존 것에서 대체되며, TMultiMap은 새로 저장한다.
- iterator를 사용하여 모든 키-값을 조회할 수 있다.
- 데이터를 삭제해도 재구축이 일어나지 않는다
- 비어있는 데이터가 있을 수 있다.
KeyFuncs
한 유형에 operator== 와 멤버가 아닌 GetTypeHash 오버로드가 있는 한, 그 유형은 변경 없이 TMap 의 키 유형으로 사용해도 됩니다. 하지만 그 함수 오버로드 없이 유형을 키로 사용하고 싶은 경우가 있습니다. 이러한 경우, 별도의 커스텀 KeyFuncs 를 제공해 주면 됩니다. 키 유형에 대해 KeyFunc 를 만들려면, 다음과 같이 두 개의 typedef 및 세 개의 static 함수 정의가 필요합니다:
- KeyInitType - 키 전달에 사용됩니다.
- ElementInitType - 엘리먼트 전달에 사용됩니다.
- KeyInitType GetSetKey(ElementInitType Element) - 엘리먼트의 키를 반환합니다.
- bool Matches(KeyInitType A, KeyInitType B) - A 와 B 가 동일하면 true, 아니면 false 를 반환합니다.
- uint32 GetKeyHash(KeyInitType Key) - 키의 해시 값을 반환합니다. 보통 외부 GetTypeHash 함수를 호출합니다.
언리얼 공식문서 참조 - https://dev.epicgames.com/documentation/ko-kr/unreal-engine/map-containers-in-unreal-engine
이상으로 언리얼 컨테이너 라이브러리 중 자주 사용하는 TMap, TSet들에 대해서 알아보았습니다.
그 외에도 다양한 자료구조들이 존재하며, 각 자료구조들에 존재하는 함수들에 대해서도 공식문서를 참조하여 알아볼 수 있습니다.
이번학습으로 언리얼 엔진을 사용한 게임 개발시에도 어떤 라이브러리를 사용하는게 효율적인지 알 수 있었습니다.
또한, 언리얼 내부구조에서도 이진 트리형태의 TArray혹은, TMap를 사용하여 이루어져있다는것을 알 수 있었습니다.