2014년 5월 12일

범위 기반 For 루프

저자: * James Golding

언리얼 엔진 4 코드 베이스에서 C++11 에 추가된 몇 가지 멋진 기능을 활용하기로 했습니다. 새 언어를 채택할 때는 주의를 기울여야 하는 것이, 다양한 컴파일러가 지원되는 다양한 범위의 플랫폼을 대상으로 삼기 때문입니다. 제가 자주 사용하는 신기능 중 하나는 'range-based for loop' (범위 기반 for 루프)로, 이제 언리얼의 TArray, TMap, TSet 컨테이너에 작동합니다. 이를 통해 흔히 볼 수 있는 게임 코드가 얼마나 말끔해지는지, 그 예제는 이렇습니다. 기존에는 AActor* 포인터 배열에 대해 반복처리를 하고자 했다면 이렇습니다:

TArray<AActor*> Actors;

for (int32 ActorIndex=0; ActorIndex<Actors.Num(); ActorsIndex++)

{

AActor* Actor = Actors[ActorIndex];

Actor->SetActorLocation(NewLocation);

}

하지만 '범위 기반 for 루프' 문법을 사용하면 이렇습니다:

TArray<AActor*> Actors;

for (AActor* Actor : Actors)

{

Actor->SetActorLocation(NewLocation);

}

얼마나 멋집니까! TMap 예제 하나 더 들어 보자면, 원래는 이랬던 것이:

TMap<AActor*, FMyStruct> ActorStructs;

for (auto ActorStructIt = ActorStructs.CreateIterator(); ActorStructIt; ++ActorStructIt)

{

AActor* Actor = ActorStructIt.Key();

FMyStruct& Data = ActorStructIt.Value();

}

이제 이렇게 됩니다:

TMap<AActor*, FMyStruct> ActorStructs;

for (const auto& Entry : ActorStructs)

{

AActor* Actor = Entry.Key;

const FMyStruct& Data = Entry.Value;

}

참고로 선언하고자 하는 변수에는 'const' 나 '&' 를 붙여줘야 합니다. 예:

TArray<FVector> Positions;

for (FVector& Position : Positions)

{

Position.z += 10.f;

}

FVector 를 복사 아닌 참조를 위해서는 '&' 를 붙여줘야 합니다. 엔진의 모든 for 루프 포맷을 변경하지는 않을테지만, 확실히 앞으로는 이 문법을 많이 사용하게 될 것 같습니다.

이 기능에 대한 여러분의 생각이 어떠한지 듣고 싶고, 질문이 있으시면 답해드리고자 합니다. 트위터 @EpicJamesG 또는 포럼 에서 만나요!