๋ชฉ๋ก์ ์ฒด ๊ธ (1104)
KoreanFoodie's Study

Does Implement Interface ๊ธฐ๋ฅ์ผ๋ก ๋ฐ๋ฏธ์ง, ์ธํฐ๋์ ๊ตฌํํ๊ธฐ ์ด์ ์์์๋, ๋ง์ ๋์์ด Enemy ์ด๋ฉด ๋ฐ๋ฏธ์ง๋ฅผ ์ ๋ฌํ๊ณ ์ถ๊ฑฐ๋, ๋ง์ฝ ์ํธ์์ฉ ๊ฐ๋ฅํ ์ค๋ธ์ ํธ์ธ ๊ฒฝ์ฐ ์ํธ์์ฉ์ ํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ์. ํด๋น ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ๊ตฌํํ๋ฉด ์ข์๊น? ๋ฌผ์ฒด์ ๊ฒฝ์ฐ, ๊ฐ ๋ฌผ์ฒด์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ๋ ๊ฒฝ์ฐ๋ ์๊ฐํด ๋ณผ ์ ์๊ฒ ์ง๋ง, ๋ฐฐ์น๋๋ ๋ชจ๋ ์ค๋ธ์ ํธ๋ง๋ค ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ๋ก ์ค์ ํด์ผ ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ฌด ๋์ฐํ ๊ฒ์ด๋ค. ๋ฐ๋ฏธ์ง์ ๊ฒฝ์ฐ, ์ด์ ๋ง์ ์กํฐ๊ฐ ๋ฐ๋ฏธ์ง๋ฅผ ๋ฐ์ ์ ์๋์ง ์๋์ง๋ฅผ ์ด๋ป๊ฒ ํ๋ณํ๋ฉด ์ข์๊น? ์ฌ์ค Enemy ๋ง๊ณ ๋ ๋ถ์ ์ ์๋ ์ค๋ธ์ ํธ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋ฏธ์ง๋ฅผ ๋ฐ์์ผ ํ ํ ๋ฐ, ๊ฐ ํด๋์ค๋ง๋ค ๋ฐ๋ฏธ์ง๋ฅผ ๋ฐ๋์ง ์ ๋ฐ๋์ง๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋งค์ฐ ๊ท์ฐฎ์ ์ผ์ด๋ค. ์ธ๋ฆฌ์ผ์์๋ Does Implemen..

1์ธ์นญ ์์ ๊ตฌํํ๊ธฐ ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ฆฌ์ผ์ ์ฒ์ ๋ฐฐ์ธ๋๋ ๋ค๋ค 3์ธ์นญ์ผ๋ก ์์ํ๋๋ฐ, 3์ธ์นญ์ FPS ์ ๊ฒฝ์ฐ ์์ ๊ณผ ๋์์ด ํจ๊ป ์์ง์ด์ง ์๋ ํน์ง์ด ์๋ค. ๋ฐ๋ผ์, ์์ ์ ๋ฐ๋ฅ์ ๋ฐ๋ผ๋ณด๋๋ฐ ํ์ ์ด์ ๋ ์ํ๋ก ์์ ํฅํ๊ณ ์๋ ๋ถ์์ฐ์ค๋ฌ์ด ์ํฉ์ด ์ฐ์ถ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ฐ, ๋ฐ๋ก FirstPersonBP (์์์ฉ ์ปจํ ์ธ ) ์ฒ๋ผ, ๊ธฐ๋ณธ์ผ๋ก ์ฃผ์ด์ง๋ Skeletal Mesh ๋ฅผ Clear ํ๊ณ , ์นด๋ฉ๋ผ์ ์์(Children)์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ Skeletal Mesh ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค. ์๋ง์ Skeletal Mesh ๋ฅผ ์ฐ๊ฒฐํ ๋ค์, ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ Animation Blueprint ๋ฅผ ์ ํ๋ง ํด์ฃผ๋ฉด, ์ ๋๋ฉ์ด์ ๋ ์ ์ฌ์๋ ๊ฒ์ด๋ค.

UFUNCTION ๊ณผ FORCEINLINE ์ผ๋ฐ์ ์ผ๋ก, UFUNCTION ๊ณผ FORCEINLINE ์ ํธํ๋์ง ์๋๋ค. ์ฐ๋ฆฌ๊ฐ UFUNCTION ์ ๋ถ์ด๋ ์ด์ ๋ ๋๊ฐ ๋ธ๋ฃจํ๋ฆฐํธ์์ ํด๋น ํจ์๋ฅผ ํธ์ถํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ธ๋ฐ, C++ ์์ ์์ฑ๋ ์ฝ๋๋ฅผ BP ์์ ์ฝ์ด์ค๋ ค๋ฉด, FORCEINLINE ์ ๋ถ์ด์ง ์์์ผ ํ๋ค(Function call ์ ํํ์ด์ด์ผ ํจ). ๋ฐ๋ผ์ ์๋์ ๊ฐ์ ํจ์๋ ๋ธ๋ฃจํ๋ฆฐํธ์์ ์ธ์๋์ง ์๋๋ค. UFUNCTION(BlueprintCallable) FORCEINLINE void Foo() {}

GoF ์ ๋์์ธ ํจํด๊ณผ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋์์ธ ํจํด์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์์ต๋๋ค. Dependency Injection Principle (์์กด์ฑ ์ญ์ ์๋ฆฌ) ๋ถ๋ชจ - ์์ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ Relationship ํด๋์ค์ ๊ด๊ณ๋ฅผ ๊ฒ์ํ๋ Research ํด๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง ๋ค๋ฉด ์ด๋จ๊น? #include #include #include #include using namespace std; // A. High-level modules should not depend on low-level modules. // Both should depend on abstractions. // B. Abstractions should not depend on details. // Deta..

GoF ์ ๋์์ธ ํจํด๊ณผ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋์์ธ ํจํด์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์์ต๋๋ค. Interface Segregation Principle (์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น) ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น, ISP ๋ ๊ฐ ์ธํฐํ์ด์ค๊ฐ ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋๋ง ์ง์ํด์ผ ํจ์ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค์ด, ํ๋ฆฐํธ์ ์ค์บ๋ ๊ธฐ๋ฅ์ ํ๋ ๊ธฐ๊ณ๋ฅผ ์ธํฐํ์ด์ค๋ก ๊ตฌํํ๋ค๊ณ ํ์. struct IMachine { virtual void print(Document& doc) = 0; virtual void fax(Document& doc) = 0; virtual void scan(Document& doc) = 0; }; struct MFP : IMachine { void print(Document& doc) override; void fax(..

GoF ์ ๋์์ธ ํจํด๊ณผ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋์์ธ ํจํด์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์์ต๋๋ค. Liskov Substitution Principle (๋ฆฌ์ค์ฝํ ์นํ ์์น) ๋ฆฌ์ค์ฝํ ์นํ ์์น (์ค์ฌ์ LSP) ๋, ๊ธฐ๋ฐ ํด๋์ค๊ฐ ์๊ณ ํ์ ํด๋์ค๊ฐ ์์๋, ๊ธฐ๋ฐ ํด๋์ค๊ฐ ๋ค์ด๊ฐ๋ ์๋ฆฌ์ ํ์ ํด๋์ค๊ฐ ๋ค์ด๊ฐ ์ ์์ด์ผ ํ๋ฉฐ, ์ด๋ ๊ธฐ๋ฐ ํด๋์ค๋ฅผ ๋ฃ์์๋์ ์๋๋๋ก ์ฝ๋๊ฐ ์ ๋์ํด์ผ ํจ์ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค์ด, Rectangle ํด๋์ค๋ฅผ ๊ธฐ๋ฐ ํด๋์ค๋ก ํ Square ํด๋์ค๋ฅผ ๋ณด์. process ๋ผ๋ ํจ์์์ ๋์ด๋ฅผ 10์ผ๋ก ๋ง๋ ํ, ๋์ด๋ฅผ ๋ฐํํ๊ณ ์๋ค. #include class Rectangle { protected: int width, height; public: Rectangle(const int ..

GoF ์ ๋์์ธ ํจํด๊ณผ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋์์ธ ํจํด์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์์ต๋๋ค. Open-Closed Principle (๊ฐ๋ฐฉ-ํ์ ์์น) OCP ๋ ํ์ฅ์๋ ์ด๋ ค์๊ณ , ์์ ์๋ ํ์์ ์ธ ๋์์ธ ์์น์ ์๋ฏธํ๋ค. (Open for extension, Closed for modification) ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ Product ๋ฅผ ๋ถ๋ฅํด์ผ ํ๋ ์ฝ๋๋ฅผ ์ง ๋ค๊ณ ๊ฐ์ ํด ๋ณด์. ์๊น๊ณผ ์ฌ์ด์ฆ ๋ฑ์ ๊ธฐ์ค์ผ๋ก ์ ํ์ ๋ถ๋ฅํ ๊ฒ์ด๋ค. struct Product { string name; Color color; Size size; }; ์ ๊ฒฝ์ฐ, enum class ์ functor ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์งค ์ ์์ ๊ฒ์ด๋ค. #include #include #include using n..

GoF ์ ๋์์ธ ํจํด๊ณผ ๊ฐ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋์์ธ ํจํด์ ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํ๊ณ ์์ต๋๋ค. Single Responsibility Principle (๋จ์ผ ์ฑ ์ ์์น) Single Responsibility Principle, ์ค์ฌ์ SRP ๋ ๋จ์ผ ์ฑ ์ ์์น์ผ๋ก, ๋ชจ๋ ํด๋์ค๊ฐ ํ๋์ ์ฑ ์์ ๊ฐ์ง๋ฉฐ, ํด๋์ค๊ฐ ๊ทธ ์ฑ ์์ ์์ ํ ์บก์ํํด์ผ ํจ์ ์๋ฏธํ๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์. #include #include #include #include #include using namespace std; struct Journal { string title; vector entries; explicit Journal(const string& title) : title{title} { } void add(const stri..

๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! std::optional (C++17 ์ด์ - ) ์๋ฅผ ๋ค์ด์ ์ด๋ ํ map ์์ ์ฃผ์ด์ง ํค์ ๋์ํ๋ ๊ฐ์ด ์๋์ง ํ์ธํ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ ์ถ๋ค๊ณ ํด๋ณด์. std::optional ์ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ๊น๋ํ๊ฒ ๊ตฌํํ ์ ์๋ค! #include #include #include #include std::optional GetValueFromMap(const std::map& m, int key) { auto itr = m.find(key); if (itr != m.end()) { return itr->second; } // nullopt ๋ ์ ์ ์๋ ๊ฐ์ฒด๋ก ๋น์ด์๋ optional ์ ..

๋ชจ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ํต์ฌ ๋ด์ฉ์ ๊ฐ์ถ๋ฆฌ๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ชจ๋์ ์ฝ๋์ ์น์ด๋จน๋ C++ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์! ํ์ผ์ ์ฐพ์๋ณด์ ํ์ผ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ผ ๋ฐ์ดํฐ ์ ์ ์ถ๋ ฅ์ ๋ด๋นํ๋ ํ์ผ ์ ์ถ๋ ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ () ๊ณผ๋ ๋ค๋ฅด๋ค. ์ ๊ฒฝ์ฐ, ํ์ผ ํ๋๊ฐ ์ฃผ์ด์ง๋ฉด ํด๋น ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ด๋ ์ญํ ์ ํ์ง๋ง, ๊ทธ ์ธ์ ํ์ผ์ ๊ดํ ์ ๋ณด (ํ์ผ ์ด๋ฆ, ์์น, ๋ฑ๋ฑ) ์ ๊ดํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ๋ ์๋ค. ๋ฐ๋ฉด์ ํ์ผ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ, ํ์ผ์ ๊ดํ ์ ๋ณด (ํ์ผ ๋ฉํ๋ฐ์ดํ)์ ๋ํ ์ ๊ทผ์ ๋์์ฃผ๋ ์ญํ ์ ์ํํ๋ฉฐ, ํ์ผ ์์ฒด๋ฅผ ์ฝ๋ ์ผ์ ์ํํ์ง ์๋๋ค. ์ฝ๊ฒ ๋งํด์ ํ๋ ๋์คํฌ ์ด๋๊ฐ์ ์๋ a.txt ๋ผ๋ ํ์ผ์ ์ฐพ๊ณ ์ถ๋ค๋ฉด filesystem ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๊ณ , ํด๋น ํ์ผ์ ์ฐพ..