본문 바로가기
Unreal Engine

언리얼 엔진 TArray 완전정복 (추가, 삭제, 검색, 주의사항까지)

by 브랑제리 2025. 5. 7.
반응형

TArray는 언리얼 엔진에서 제공하는 가장 대표적인 배열 컨테이너입니다. std::vector와 유사하며, 추가/삭제/검색이 매우 간편해 다양한 게임 시스템에 활용됩니다. 이 글에서는 TArray의 기본 사용법부터 주의사항까지 초보자 기준으로 정리합니다.

1. TArray 기본 사용법 (추가, 삭제)

TArray<int32> Scores;

Scores.Add(100);
Scores.Add(200);
Scores.Insert(150, 1);

Scores.Remove(100);
Scores.RemoveAt(0);
Scores.Empty();

int32 Count = Scores.Num();

주의: RemoveAt() 사용 시 반드시 IsValidIndex로 유효성 체크를 먼저 해야 합니다.

2. TArray 검색 방법 다양하게

TArray<FString> Names = { TEXT("Alice"), TEXT("Bob"), TEXT("Charlie") };

bool bHasBob = Names.Contains(TEXT("Bob"));

int32 Index = Names.IndexOfByKey(TEXT("Charlie"));

FString* Found = Names.Find(TEXT("Bob"));
if (Found)
{
    UE_LOG(LogTemp, Log, TEXT("찾음: %s"), **Found);
}

FString* LongName = Names.FindByPredicate([](const FString& Name) {
    return Name.Len() > 5;
});
if (LongName)
{
    UE_LOG(LogTemp, Log, TEXT("긴 이름: %s"), **LongName);
}

3. TArray 사용 시 주의사항

  • 잘못된 인덱스 접근: IsValidIndex로 항상 확인
  • NULL 포인터 역참조: Find() 후에는 항상 null 체크
  • Remove() 반복문 사용 금지: RemoveAll 또는 --Index로 인덱스 조정 필요
// 안전한 인덱스 접근 예시
if (Scores.IsValidIndex(5))
{
    int32 SafeValue = Scores[5];
}

4. UObject 포인터를 TArray에 담을 때 주의점

TArray<UObject*> 같은 배열을 사용할 경우, 가비지 컬렉션(GC) 추적을 위해 반드시 UPROPERTY()와 함께 선언해야 합니다.

// 예: UObject 포인터 배열
UPROPERTY()
TArray<UActorComponent*> ComponentArray;

void AddToArray(UActorComponent* Comp)
{
    if (Comp)
    {
        ComponentArray.Add(Comp);
    }
}

또한 사용 시에는 항상 IsValid()로 유효성 확인이 필요합니다.

5. FindByPredicate 사용 시 더블 포인터 반환 처리

TArray<UObject*>에서 FindByPredicate를 사용할 경우, 반환 타입은 더블 포인터(예: UObject**)가 됩니다. 이를 올바르게 사용하는 예시는 다음과 같습니다:

// MyActorComponent.h
UPROPERTY()
TArray<UActorComponent*> ComponentArray;

UActorComponent** FoundComp = ComponentArray.FindByPredicate([](UActorComponent* Comp)
{
    return Comp && Comp->GetName().Contains(TEXT("Health"));
});

if (FoundComp && *FoundComp)
{
    UE_LOG(LogTemp, Log, TEXT("찾은 컴포넌트: %s"), *(*FoundComp)->GetName());
}

설명:

  • FindByPredicate()의 반환값은 UActorComponent**
  • 이중 역참조 시에는 *FoundComp가 유효한지 먼저 체크하고, **FoundComp 또는 (*FoundComp)->로 접근해야 함

결론

TArray는 언리얼에서 가장 활용도가 높은 컨테이너입니다. 특히 UObject*를 담는 배열에서는 UPROPERTY() 선언과 유효성 체크, 더블 포인터 처리 등 고유한 주의사항이 따릅니다. FindByPredicate() 사용 시에는 T** 반환 타입을 정확히 이해하고 다루는 것이 중요합니다.

🔗 공식 문서

TArray 공식 문서 (Epic Games)

반응형