언리얼 구조체
- 데이터 저장/전송에 특화된 가벼운 객체
- 대부분 GENERATED_BODY 매크로 선언
- 리플렉션, 직렬화와 같은 유용한 기능 지원
- GENERATED_BODY를 선언한 구조체는 UScriptStruct 클래스로 구현
- 이 경우 제한적으로 리플렉션 지원
- 속성 UPROPERTY만 선언 가능
- 함수 UFUNCTION 선언 불가
- 언리얼 엔진의 구조체 이름은 F로 시작
- 대부분 힙 메모리 할당 없이 스택 내 데이터로 사용
- NewObject API 사용 불가
https://docs.unrealengine.com/5.3/ko/structs-in-unreal-engine/
- 멤버 프로퍼티를 체계화 및 조작할 수 있는 데이터 구조체
- UStruct는 UProperty를 지원하지만 가비지 컬렉션 시스템에 의해 관리되지 않으며 UFunction 함수를 제공할 수 없음
- 언리얼 리플렉션 시스템과 블루프린트 스크립팅에 표시되도록 구조체의 멤버 변수에 UProperty 태그를 지정할 수 있음
팁
- UStruct는 언리얼 엔진의 포인터를 사용해서 멤버 변수로 쓸 수 있는데 UPROPERTY 매크로를 반드시 지정해줘야 UObject가 제거되는 것을 방지하는 등의 메모리 관리가 가능
- 구조체는 단순한 데이터 타입에 적합
- 복잡한 인터렉션을 하기 위해서는 UObject 나 AActor를 이용하는 것이 좋음
- 언리얼 엔진에서는 UObject와 구조체의 사용 용도가 크게 다름
- C++에서는 Class와 Struct의 차이가 크지 않음
- UStruct는 리플리케이션용으로 간주되지 않음
- 접두사가 F (단순 C++처럼 취급)
- 멤버 변수의 경우 UProperty 변수는 리플리케이션용으로 간주
- 언리얼 엔진에는 구조체를 위한 Make 및 Break 함수 자동 생성 기능이 있음
TMap
- STL map
- 이진 트리로 구성
- 정렬 지원
- 메모리 구성 효율 x
- 데이터 삭제 시 재구축
- 자료 순회 적합 x
- 언리얼 TMap
- key, value의 튜플 데이터의 TSet 구조로 구현
- TSet과 내부 구조가 같다고 보면 됨
- TMultiMap을 사용하면 중복 데이터 관리 가능
- STL unordered_map과 유사
- key, value 쌍이 필요한 자료구조에 광범위하게 사용
https://docs.unrealengine.com/5.3/ko/map-containers-in-unreal-engine/
- 언리얼 엔진 에서 TArray (배열) 다음으로 가장 자주 사용되는 컨테이너
- 기존과 일치하는 key로 TMap에 넣으면 새 값으로 대체
- 기존과 일치하는 key로 TMultiMap에 넣으면 새 값으로 추가
- 실제 TPair< KeyType, ElementType > 로, TPair 유형을 직접 가리키는 것은 드묾
- 동질성 컨테이너
- 해시 컨테이너라서, 기본적으로 키 유형은 반드시 GetTypeHash 를 지원하고 키의 동일성 비교를 위한 operator== 가 제공돼야 함
맵 만들고 채우기
- 전반적인 함수 구성은 TSet과 유사
- UPROPERTY 매크로와 편집가능 키워드 (EditAnywhere, EditDefaultsOnly, EditInstanceOnly) 중 하나를 마킹하면, 언리얼 에디터에서 엘리먼트 추가 및 편집 가능
반복처리
- key와 value로 가져오면 됨
쿼리
- Set과 유사
- FindKey를 통해 값으로 key를 찾을 수 있음
- 느리고 값이 같은 키가 여러 개면 어떤 키를 반환하는지 알 수 없음
제거, 소팅, 연산자, 슬랙
- Set과 유사
KeyFuncs
- 해당 문서 참고
- 예) 고유 ID가 있는 구조체들이 있는데 고유 ID 외에는 모두 같으면 같은 구조체로 설정하고 싶다면 따로 만들어서 지정해주면 됨
TArray vs TSet vs TMap vs TMultiMap
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)
- TArray
- 빈틈없는 메모리
- 가장 높은 접근성능
- 가장 높은 순회성능
- TSet
- 빠른 중복 감지
- TMap
- 중복 불허
- key, value 관리
- TMultiMap
- 중복 허용
- key, value 관리