3냥 집사이면서 게임 개발자입니다.
언리얼 컨테이너 라이브러리 2 - 구조체와 Map 본문
언리얼 구조체의 선언과 특징 이해, 언리얼 대표 컨테이너 라이브러리인 TMap의 내부 구조 이해,
세 컨테이너 라이브러리의 장단점을 파악하고, 알맞게 활용하는 방법을 정리하고자 합니다.
언리얼 구조체 UStruct
- 데이터 저장/전송에 특화된 가벼운 객체입니다.
- 대부분 GENERATED_BODY 매크로를 선언해줍니다.
- 리플렉션, 직렬화와 같은 유용한 기능을 지원합니다.
- GENERATED_BODY를 선언한 구조체는 UScriptStruct 클래스로 구현됩니다.
- 이 경우 제한적으로 리플렉션을 지원합니다.
- 구조체 멤버변수에 UPROPERTY만 선언할 수 있고 함수 UFUNCTION은 선언할 수 없습니다.
구조체에서 함수를 선언할 수 없다는 점이 언리얼 오브젝트와의 가장 큰 차이점입니다.
- 언리얼 엔진의 구조체 이름은 F 로 시작합니다. (언리얼 엔진이 메모리를 관리해주지 않습니다.)
- 대부분 힙 메모리 할당(포인터 연산)없이 스택 내 데이터로 사용됩니다.
- NewObject API를 사용할 수 없습니다.
구조체를 TArray에서 관리하면 UPROPERTY를 자유롭게 선언할 수 있지만,
TArray 에서 UStudent 언리얼 오브젝트를 관리하는 경우 반드시 UPROPERTY()를 선언해야합니다.
TMap의 구조와 활용
- STL map 과 TMap의 비교
- STL map 의 특징
- set과 동일하게 이진트리로 구성되어있습니다.
- 정렬은 지원하지만, 메모리 구성이 효율적이지 않으며, 데이터 삭제시 재정렬이 일어날 수 있습니다.
- 모든 자료를 순회하는데 적합하지 않습니다.
- 언리얼 TMap 의 특징
- 키, 벨류 구성의 튜플(Tuple) 데이터의 TSet구조로 구현되어 있습니다.
- 동적 배열의 형태로 구축되어 있어 빠른 검색이 가능합니다.
- 데이터는 빠르게 순회할 수 있습니다.
- 데이터는 삭제해도 재구축이 일어나지 않습니다.
- 비어있는 데이터가 있을 수 있습니다.
- TMultiMap을 사용하면 중복 데이터를 허용합니다.
- 동작 원리는 STL unordered_map과 유사합니다.
- 키, 벨류 쌍이 필요한 자료구조에 광범위하게 사용됩니다.
300명의 이름을 만들어서 컨테이너에 저장한 뒤, 컨테이너의 특성에 맞게 잘 작동하는지 확인합니다.
자료구조의 시간 복잡도 비교
TArray | TSet | TMap | TMultiMap | |
접근 | O(1) | O(1) | O(1) | O(1) |
검색 | O(N) | O(1) | O(1) | O(1) |
삽입 | O(N) | O(1) | O(1) | O(1) |
삭제 | O(N) | O(1) | O(1) | O(1) |
빈틈없는 메모리 가장 높은 접근성능 가장 높은 순회 성능 |
빠른 중복 감지 | 중복 불허 키 벨류 관리 |
중복 허용 키 벨류 관리 |
참고 사이트(언리얼 문서)
https://docs.unrealengine.com/5.1/ko/using-structs-in-unreal-cpp/
https://docs.unrealengine.com/5.1/ko/map-containers-in-unreal-engine/
'Unreal Engine 5 > 언리얼 C++' 카테고리의 다른 글
언리얼 오브젝트 관리 1 - 직렬화 (Serialization) (0) | 2023.07.27 |
---|---|
언리얼 엔진의 메모리 관리 (0) | 2023.07.27 |
언리얼 컨테이너 라이브러리 1 - Array, Set (0) | 2023.07.27 |
언리얼 C++ 설계 3 - 델리게이트 (Delegate) (0) | 2023.07.26 |
언리얼 C++ 설계 2 - 컴포지션 (Composition) (0) | 2023.07.26 |