Unreal Engine5/KDT 2024

[UE5 KDT2024] 6. TMap, TSet, TQueue

유잉유잉유잉 2025. 2. 18. 00:05
728x90

1. 이론

 

▶️ TArray

: 언리얼에서 제공하는 배열형 자료구조 

  • Num() : array의 갯수 
  • Emplace() : 요소 추가. 생성 추가. 
    • 성능을 위해 Add()대신 Emplace()사용을 권장한다.
  • Add() : 요소 추가. 복사 해서 추가 
  • RemoveAt(int idx) : 해당 인덱스의 요소 제거 
  • Remove(요소) : 해당 요소 삭제. 중복된 값들이 있을 경우 전부 삭제. 
    • 반환값 : 비워진 요소 갯수 반환. 없으면 0 반환 
  • IsEmpty() : 배열 비었는지 확인 
  • Find(요소) : 요소를 찾아서 인덱스를 반환 
    • 중복값이 있을 경우 제일 첫번째 요소로 리턴
    • 없을경우 -1 리턴
  • Contains(요소) : 포함되어 있는지 bool 값 반환 

 

 

 

▶️TMap<Key, value>

언리얼에서 제공하는 hashMap

  • 키값이 겹치면 마지막 입력값으로 덮어씌움. 
  • value는 겹쳐도 입력됨 
  • 함수는 TArray와 동일 
  • Find()시 value를 포인터로 반환

 

 

 

▶️ TSet<Value>

언리얼에서 제공하는 Set

  • 동일한 값을 저장 X
  • Find()시 value를 포인터로 반환

 

 

 

▶️ TQueue<Value>

언리얼에서 제공하는 queue

TQueue는 ThreadSafe. 스레드에서 작동해도 원자성이 보장됨

TSet이나 Tamp은 ThreadSafe하지 않음.

방식은 Lock Free -> 락을 사용하지 않는다 (원자성)

LockFree로 구현하는 큐를 Lock Free Queue라고 부르기도 함.

 

 

▶️ ThreadSafe

멀티 스레드 환경에서 안전하다는 것을 의미

구현 방법이 여러가지

  1. 락을 걸어서 쓰레드 세이프하거나
  2. 락을 안걸고, 원자성(atomic)을 보장해줌. - 스레드가 바꾸지 못하게?



 

 

2. 사용예시

 

▶️ TMap<key, value>

  • Add( key, value ) 
    • 복사하여 추가
  • Emplace( key, value ) : 추가. 
    • 생성하여 추가. 
    • Add()보다 성능이 좋음. 큰차이는 없음.
    • add와 emplace는 동일한 키가 들어올경우, 나중에 들어온 값으로 덮어씌움 
  • Add()와 Emplace() 사용 구분 : 코드 통일하는곳도 있고, 가독성을 위해 add사용하는곳도 있다.
  • Find(키값) : 해당키에 해당하는 값 리턴 
  • Contains(키값) : 해당키에 해당하는 값이 있는지 여부를 bool값으로 반환
  • Num() : 요소 갯수 반환 



 

▶️TSet<타입> 이름

동일한 값을 저장하지 않음. 값을 저장하는 자료구조. 

emplace 진행 후, set에는 1, 2만 존재한다. 

  • Contains(요소) : 해당 value 보유여부 bool값 리턴 
  • Find( 요소 ) : 해당 요소를 찾아서 포인터로 반환. 요소가 포인터라면 이중포인터로 반환된다.
  • Remove(요소) : 요소 삭제  

 

 

 

▶️ TQueue 선입선출 자료구조 

  • Dequeue( 변수 ) : 해당 변수에 삭제될 요소를 가져옴. 가져온 후 삭제.

실행된 뒤 qFoundVal = 1

  • Peek() : 제일 앞 (선입) 요소를 알려준다. 삭제하지 않는다.

실행 후 peekVal, peekVal2 모두 3

 

  • Pop() : 맨앞 요소 삭제. 성공여부 bool값 리턴  
  • IsEmpty() : 비었는지 여부. bool 리턴 

 

✔️ Queue 에서 중요한건 

dequeue() : 가져오고 삭제 o 

Peek() : 가져오고 삭제x  



테스트한 코드 

TArray<int32> arr;
arr.Add( 1 );
arr.Add( 3 );
arr.Add( 5 );
int32 foundVal1 = arr.Find( 1 );
int32 foundVal2 = arr.Find( 2 );

TMap<int32, FString> map;
map.Add( 1, "test" );
map.Add( 1, "test" );
map.Add( 1, "test2" );
map.Add( 2, "test3" );
map.Add( 3, "test3" );
FString* foundVal3 = map.Find( 0 );

TSet<int32> set;
set.Add( 1 );
set.Add( 1 );
set.Add( 2 );
set.Add( 3 );
int32* foundval4 = set.Find( 1 );

TQueue <int32> queue

queue.Enqueue( 1 );
int32* peekVal = queue.Peek();

int32 fff = 0;
queue.Dequeue( fff );

int b = 0;
queue.Dequeue( fff );


728x90