๋ชฉ๋ก2022/04 (31)
KoreanFoodie's Study
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! Callable Callable ์ด๋, ์ด๋ฆ ๊ทธ๋๋ก ํธ์ถ(Call)ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ํ์ ์ธ ์์๋ก ํจ์๊ฐ ์๋ค. ํ์ง๋ง C++์์๋ ( ) ๋ฅผ ๋ถ์ฌ ํธ์ถํ ์ ์๋ ๋ชจ๋ ๊ฒ์ Callable ์ด๋ผ๊ณ ์ ์ํ๋ค. #include struct S { void operator()(int a, int b) { std::cout
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! shared_ptr ์ด๋ค ๊ฐ์ฒด์ ๊ฒฝ์ฐ, ์ฌ๋ฌ ํฌ์ธํฐ์์ ์ฐธ์กฐ๋ฅผ ํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋, ํด๋น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ํฌ์ธํฐ์ ์๊ฐ 0์ด ๋์์ ๋ ํด๋น ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ํด์ ํด์ฃผ๋ ํฌ์ธํฐ๊ฐ ํ์ํ๋ฐ, ์ด๊ฒ์ด ๋ฐ๋ก shared_ptr์ด๋ค. std::shared_ptr p1(new A()); std::shared_ptr p2(p1); // unique_ptr ์ผ ๊ฒฝ์ฐ ์์ ๊ถ ๋ฌธ์ ๋ก ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. std::unique_ptr p3(new A()); std::shared_ptr p4(p3); // ์ปดํ์ผ ์ค๋ฅ ์ ์ฌ์ง์ฒ๋ผ, shared_ptr ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๊ณ ..
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! Resource Acquisition Is Initialization - RAII ์์์ ํ๋์ ์ด๊ธฐํ๋ค. ์ด๋ ์์ ๊ด๋ฆฌ๋ฅผ ์คํ์ ํ ๋นํ ๊ฐ์ฒด๋ฅผ ํตํด ์ํํ๋ ๊ฒ์ด๋ค. ํจ์ ๋ด๋ถ์์ ์์ธ๊ฐ ๋ฐ์ํด์ ์๋ฉธ์๊ฐ ํธ์ถํ๋ ์ฝ๋์ ๋๋ฌํ์ง ๋ชปํ๋๋ผ๋, ํด๋น ํจ์์ ์คํ์ ์ ์๋์ด ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ค์ ๋น ์ง์์ด ์๋ฉธ์๊ฐ ํธ์ถ๋๋ค(stack unwinding). ๋ง์ฝ ์ด ์๋ฉธ์๋ค ์์ ๋ค ์ฌ์ฉํ ์์์ ํด์ ํ๋ ๋ฃจํด์ ๋ฃ์ผ๋ฉด ์ด๋จ๊น? A* pa = new A(); ์๋ฅผ ๋ค์ด, ์์ ํฌ์ธํฐ pa์ ๊ฒฝ์ฐ, ๊ฐ์ฒด๊ฐ ์๋๋ฏ๋ก ์๋ฉธ์๊ฐ ํธ์ถ๋์ง ์๋๋ค. ๊ทธ ๋์ , pa๋ฅผ ์ผ๋ฐ์ ์ธ ํฌ์ธํฐ๊ฐ ์๋, ํฌ์ธํฐ..
Move ๋ฌธ๋ฒ (Move semantics) Swap function์ ๊ตฌํํด๋ณด์. ์ผ๋ฐ์ ์ธ ํ์ T์ ๋ํ Swap function์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค. template void swap(const T& a, const T& b) { T tmp(a); a = b; b = tmp; } ์ด ๊ฒฝ์ฐ, T์์ a๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์์ ๋ณต์ฌ ์์ฑ์๊ฐ ํธ์ถ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์์ ์ ๊ณตํ๋ move ํจ์๋ฅผ ์ฌ์ฉํ๋ค. template void swap(T& a, T& b) { T tmp = std::move(a); b = std::move(a); a = std::move(tmp); } ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก swap ํจ์๋ฅผ ๊ตฌํํ๋ฉด, swap์ด ์ค์ ๋ก ํํด์ง๋ ๊ณผ์ ์์ ์ด๋ ์์ฑ์๊ฐ ํธ์ถ๋๋ค. mo..
์ข์ธก๊ฐ๊ณผ ์ฐ์ธก๊ฐ C++์์, ๊ฐ์ ๋์ฒด๋ก ์ฐ์ธก๊ฐ๊ณผ ์ข์ธก๊ฐ์ผ๋ก ๋๋์ด์ง๋ค. (๋ ๊ตฌ์ฒด์ ์ธ ๋ถ๋ฅ๋ ์ด๊ณณ์ ์ฐธ์กฐ) ์ข์ธก๊ฐ์ '์ด๋ฆ'์ ๊ฐ์ง๊ณ ์๋ ๋ ์, ์ฐ์ธก๊ฐ์ '์ด๋ฆ'์ด ์๋ ๋ ์์ด๋ค. ์ด๋ ์์ฑ์์ ์ฐ์ธก๊ฐ ๋ ํผ๋ฐ์ค ํด๋์ค์์ ์์ฑ์๋ฅผ ํธ์ถํ๋ค๊ณ ํด ๋ณด์. ๋ง์ฝ ํด๋์ค๊ฐ String ๋ณ์๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ด๋ฏธ ์์ฑ๋ ๋ณ์ a๋ฅผ ์ด์ฉํด b๋ฅผ ๋ง๋ ๋ค๊ณ ํ ๋ String ๊ฐ์ ๋งค๋ฒ ์๋ก ์์ฑํ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น์ด๋ค. ์๋ก์ด String์ ๋ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๋์ , ํฌ์ธํฐ๋ฅผ ์ ๋ฌํจ์ผ๋ก์จ ํจ์จ์ ์ผ๋ก ๊ฐ์ ์ฎ๊ธฐ๋ฉฐ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋๋ฐ, ์ด๋ ์ด๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ์์ฑ์๋ ์๋์ ๊ฐ์ ํ์์ ๊ฐ์ง๋ค. ์ฐ์ธก๊ฐ ๋ ํผ๋ฐ์ค์ ๊ฒฝ์ฐ, typename && var ๊ฐ์ ํ์์ผ๋ก ํํ๋๋๋ฐ, ์ด๋ &..
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! throw ๋ก ์์ธ ๋ฐ์์ํค๊ธฐ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ์์ ์ฝ๋๋ฅผ ๋ณด์. // ์๋ต ... const T& at(size_t index) const { if (index >= size) { // ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค! throw std::out_of_range("vector ์ index ๊ฐ ๋ฒ์๋ฅผ ์ด๊ณผํ์์ต๋๋ค."); } return data[index]; } ์์์๋ ๋ฒ์ ์ด๊ณผ๋ฅผ ์๋ฆฌ๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค. C++ ๋ ์์ธ๋ฅผ ๋์ง๊ณ ์ถ๋ค๋ฉด throw ๋ก ์์ธ๋ก ์ ๋ฌํ๊ณ ์ถ์ ๊ฐ์ฒด๋ฅผ ์จ์ฃผ๋ฉด ๋๋ค. C++ ํ์ค์๋ overflow_error, length_error, runtime_error ..
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! std::string std::string ์ด๋ ๋ฌด์์ผ๊น? ์ฌ์ค std::string ์ basic_string์ด๋ผ๋ ํด๋์ค ํ ํ๋ฆฟ์ ์ธ์คํด์คํ ๋ฒ์ ์ด๋ค. basic_string definition ์ ๋ค์๊ณผ ๊ฐ๋ค : template class basic_string; Traits ๋ ์ฃผ์ด์ง CharT ๋ฌธ์๋ค์ ๋ํด ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์์ด ์ฐ์ฐ๋ค์ ์ ์ํด ๋์ ํด๋์ค๋ฅผ ์๋ฏธํ๋ค. ์ฌ๊ธฐ์, Traits๋ฅผ ๋ฐ๊พธ๋ฉด ์ ๋ ฌ ์์๋ฅผ ๋ฐ๊ฟ ์ ์๋ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์กฐ์์ ํ ์ ์๋ค! ๋ค์ ๋งํด, basic_string ์ ์ ์๋ ๋ฌธ์์ด ์ฐ์ฐ๋ค์ ์ฌ์ค ์ ๋ถ Traits ์ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์์ด ์ฐ์ฐ๋ค์ ๊ฐ์ง๊ณ ..
๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! STL algorithm STL algorithm ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ STL ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ํ์ํ ํธ๋ฆฌํ ๋ฉ์๋๋ค์ ์ ๊ณตํ๊ณ ์๋ค. STL ์๊ณ ๋ฆฌ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ํจ์๋ค์ ๋์ฒด๋ก ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ํํ๋ฅผ ๋๊ณ ์๋ค. template void do_something(Iter begin, Iter end); template void do_something(Iter begin, Iter end, Pred pred); ๋ ๋ฒ์งธ์ Pred ๋ ์ผ๋ฐ์ ์ผ๋ก bool ์ ๋ฆฌํดํ๋ ํจ์ ๊ฐ์ฒด(Funtor) ๊ฐ ์ ๋ฌ๋๋ค. ์ ๋ ฌ (sort, stable_sort, partial_sort ์ ๋ ฌ์ ..
TArray TArray ๋ std::vector ์ ๋น์ทํ๊ฒ ๋์ํ์ง๋ง, AddUnique, RemoveAtSwap ๋ฑ์ ๋ถ๊ฐ์ ์ธ API ๋ฅผ ์ ๊ณตํ๋ค. TArray ๋ ๋น ๋ฅด๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ฉฐ, ์์ ํ๋ค! TArray ActorArray = GetActorArrayFromSomewhere(); // Tells how many elements (AActors) are currently stored in ActorArray. int32 ArraySize = ActorArray.Num(); // TArrays are 0-based (the first element will be at index 0) int32 Index = 0; // Attempts to retrieve an element at..
์ธ๋ฆฌ์ผ ๊ฒ์ํ๋ ์ด์ 4๋ main class type ์ธ๋ฆฌ์ผ์๋ ๊ฒ์ํ๋ ์ด์ ์ฌ์ฉ๋๋ 4๋ main class type ์ด ์๋ค. ๋ฐ๋ก UObject, AActor, AActorComponent, UStruct ์ด๋ค. ์ด ์ธ์๋ ์ฌ์ฉ์ ์ ์ ํ์ ์ ์ฌ์ฉํ ์๋ ์์ง๋ง, ๊ทธ๋ฐ ํ์ ๋ค์ ์์ง์ ๋ด์ฅ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง๋ ์๋๋ค. ํ๋์ฉ ๊ทธ ์ญํ ๊ณผ ๋ฒ์๋ฅผ ์์๋ณด์. Unreal Objects (UObject) UObject ๋ ์ธ๋ฆฌ์ผ ์์ง์ building block ์ผ๋ก์จ, UClass ์ ํจ๊ป ๋ค์๊ณผ ๊ฐ์ ์๋น์ค๋ค์ ์ ๊ณตํ๋ค : Reflection of properties and methods Serialization of properties Garbage Collection Finding a UObject ..