๋ชฉ๋ก์ ์ฒด ๊ธ (1103)
KoreanFoodie's Study
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TMQPm/btr5fld2Je6/IIhRdtw8GpBj9K32avBQLK/img.jpg)
TTypeCompatibleBytes ํ์ ํต์ฌ : 1. TTypeCompatibleBytes ์ ๊ธฐ๋ณธ ํ์ ์ด ์๋ ๋ฐ์ดํฐ ๋ฐฐ์ด๋ก, ์ปดํ์ผ ํ์ alignment ๊ฐ ๊ฐ๋ฅํ๋ค. 2. Alignment ๊ฐ ๋๋ ๊ธฐ๋ณธ ๋จ์๋ ํ ํ๋ฆฟ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ํ์ ์ผ๋ก๋ถํฐ ๊ณ์ฐ๋ ์ฌ์ด์ฆ๋ก ์ ์๋๋ค. 3. GetTypedPtr ๋ก ํด๋น Element ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. TypeCompatibleBytes.h ์ ์ ์๋ ๊ตฌํ์ ๋ณด๋ฉด, /** An untyped array of data with compile-time alignment and size derived from another type. */ template struct TTypeCompatibleBytes : public TAlignedBytes< sizeo..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/0vKvd/btr5enXvkGe/W4neRoPb5eCo0vI1KFawuk/img.jpg)
์ธ๋ฆฌ์ผ ์ค๋งํธ ํฌ์ธํฐ ๊ตฌํ ์ธ๋ถ์ฌํญ๊ณผ ํ ํต์ฌ : 1. ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ์ง ๊ณ ๋ คํ ๋๋ ํญ์ ํผํฌ๋จผ์ค์ ๋ํด ์๊ฐํด์ผ ํ๋ค. ์ค๋งํธ ํฌ์ธํฐ๋ ์์ ๊ด๋ฆฌ์๋ ์ ํฉํ์ง๋ง ์ผ๋ถ ์ค๋งํธ ํฌ์ธํฐ ํ์ ์ C++ ๊ธฐ๋ณธ ํฌ์ธํฐ๋ณด๋ค ๋ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค. 2. TSharedPtr ๋ ๋น์นจ๋ฒํ(non-intrusive) ๋ก, ์ค๋ธ์ ํธ๊ฐ ์ค๋งํธ ํฌ์ธํฐ์ ์์ ํ์ ์๋์ง ์ ์ ์๋ค. ์ค๋ธ์ ํธ๋ฅผ TSharedRef ๋๋ TSharedPtr ๋ก ์ ๊ทผํ๋ฉด, ์ค๋ธ์ ํธ ํด๋์ค๋ฅผ TSharedFromThis ์์ ํ์์์ผ์ผ ํ๋ค. 3. ์ค๋งํธ ํฌ์ธํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฑ๊ธ ์ค๋ ๋์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ๋ฉํฐ ์ค๋ ๋์์ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, ์ค๋ ๋ ์ธ์ดํ ๋ฒ์ ์ ์ฌ์ฉํ์. ์ค๋งํธ ํฌ์ธํฐ ๊ตฌํ ์ธ๋ถ์ฌํญ ์ธ๋ฆฌ์ผ ์ค๋งํธ ํฌ์ธํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b4CXog/btr5e7tiVlo/3bbn9bMV1klHiKSKEADKp0/img.jpg)
TOptional ํต์ฌ : 1. TOptional ์ ์ธ์๋ก ๋ค์ด๊ฐ ๋ ์์ด ์์ฑ๋์๋์ง ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฐ๋จํ๊ฒ ํ์ธํ ์ ์๋ Wrapper ํด๋์ค์ด๋ค. 2. Optional.h ์ ๋ณด๋ฉด Value ์ bIsSet ์ด ์๋๋ฐ, Value ๊ฐ ์ค์ ๋๊ธฐ๋ ๋ฐ์ดํฐ์ด๊ณ , bIsSet ์ด ํด๋น ๋ฐ์ดํฐ์ ์์ฑ์๊ฐ ํธ์ถ๋์๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๋ ์์ด๋ค. IsSet, Emplace, GetValue ๋ฑ์ ์ฌ์ฉํ๋ฉด ํด๋น ํด๋์ค๋ฅผ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์๋ค. 3. TOptional ์ ์ฌ์ฉํ๋ ์ฅ์ ์ค ํ๋๋, ํน์ ๋ณ์๊ฐ ์ด๊ธฐํ๋์๋์ง๋ฅผ ํ๋จํ๊ธฐ ์ํด 'Magic Number' ๋ฅผ ์ธ ํ์๊ฐ ์์ด์ง๋ค๋ ๊ฒ์ด๋ค! TOptional ๊ตฌ์กฐ์ฒด ์ผ๋จ, Optional.h ์ ์ ์๋ TOptional ๊ตฌ์กฐ์ฒด์ ๋๋ต์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ณด์..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/wtPjT/btr3SIPHhDZ/HKVf6qjNpaiqk81ihACiW1/img.jpg)
ENUM_CLASS_FLAGS ์ฌ์ฉํ๊ธฐ (์ธ๋ฆฌ์ผ ํ๋๊ทธ ์ฌ์ฉ๋ฒ) ํต์ฌ : 1. ์ฌ๋ฌ ์กฐ๊ฑด์ ๋์์ ๊ฐ์ง ์ ์๋ ์ํฉ์ ๋ค๋ฅผ ๋๋, Enum Class ์ ๊ฐ์ Shift ์ฐ์ฐ์๋ฅผ ํ์ฉํด Bit Flag ์ฒ๋ผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. 2. EnumClassFlags ํ์ผ์ ์ ์๋ ํ ํ๋ฆฟ ํจ์๋ค(e.g. EnumHasAnyFlags)์ ํ์ฉํ๋ฉด, Enum Class ์ ์ ์๋ ํ๋๊ทธ๋ค์ ์ด์ฉํด ์ผ์ด์ค๋ค์ ์ค์ฒฉ์ ํจ์จ์ ์ผ๋ก ์ฒดํฌํ ์ ์๋ค. 3. ์ผ๋ฐ์ ์ผ๋ก Enum Class ๋ด์ ๊ฐ๋ค์ Flag ๋ก ํํํ๋ ๊ฒฝ์ฐ๋ UI ๋ ํ๊ฒฝ์ค์ ์ธํ ๋ฑ์ด ์๋ค. ์ผ๋ฐ์ ์ผ๋ก Enum Class ๋ ๊ฐ์ ์ฃผ์ ๋ด์์ ์ฌ๋ฌ ์กฐ๊ฑด๋ค์ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ผ ์ฌ๋ฌ ๋ณตํฉ์ ์ธ ์ํฉ์ ๋์์ ๋ค๋ค์ผ ํ๋ ์ผ์ด์ค๊ฐ ์๋ค๊ณ ํ๋ฉด ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cfWIRk/btr3dcXHBze/Wo4oj1lg42Fj9oh0Tedqfk/img.jpg)
TimerHandle ๋ฐฐ์ด ์ฌ์ฉํ๊ธฐ (TimerHandle Array) ํต์ฌ : 1. TArray ํ์ ์ ์ฌ์ฉํ๋ฉด ๋๋ค. 2. ์๋ก์ด FTimerHandle ์ ๋ฃ์ ๋๋ Emplace ๋ฅผ ์ฌ์ฉํ๋ค. 3. ๊ฐ์ฒด๊ฐ ํ๊ดด๋๊ฑฐ๋ ์ ๋ฆฌํ๋ ์์ ์ ClearTimer ๋ฐ ๋ฐฐ์ด์ ๋น์์ฃผ๋ ์์ ์ ํด ์ฃผ์. ์ค๋ช ํ ๊ฒ์ ์์ 3์ค ์์ฝ์์ ๋ค ํ์ผ๋, ์ฝ๋๋ง ๋ณด์. // ์ ์ธ // ์ผ์ ์๊ฐ ํ UTextBlock ๋ณธ๋ ์์์ผ๋ก ๋์๊ฐ๊ฒ ๋ง๋ค๋ ์ฌ์ฉํ๋ ํ์ด๋จธํธ๋ค TArray timerHandleList; // ๊ตฌํ void UTestWidget::NativeConstruct() { for (int i = 0; i < 10; ++i) { FTimerHandle newTimerHandle; timerHandleList..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/brGrn2/btr21CDJtAo/wI2U0ozslYHt13MclQEluK/img.jpg)
๋์ ์ผ๋ก ์ปดํฌํดํธ ์์ฑํ๊ธฐ (Dynamically create ActorComponent) ํต์ฌ : 1. ์ผ๋ฐ์ ์ผ๋ก ActorComponent ๋ ์์ฑ์์์ CreateDefaultSubobject ํจ์๋ฅผ ํตํด CDO ๊ฐ ์์ฑ๋๋ค. 2. ๋์ ์ผ๋ก ์กํฐ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ๋๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. ๋ธ๋ฃจํ๋ฆฐํธ์์๋ AddComponent ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ฉฐ, C++ ์์๋ NewObject ๋ก ActorComponent ๋ฅผ ์์ฑ ํ, ๊ธฐ์กด RootComponent ์ Attach ํ๋ ๋ฐฉ์์ ํ์ฉํ๋ค. 3. ์ปค์คํ AddComponent ํจ์๋ฅผ ๋ง๋ค์ด์ ํธํ๊ฒ ํ์ฉํ๊ฑฐ๋, ํ ํ๋ฆฟ ํจ์๋ฅผ ๋ง๋๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค. ๋ธ๋ฃจํ๋ฆฐํธ์์ AActor ํด๋์ค์๋ AddComponent ๋ผ๋, ๋ด๋ถ์ ์ผ๋ก NewObj..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bTrEQZ/btrZYTn7Y9b/SkH9I52ykVjCsOvWW0cFB1/img.jpg)
SetTimer ์ ํจ์ ๋ฐ ๋๋ค(Lambda) ์ฐ๊ฒฐํ๊ธฐ ํต์ฌ : 1. UObject ์์ ํด๋์ค์์๋ ๊ธฐ์กด ํจ์๋ฅผ SetTimer ํจ์์์ ๋ฐ๋ก ์ฐ๊ฒฐํ ์ ์๋ค. 2. ์ผ๋ฐ์ ์ผ๋ก๋ FTimerDelegate ์ Lamda ํจ์๋ฅผ ์ฐ๊ฒฐํด ์ฌ์ฉํ๋ฉฐ, UObject ๋ฅผ ์์ํ์ง ์๋ ํด๋์ค์์๋ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค. 3. FTimerHandle ์ ์ ์ญ์ด๋ฉฐ, ์ฌ์ฉ ์๋ฃ ํ์๋ ClearTimer ๋ฅผ ์ด์ฉํด ํ์ด๋จธ๋ฅผ ํด์ ํด ์ฃผ๋๋ก ํ์! ์ด์ ๊ธ์์ ์ธ๊ธํ ๋ฐ ์์ง๋ง, ์ผ์ ์๊ฐ ์ดํ ํน์ ํจ์๊ฐ ํธ์ถ๋๋๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ์กฐ๊ธ ๋ ์์ธํ ๊ธฐ๋กํด๋ณด๋ ค ํ๋ค. SetTimer ์ ํจ์์ ๋๋ค๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ถ๊ฐ๋ก ์๊ฐํ๋ค! 1. ๊ธฐ์กด ํจ์์ ๊ทธ๋๋ก ์ฐ๊ฒฐ (UObject ํด๋์ค์์ ์ฌ์ฉ ๊ฐ๋ฅ) FTimer..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dOqLg5/btrXVQZdf29/zYKx0z9CquFAOhY9yywFk1/img.jpg)
ํ์ฌ ์๊ฐ ๋ก๊ทธ ์ฐ๊ธฐ ํต์ฌ : 1. FDateTime ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์ฉํด์ ๊ฐ์ข ์๊ฐ์ ์ฒดํฌํ ์ ์๋ค. 2. FDateTime::Now() ๋ฅผ ํตํด์ ํ์ฌ ์๊ฐ(์ด๊น์ง)๋ฅผ ๊ตฌํ ์ ์๋ค(static). 3. FDateTime::GetMillisecond() ๋ฅผ ํตํด ํ์ฌ ๋ฐ๋ฆฌ ์ด๋ฅผ ๊ตฌํ ์ ์๋ค(non-static). ์๋ ์ฝ๋๋ฅผ ์ด์ฉํด์ ํ์ฌ ์๊ฐ์ ๊ตฌํ๋ ๊ฐ๋จํ ๋ก๊ทธ๋ฅผ ์ฐ์ด ๋ณผ ์ ์๋ค! FDateTime dateTime; UE_LOG(Error, FText::FromString( FString::Format(TEXT("Current Time : %s:%d ms"), { FDateTime::Now().ToString(), dateTime.GetMillisecond() }))); UE_LOG ๋งคํฌ๋ก๋ F..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bVXpEX/btrWsTXp0LG/LbdWPkgKfCHZIqipUPdJbk/img.jpg)
SafeZone ์์ ฏ ํต์ฌ : 1. SafeZone ์์ ฏ์ ์ฌ์ฉํ๋ฉด, ์ฝ์/PC/๋ชจ๋ฐ์ผ ๋ฑ ์์ ํจ๋ ๊ฐ์ฅ์๋ฆฌ์ UI ๋ฐ ์ปจํ ์ธ ๊ฐ ์ ๋๋ก ์ถ๋ ฅ์ด ๋์ง ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ๋จผ์ , SafeZone ํจ๋์ ๋ํ ์ธ๋ฆฌ์ผ ์์ง์ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค : ์ธ๋ฆฌ์ผ ๊ณต์ ๋ฌธ์์ ์๋ ์ธ์ดํ ์กด์ ๋ํ ๊ทธ๋ฆผ์ ๋ณด์. ์ผ์ชฝ์ SafeZone ์์ ฏ์ด ์๋ ๊ฒฝ์ฐ์ด๊ณ , ์ค๋ฅธ์ชฝ์ SafeZone ์์ ฏ์ด ์๋ ๊ฒฝ์ฐ์ด๋ค. ์ค๋ฅธ์ชฝ์ ๊ฒฝ์ฐ, Uniform Safe Zone (๊ท ๋ฑ ์ธ์ดํ ์กด) ์์ญ์ 0.9(๋นจ๊ฐ) ์ผ๋ก ์ค์ ํ๋ค. ์ด๋ ๊ฒ ์ธ์ดํ ์กด์ ํ์ฉํ๋ฉด, ๊ฐ์ฅ์๋ฆฌ์ "Unsafe" ํ ์กด์ ์์ ฏ์ด ์๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค! ์ฐธ๊ณ : ์ธ๋ฆฌ์ผ ๊ณต์ ๋ฌธ์
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cPdJia/btrWcbKXMEx/AqFJuk7kW945HdcW26uZA0/img.jpg)
์ธ๋ฆฌ์ผ์ Cast ๋์ ์๋ฆฌ ํต์ฌ 1. Cast ๋ UObject ์ ์ฐ์ฌ์ผ ํ๋ค. Cast ๋ static_cast ์๋ ๋ฌ๋ฆฌ ํ์ ์์ ์ฑ์ ์ง๋๋ค(nullptr ๋ฅผ ๋ฆฌํด). 2. Cast ์ ๋ฐํ์ ๋น์ฉ์ ์๋ํฐ ํ๊ฒฝ์์๋ O(O(Depth(InheritanceTree))) ์ด๊ณ , ์๋ํฐ๊ฐ ์๋ ๋๋ O(1) ์ด๋ค. 3. Cast ๋ dynamic_cast ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. dynamic_cast ๋์ Cast ๋ฅผ ์ฌ์ฉํ๋ผ! ์ค์ ๋ก ์ธ๋ฆฌ์ผ์ Cast ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋์ด ์๋ค : // Dynamically cast an object type-safely. template FORCEINLINE To* Cast(From* Src) { return TCastImpl::DoCast(Src); } ๋ด๋ถ..