โš™๏ธ ์—”์ง„/๐Ÿซ ์–ธ๋ฆฌ์–ผ

[Unreal] ์–ธ๋ฆฌ์–ผ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ1 - Array์™€ Set

peewoong 2024. 5. 4. 22:57

๐ŸŸฉ ์–ธ๋ฆฌ์–ผ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ์–ธ๋ฆฌ์–ผ ์—”์ง„์ด ์ž์ฒด ์ œ์ž‘ํ•ด ์ œ๊ณตํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์ค„์—ฌ์„œ UCL(Unreal Container Library)๋ผ๊ณ ๋„ ํ•จ
  • ์–ธ๋ฆฌ์–ผ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ ๋‹ค์ˆ˜ ์˜ค๋ธŒ์ ํŠธ ์ฒ˜๋ฆฌ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋จ
  • ์–ธ๋ฆฌ์–ผ C++์€ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•˜๊ณ  ์žˆ์Œ
  • ์‹ค์ œ ๊ฒŒ์ž„ ์ œ์ž‘์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์„ธ ๊ฐ€์ง€๋ฅผ ์ถ”์ฒœํ•จ ๐Ÿ‘‰ TArray, TMap, TSet (T=ํ…œํ”Œ๋ฆฟ)

 

๐ŸŸฉ C++ STL๊ณผ ์–ธ๋ฆฌ์–ผ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐจ์ด์ 

  • C++ STL์€ ๋ฒ”์šฉ์ ์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค.
  • C++ STL์€ ํ‘œ์ค€์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธํ™˜์„ฑ์ด ๋†’๋‹ค.
  • C++ STL์€ ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์—ฎ์—ฌ ์žˆ์–ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ
  • ์–ธ๋ฆฌ์–ผ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์–ธ๋ฆฌ์–ผ ์—”์ง„์— ํŠนํ™”๋˜์–ด ์žˆ์Œ
  • ์–ธ๋ฆฌ์–ผ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์–ธ๋ฆฌ์–ผ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ง€์›ํ•œ๋‹ค.
  • ์–ธ๋ฆฌ์–ผ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐ€๋ณ๊ณ  ๊ฒŒ์ž„ ์ œ์ž‘์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Œ

 

โœจ ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ด๋ฆ„๊ณผ ์šฉ๋„๋Š” ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์Œ

- vector ๐Ÿ‘‰ TArray : ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋‹ด์•„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ

- (set -> x) TSet : ์ค‘๋ณต๋˜์ง€ ์•Š์€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ์„ ๋งŒ๋“œ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ

- (map -> x) TMap : key, value ์กฐํ•ฉ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ


๐Ÿง 1. TArray

  • ๊ฐ€๋ณ€๋ฐฐ์—ด์˜ ์ž๋ฃŒ๊ตฌ์กฐ
  • STL์˜ vector์™€ ๋™์ž‘ ์›๋ฆฌ๊ฐ€ ์œ ์‚ฌํ•จ (๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค)
  • ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
  • ๊ฒŒ์ž„ ์ œ์ž‘์—์„œ๋Š” ๊ฐ€๋ณ€ ๋ฐฐ์—ด ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ
    • ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ  ๋ชจ์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์บ์‹œ ํšจ์œจ์ด ๋†’๋‹ค.
    • ์ปดํ“จํ„ฐ ์‚ฌ์–‘์ด ์ข‹์•„์ง€๋ฉด์„œ, ์บ์‹œ ์ง€์—ญ์„ฑ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์€ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•ด์ง
    • ์ž„์˜ ๋ฐ์ดํ„ฐ์˜ ์ ‘๊ทผ์ด ๋น ๋ฅด๊ณ , ๊ณ ์†์œผ๋กœ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ
  • ๊ฐ€๋ณ€ ๋ฐฐ์—ด์˜ ๋‹จ์ 
    • ๋งจ ๋์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋ณ์ง€๋งŒ, ์ค‘๊ฐ„์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…์€ ๋น„์šฉ์ด ํผ
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๊ฒ€์ƒ‰, ์‚ญ์ œ, ์ˆ˜์ • ์ž‘์—…์ด ๋А๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ ์ˆ˜์˜ ๋ฐ์ดํ„ฐ์—์„œ ๊ฒ€์ƒ‰ ์ž‘์—…์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚œ๋‹ค๋ฉด TArray ๋Œ€์‹  TSet์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

 

๐ŸŒŸ ๋ฐฐ์—ด์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ํ•จ์ˆ˜ : GetData() Iterator

๐ŸŒŸ ๋์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ : Add/Emplace()/Append() += ์—ฐ์‚ฐ์ž

- Add : ์ถ”๊ฐ€ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ–์—์„œ ์ƒ์„ฑํ•œ ๋’ค, ๋ณต์‚ฌํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž… (๊ฐ€๋…์„ฑ์€ Add๊ฐ€ ๋‚˜์Œ)

- Emplace() : TArray ์ž์ฒด์—์„œ ๋ฐ”๋กœ ์ƒ์„ฑ (์กฐ๊ธˆ ๋” ํšจ์œจ์ )

๐ŸŒŸ ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ : Insert()

๐ŸŒŸ ํŠน์ • ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ : []์—ฐ์‚ฐ์ž

 

 

 

DebugGame Editor๋กœ ๋ณ€๊ฒฝ ๐Ÿ‘‰ ๋นŒ๋“œ(Ctrl + F7) ๋ฐ ๋””๋ฒ„๊ทธ(F5)

Watch ์ฐฝ์— value๊ฐ€ ์ž์„ธํ•˜๊ฒŒ ๋“ค์–ด์˜จ๋‹ค.

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyGameInstance.h"
#include "Algo/Accumulate.h" // ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

void UMyGameInstance::Init()
{
	Super::Init();

	const int32 ArrayNum = 10;
	TArray<int32> Int32Array;

	// 1-10๊นŒ์ง€ ์‚ฝ์ž…
	for (int32 ix = 1; ix <= ArrayNum; ++ix) {
		Int32Array.Add(ix);
	}

	// ์ง์ˆ˜ ์ œ๊ฑฐ
	Int32Array.RemoveAll(
		[](int32 Val) {
			return Val % 2 == 0;
		}
	);

	// ๋‹ค์‹œ ์ง์ˆ˜ ์ถ”๊ฐ€
	Int32Array += {2, 4, 6, 8, 10};

	TArray<int32> Int32ArrayCompare;
	int32 CArray[] = { 1,3,5,7,9,2,4,6,8,10 };
	Int32ArrayCompare.AddUninitialized(ArrayNum);
	FMemory::Memcpy(Int32ArrayCompare.GetData(), CArray, sizeof(int32) * ArrayNum);

	ensure(Int32Array == Int32ArrayCompare);

	// ์ดํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•1
	int32 Sum = 0;
	for (const int32& Int32Elem : Int32Array) {
		Sum += Int32Elem;
	}

	ensure(Sum == 55);

	// ์ดํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•2
	int32 SumByAlgo = Algo::Accumulate(Int32Array, 0);
	ensure(Sum == SumByAlgo);
}

 ๐Ÿง2. TSet (์ด๋นจ๋น ์ง„ ๊ฐ€๋ณ€๋ฐฐ์—ด)

  • ๋™์  ๊ฐ€๋ณ€๋ฐฐ์—ด์˜ ํ˜•ํƒœ
  • ์ค‘๊ฐ„์ค‘๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋น ์ ธ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค
  • ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ
  • ์ค‘๊ฐ„ ์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ

 

๐ŸŒŸ STL์˜ set๊ณผ ์–ธ๋ฆฌ์–ผ TSet ๋น„๊ต

  • STL set์˜ ํŠน์ง•
    • ์ด์ง„ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด ์ •๋ ฌ์„ ์ง€์›ํ•จ
    • ๋ฉ”๋กœ๋ฆฌ ๊ตฌ์„ฑ์ด ํšจ์œจ์ ์ด์ง€ ์•Š์Œ
    • ์š”์†Œ๊ฐ€ ์‚ญ์ œ๋  ๋•Œ ๊ท ํ˜•์„ ์œ„ํ•œ ์žฌ๊ตฌ์ถ•์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Œ
    • ๋ชจ๋“  ์ž๋ฃŒ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€ ์•Š์Œ
  • ์–ธ๋ฆฌ์–ผ TSet์˜ ํŠน์ง•
    • ํ•ด์‹œํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ํ‚ค ๋ฐ์ดํ„ฐ๊ฐ€ ๊ตฌ์ถ•๋˜์–ด ์žˆ์–ด ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•จ
    • ๋™์  ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ์—ฌ์žˆ์Œ
    • ๋ฐ์ดํ„ฐ๋Š” ๋น ๋ฅด๊ฒŒ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œํ•ด๋„ ์žฌ๊ตฌ์ถ•์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Œ
    • ์ž๋ฃŒ์—์„œ ๋น„์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ

๐Ÿ‘‰ ๋”ฐ๋ผ์„œ STL set๊ณผ ์–ธ๋ฆฌ์–ผ TSet์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅด๋‹ค.

๐Ÿ‘‰ STL์˜ unordered_set๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ๋™์ผํ•˜์ง„ ์•Š์Œ

๐Ÿ‘‰ TSet์€ ์ค‘๋ณต ์—†๋Š” ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๊ตฌ์ถ•ํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

์ค‘๊ฐ„์ค‘๊ฐ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐจ๋ก€๋Œ€๋กœ ๊ฑฐ๊พธ๋กœ ์ฑ„์›Œ์ง„๋‹ค.

 

TSet ์˜ˆ์‹œ

// TSet
TSet<int32> Int32Set;
for (int32 ix = 1; ix <= ArrayNum; ++ix) {
	Int32Set.Add(ix);
}

Int32Set.Remove(2);
Int32Set.Remove(4);
Int32Set.Remove(6);
Int32Set.Remove(8);
Int32Set.Remove(10);

Int32Set.Add(2);
Int32Set.Add(4);
Int32Set.Add(6);
Int32Set.Add(8);
Int32Set.Add(10);

๐ŸŸฉ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„

  TArray TSet
์ ‘๊ทผ O(1) O(1)
๊ฒ€์ƒ‰ O(N) O(1)
์‚ฝ์ž… O(N) O(1)
์‚ญ์ œ O(N) O(1)

 

TArray

๋นˆํ‹ˆ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ, ๊ฐ€์žฅ ๋†’์€ ์ ‘๊ทผ์„ฑ๋Šฅ, ๊ฐ€์žฅ ๋†’์€  ์ˆœํšŒ์„ฑ๋Šฅ

 

TSet

๋น ๋ฅธ ์ค‘๋ณต ๊ฐ์ง€

๋Œ“๊ธ€์ˆ˜0