Game Programming/UE4

[UE4] TArray

Doanie 2023. 9. 2. 21:09

[UE4] TArray


TArray

 TArray 는 UE4 에서 가장 자주 쓰이는 컨테이너 클래스로, 신속성, 메모리 효율성, 안전성을 염두에 두고 디자인되었습니다. TArray 유형은 두 가지 프로퍼티로 정의되는데, 주로 그 엘리먼트(element) 유형, 부로 할당자(allocator) 입니다.

더보기

엘리먼트 유형

배열에 저장되는 유형으로 동질성을 가지고 있어 다른 유형의 엘리먼트를 하나의 TArray에 저장할 수 없다.

할당자 유형

메모리에 오브젝트가 레이아웃되는 방식으로, 배열에 엘리먼트를 넣어 키우는 방식이다. 엘리먼트가 추가될 때마다

필요에따라 메모리를 제공한다.

생성 및 할당

//. 생성
TArray<int32> intArr; // 자료형<엘리먼트의 자료형> 변수명

//. Init
intArr.Init(3, 5);	// {3, 3, 3, 3, 3}, 3의 복사본을 5개 할당

//. Add
stringArr.Add(TEXT("first"));
stringArr.Add(TEXT("second")); // {first, second}} 엘리멘트 유형의 인스턴스를 배열에 복사한다.

//. Emplace
stringArr.Emplace(TEXT("first"));
stringArr.Emplace(TEXT("second")); // {first, second} 지정한 인수를 사용하여 엘리멘트 유형을 새로 생성한다.

위에서 보면 Add와 Emplace는 최종 결과 {first, second} 는 같지만 Emplace는 임시 변수를 생성하지 않는다. 즉, Emplace는 Add와 달리 불필요한 복사, 이동이 없어서 퍼포먼스적으로 바람직하다고 할 수 있다.

//. Append : TArray 또 일반 C 배열로의 포인터 및 해당 배열의 크기에 다수의 엘리먼트를 한꺼번에 추가
TArray<int32> arr01;
arr01.Add(1);
arr01.Add(2);

TArray<int32> arr02;
arr02.Append(arr01);	// {1, 2}

FString strArr01[] = {TEXT("One"), TEXT("Two")};
TArray<FString> strArr02(strArr01, ARRAY_COUNT(strArr01)); // {"One", "Two"}

//. AddUnique
TArray<FString> strArr;
strArr.AddUnique(TEXT("OnlyOne"));	// {"OnlyOne"}
strArr.AddUnique(TEXT("OnlyOne"));	// {"OnlyOne"}, 동일한 값이 존재하면 추가 X 새 값만 추가 O

//. Insert
strArr.Insert(TEXT("FirstNum"), 1);	// {"FirstNum", "OnlyOne"}, 지정한 위치에 값을 추가

//. SetNum
strArr.SetNum(4);	// {"FirstNum", "OnlyOne", "", ""}, TArray의 크기를 설정
strArr.SetNum(1);	// {"FirstNum"}, 기존 배열보다 작을 경우 제거하기도 한다.

 반복

for 반복을 사용하는 것을 권장한다.

TArray<FString> strArr;
strArr.Emplace(TEXT("I"));
strArr.Emplace(TEXT("like"));
strArr.Emplace(TEXT("apple"));

//. 01
FString strings01;
for(auto& str : strArr)
{
	strings01 += str;
    strings01 += TEXT(" ");
}	// "I like apple"

//. 02
FString strings02
for(int32 i = 0; i < strArr.Num(); ++i)
{
	strings02 += strArr[i];
    strings02 += TEXT(" ");
} // "I like apple"

//. 03
FString strings03
for(auto it = strArr.CreateConstIterator(); it; ++it)
{
	strings03 += *it;
    strings03 += TEXT(" ");
} // "I like apple"

제거

TArray<int32> intArr;
int32 Temp[] = {1, 2, 3, 4, 5};
intArr.Append(Temp, ARRAY_COUNT(Temp)); // {1, 2, 3, 4, 5}

//. Remove
intArr.Remove(4);	// {1, 2, 3, 5}, 4값을 제거한다

//. RemoveAt
intArr.RemoveAt(2);	// {1, 2, 5}, 2번째값을 제거한다

//. Empty
intArr.Empty();		// {}, 모든 값을 제거한다.

그 외 자주 사용하는 것

TArray<int32> valueArr = {6, 2, 1, 4, 3, 5};

//. Num : TArray의 엘리먼트의 개수를 반환
int32 count = valueArr.Num();	// count == 6;

//. Contains : 특정 엘리먼트가 있는지 확인
bool bHaveOne = valueArr.Contains(1);	// bHaveOne == true;
bool bHaveSeven = valueArr.Contains(7);	// bHaveSeven == false;

//. Find : 특정 엘리먼트를 찾고 인덱스를 반환
int32 findOne = value.Find(1);			// findOne == 2;
int32 findSeven = value.Find(7);		// findSeven == INDEX_NONE;

//. Sort : 정렬
value.Sort();	// {1, 2, 3, 4, 5, 6}

TArray에 자주 사용하는 것들에 관해서 정리하였습니다. 

'Game Programming > UE4' 카테고리의 다른 글

[UE4] BindWidget  (0) 2023.10.28
[UE4] Smart Pointer  (0) 2023.10.21
[UE4] Delegate  (0) 2023.09.17
[UE4] TMap  (0) 2023.09.09
[UE4] Log  (0) 2022.10.13