์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ—๏ธ C++ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ํ†ตํ•œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐํ™”

๐Ÿ—๏ธ C++ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ํ†ตํ•œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐํ™”

๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ๋„ ๊น”๋”ํ•˜๊ฒŒ! ์ฝ”๋“œ ๊ด€๋ฆฌ์˜ ์ •์„์„ ํŒŒํ—ค์ณ๋ณด์ž ๐Ÿ’ก

์•ผ ์†”์งํžˆ C++ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ง„์งœ ํ—ฌ๊ฒŒ์ดํŠธ ์—ด๋ฆฌ์ž–์•„ ใ…‹ใ…‹ใ…‹ ๐Ÿ˜ฑ
ํ—ค๋” ํŒŒ์ผ ์ˆ˜๋ฐฑ ๊ฐœ์— ์ปดํŒŒ์ผ ์‹œ๊ฐ„์€ ์ปคํ”ผ ํ•œ ์ž” ๋งˆ์‹ค ์‹œ๊ฐ„์ด๊ณ , ์ด๋ฆ„ ์ถฉ๋Œ์€ ๋˜ ์™œ ์ด๋ ‡๊ฒŒ ์ž์ฃผ ๋‚˜๋Š”์ง€...
๊ทผ๋ฐ ์š”์ฆ˜์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ž‘ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์ œ๋Œ€๋กœ ์“ฐ๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค ์ƒ๋‹น ๋ถ€๋ถ„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด!

ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ฝ”๋“œ ๊ตฌ์กฐํ™”๊ฐ€ ์ƒ์‚ฐ์„ฑ์„ ์ขŒ์šฐํ•œ๋‹ค๊ณ  ๋ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ˆ์•ผ.
์˜ค๋Š˜์€ C++์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ C++20๋ถ€ํ„ฐ ๋„์ž…๋œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ œ๋Œ€๋กœ ํŒŒํ—ค์ณ๋ณผ๊ฒŒ ๐Ÿ”ฅ

C++ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐํ™” ์ „๋žต ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋…ผ๋ฆฌ์  ๊ทธ๋ฃนํ™” ์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€ ๊ณ„์ธต์  ๊ตฌ์กฐ ๋ ˆ๊ฑฐ์‹œ ํ˜ธํ™˜์„ฑ ์šฐ์ˆ˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์ปดํŒŒ์ผ ์†๋„ ํ–ฅ์ƒ ๋งคํฌ๋กœ ๊ฒฉ๋ฆฌ ๋ช…ํ™•ํ•œ ์ธํ„ฐํŽ˜์ด์Šค C++20 ์ตœ์‹  ๊ธฐ๋Šฅ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ๋„ˆ์ง€ ๊ทน๋Œ€ํ™”! ์ „ํ†ต์  ๋ฐฉ์‹ ํ—ค๋” ๊ธฐ๋ฐ˜ ์ปดํŒŒ์ผ ๋А๋ฆผ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ์ง„์  ์ „ํ™˜ ์ตœ์  ๊ท ํ˜• ๋ชจ๋˜ ๋ฐฉ์‹ ๋ชจ๋“ˆ ์ค‘์‹ฌ ๋น ๋ฅธ ๋นŒ๋“œ
๐Ÿ“ฆ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๊ธฐ๋ณธ๊ณผ ํ™œ์šฉ

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” C++98๋ถ€ํ„ฐ ์žˆ๋˜ ๊ธฐ๋Šฅ์ธ๋ฐ, ์•„์ง๋„ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ œ๋Œ€๋กœ ํ™œ์šฉ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋”๋ผ ใ… ใ… 
๊ธฐ๋ณธ ๊ฐœ๋…์€ ๊ฐ„๋‹จํ•ด. ์ฝ”๋“œ๋ฅผ ๋…ผ๋ฆฌ์ ์ธ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด์„œ ์ด๋ฆ„ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฑฐ์ง€!

์™œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํ•„์š”ํ• ๊นŒ? ๐Ÿค”
๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์—ฌ๋Ÿฌ ํŒ€์ด ๋™์‹œ์— ์ž‘์—…ํ•˜์ž–์•„?
AํŒ€์—์„œ ๋งŒ๋“  Vector ํด๋ž˜์Šค๋ž‘ BํŒ€์—์„œ ๋งŒ๋“  Vector ํด๋ž˜์Šค๊ฐ€ ์ถฉ๋Œํ•˜๋ฉด ์ง„์งœ ๋‚œ๊ฐํ•ด ใ…‹ใ…‹ใ…‹
์ด๋Ÿด ๋•Œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด ๋ฌธ์ œ ํ•ด๊ฒฐ!

๐Ÿ’ก ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

namespace Graphics {
    class Renderer {
        void draw();
    };
    
    class Shader {
        void compile();
    };
}

namespace Physics {
    class Vector {
        double x, y, z;
    };
    
    class Collision {
        bool detect();
    };
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Graphics::Renderer๋ž‘ Physics::Vector์ฒ˜๋Ÿผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์–ด!
๊ทผ๋ฐ ๋งค๋ฒˆ ์ „์ฒด ๊ฒฝ๋กœ ์“ฐ๊ธฐ ๊ท€์ฐฎ์œผ๋ฉด using ์„ ์–ธ์„ ์“ฐ๋ฉด ๋ผ.

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์‚ฌ์šฉ ํŒจํ„ด ๐ŸŽฏ

โœ… ์ข‹์€ ์˜ˆ์‹œ

// ๊ตฌํ˜„ ํŒŒ์ผ(.cpp)์—์„œ๋งŒ ์‚ฌ์šฉ
using namespace Graphics;

void render() {
    Renderer r;
    r.draw();
}

๊ตฌํ˜„ ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋Š” ํŽธํ•˜๊ฒŒ ์จ๋„ OK!

โŒ ๋‚˜์œ ์˜ˆ์‹œ

// ํ—ค๋” ํŒŒ์ผ(.h)์—์„œ ์‚ฌ์šฉ
using namespace std;

class MyClass {
    vector<int> data;
};

ํ—ค๋”์—์„œ using namespace๋Š” ์žฌ์•™์˜ ์‹œ์ž‘ ใ…‹ใ…‹

ํ—ค๋” ํŒŒ์ผ์— using namespace ์“ฐ๋ฉด ๊ทธ ํ—ค๋”๋ฅผ includeํ•˜๋Š” ๋ชจ๋“  ํŒŒ์ผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฑฐ๋“ ?
์ด๊ฑฐ ์ง„์งœ ๋””๋ฒ„๊น… ์ง€์˜ฅ์œผ๋กœ ๊ฐ€๋Š” ์ง€๋ฆ„๊ธธ์ด์•ผ... ๐Ÿ˜ฑ

๐ŸŒŸ Pro Tip! ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํšŒ์‚ฌ๋‚˜ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์œผ๋กœ ์ตœ์ƒ์œ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ ,
๊ทธ ์•ˆ์— ๊ธฐ๋Šฅ๋ณ„๋กœ ํ•˜์œ„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด์•ผ!

์˜ˆ: MyCompany::Graphics::Rendering::OpenGL

์ค‘์ฒฉ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ์ธ๋ผ์ธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๐ŸŽญ

C++17๋ถ€ํ„ฐ๋Š” ์ค‘์ฒฉ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์–ด!

// C++17 ์ด์ „
namespace MyCompany {
    namespace Graphics {
        namespace Rendering {
            class Engine { };
        }
    }
}

// C++17 ์ดํ›„ - ํ›จ์”ฌ ๊น”๋”!
namespace MyCompany::Graphics::Rendering {
    class Engine { };
}

์ธ๋ผ์ธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌํ•  ๋•Œ ๊ฐœ๊ฟ€์ด์•ผ ใ…‹ใ…‹ใ…‹
API ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋ฉด์„œ๋„ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ !

namespace MyLib {
    inline namespace v2 {  // ๊ธฐ๋ณธ ๋ฒ„์ „
        class Widget {
            void newFeature();
        };
    }
    
    namespace v1 {  // ๋ ˆ๊ฑฐ์‹œ ๋ฒ„์ „
        class Widget {
            void oldFeature();
        };
    }
}

// ์‚ฌ์šฉํ•  ๋•Œ
MyLib::Widget w;  // v2::Widget์ด ์ž๋™ ์„ ํƒ๋จ!
MyLib::v1::Widget oldW;  // ๋ช…์‹œ์ ์œผ๋กœ v1 ์‚ฌ์šฉ

์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด!
๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ ์œ ์ง€๋ณด์ˆ˜ํ•  ๋•Œ ์ง„์งœ ์œ ์šฉํ•จ ๐Ÿ‘

์ต๋ช… ๋„ค์ž„์ŠคํŽ˜์ด์Šค - ๋‚ด๋ถ€ ๋งํฌ์˜ ๋งˆ๋ฒ• โœจ

์ต๋ช… ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํ—ฌํผ ํ•จ์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์“ฐ๋Š”๋ฐ,
static ํ‚ค์›Œ๋“œ๋ณด๋‹ค ๋” C++์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ด์•ผ!

// utils.cpp
namespace {  // ์ต๋ช… ๋„ค์ž„์ŠคํŽ˜์ด์Šค
    const int BUFFER_SIZE = 1024;
    
    void internalHelper() {
        // ์ด ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ
    }
}

void publicFunction() {
    internalHelper();  // OK!
    // ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€
}

์ต๋ช… ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์˜ ๋‚ด์šฉ์€ ์™ธ๋ถ€ ๋งํฌ๊ฐ€ ์—†์–ด์„œ ๋‹ค๋ฅธ ๋ฒˆ์—ญ ๋‹จ์œ„(translation unit)์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด.
์ด๊ฒŒ ๋ฐ”๋กœ ์ง„์ •ํ•œ ์บก์Аํ™”์ง€! ๐Ÿ”’

๐Ÿš€ C++20 ๋ชจ๋“ˆ ์‹œ์Šคํ…œ - ๊ฒŒ์ž„ ์ฒด์ธ์ €์˜ ๋“ฑ์žฅ

์ž ์ด์ œ ์ง„์งœ ํ˜๋ช…์ ์ธ ๊ธฐ๋Šฅ์ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์–˜๊ธฐ๋ฅผ ํ•ด๋ณผ๊ฒŒ!
C++20์—์„œ ๋“œ๋””์–ด ์ •์‹์œผ๋กœ ๋„์ž…๋๋Š”๋ฐ, ์ด๊ฑฐ ์ง„์งœ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค˜ ๐ŸŽ‰

์ „ํ†ต์ ์ธ ํ—ค๋” ํŒŒ์ผ์˜ ๋ฌธ์ œ์  ๐Ÿ˜ค

๊ธฐ์กด C++๋Š” #include ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์ž–์•„?
๊ทผ๋ฐ ์ด๊ฒŒ ์ง„์งœ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•„...

โš ๏ธ ํ—ค๋” ํŒŒ์ผ ๋ฐฉ์‹์˜ ํ•œ๊ณ„ 1๏ธโƒฃ ์ค‘๋ณต ์ปดํŒŒ์ผ: ๊ฐ™์€ ํ—ค๋”๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํŒŒ์‹ฑํ•˜๊ณ  ์ปดํŒŒ์ผ
2๏ธโƒฃ ๋งคํฌ๋กœ ์˜ค์—ผ: ํ—ค๋”์˜ ๋งคํฌ๋กœ๊ฐ€ ์ „์—ญ์œผ๋กœ ํผ์ง
3๏ธโƒฃ ์ˆœํ™˜ ์˜์กด์„ฑ: ํ—ค๋” ๊ฐ„ ์ƒํ˜ธ ์ฐธ์กฐ๋กœ ์ธํ•œ ๋ณต์žก๋„ ์ฆ๊ฐ€
4๏ธโƒฃ ๋А๋ฆฐ ๋นŒ๋“œ: ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ํญ์ฆ
5๏ธโƒฃ ๋ถˆ๋ช…ํ™•ํ•œ ์ธํ„ฐํŽ˜์ด์Šค: ๋ฌด์—‡์ด ๊ณต๊ฐœ API์ธ์ง€ ํŒŒ์•… ์–ด๋ ค์›€

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. <iostream> ํ•˜๋‚˜๋งŒ includeํ•ด๋„ ์ˆ˜๋งŒ ์ค„์˜ ์ฝ”๋“œ๊ฐ€ ํŒŒ์‹ฑ๋˜๊ฑฐ๋“ ?
์ด๊ฒŒ 100๊ฐœ ํŒŒ์ผ์—์„œ include๋˜๋ฉด... ์ƒ์ƒ๋งŒ ํ•ด๋„ ๋”์ฐ ใ…‹ใ…‹ใ…‹

๋ชจ๋“ˆ์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• ๐Ÿ’ช

๋ชจ๋“ˆ์€ ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด!
ํ•œ ๋ฒˆ ์ปดํŒŒ์ผ๋œ ๋ชจ๋“ˆ์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๊ณ , ๋‹ค๋ฅธ ๊ณณ์—์„œ importํ•  ๋•Œ๋Š” ๊ทธ๋ƒฅ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ผ.

๐Ÿ“ ๋ชจ๋“ˆ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

// math_utils.ixx (๋ชจ๋“ˆ ์ธํ„ฐํŽ˜์ด์Šค ํŒŒ์ผ)
export module math_utils;  // ๋ชจ๋“ˆ ์„ ์–ธ

export namespace MathUtils {
    int add(int a, int b) {
        return a + b;
    }
    
    int multiply(int a, int b) {
        return a * b;
    }
}

// ๋‚ด๋ถ€ ๊ตฌํ˜„ (export ์•ˆ ๋ถ™์ด๋ฉด ๋น„๊ณต๊ฐœ)
namespace {
    int internalHelper() {
        return 42;
    }
}
๐Ÿ“ ๋ชจ๋“ˆ ์‚ฌ์šฉํ•˜๊ธฐ

// main.cpp
import math_utils;  // #include ๋Œ€์‹  import!

int main() {
    int result = MathUtils::add(10, 20);
    // internalHelper()๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€ - ์บก์Аํ™” ์™„๋ฒฝ!
    return 0;
}

๋ณด์ด์ง€? #include ๋Œ€์‹  import๋ฅผ ์“ฐ๊ณ ,
export ํ‚ค์›Œ๋“œ๋กœ ๊ณต๊ฐœํ•  ๊ฒƒ๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด!
์ด๊ฒŒ ๋ฐ”๋กœ ๋ช…ํ™•ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜์•ผ! ๐ŸŽฏ

ํ—ค๋” vs ๋ชจ๋“ˆ ์ปดํŒŒ์ผ ๊ณผ์ • ๋น„๊ต ์ „ํ†ต์  ํ—ค๋” ๋ฐฉ์‹ header.h ํŒŒ์‹ฑ file1.cpp ์ปดํŒŒ์ผ file2.cpp ์ปดํŒŒ์ผ header.h ๋‹ค์‹œ ํŒŒ์‹ฑ (์ค‘๋ณต!) header.h ๋˜ ํŒŒ์‹ฑ (์ค‘๋ณต!) ๋ชจ๋“ˆ ๋ฐฉ์‹ module ์ปดํŒŒ์ผ (๋‹จ ํ•œ ๋ฒˆ!) BMI ์ƒ์„ฑ file1.cpp BMI import file2.cpp BMI import โฑ๏ธ ๋А๋ฆผ + ์ค‘๋ณต ์ž‘์—… โšก ๋น ๋ฆ„ + ํšจ์œจ์ 

๋ชจ๋“ˆ์˜ ํ•ต์‹ฌ ๊ฐœ๋…๋“ค ๐Ÿ”‘

1๏ธโƒฃ ๋ชจ๋“ˆ ์ธํ„ฐํŽ˜์ด์Šค ์œ ๋‹› (Module Interface Unit)
export module๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์ผ์ด์•ผ.
์™ธ๋ถ€์— ๊ณต๊ฐœํ•  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณณ์ด์ง€!

2๏ธโƒฃ ๋ชจ๋“ˆ ๊ตฌํ˜„ ์œ ๋‹› (Module Implementation Unit)
module๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์ผ.
๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•˜๊ณ , export ์—†์ด ์ž‘์„ฑํ•ด.

3๏ธโƒฃ ๋ชจ๋“ˆ ํŒŒํ‹ฐ์…˜ (Module Partition)
ํฐ ๋ชจ๋“ˆ์„ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋‚˜๋ˆŒ ๋•Œ ์‚ฌ์šฉ!
์ด๊ฑฐ ์ง„์งœ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ํ•„์ˆ˜์•ผ ใ…‹ใ…‹

๐Ÿ“ฆ ๋ชจ๋“ˆ ํŒŒํ‹ฐ์…˜ ์˜ˆ์‹œ

// graphics-rendering.ixx (ํŒŒํ‹ฐ์…˜)
export module graphics:rendering;

export class Renderer {
    void draw();
};

// graphics-shaders.ixx (ํŒŒํ‹ฐ์…˜)
export module graphics:shaders;

export class Shader {
    void compile();
};

// graphics.ixx (๋ฉ”์ธ ๋ชจ๋“ˆ)
export module graphics;

export import :rendering;  // ํŒŒํ‹ฐ์…˜ ์žฌ๊ณต๊ฐœ
export import :shaders;

// main.cpp
import graphics;  // ๋ชจ๋“  ํŒŒํ‹ฐ์…˜ ์ž๋™ ํฌํ•จ!

Renderer r;
Shader s;

ํŒŒํ‹ฐ์…˜์„ ์“ฐ๋ฉด ๋ชจ๋“ˆ์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„ํ• ํ•˜๋ฉด์„œ๋„ ์™ธ๋ถ€์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด!
์ด๊ฒŒ ๋ฐ”๋กœ ๋ชจ๋“ˆ์„ฑ๊ณผ ํŽธ์˜์„ฑ์˜ ์™„๋ฒฝํ•œ ์กฐํ™” ๐Ÿ‘Œ

์ „์—ญ ๋ชจ๋“ˆ ํ”„๋ž˜๊ทธ๋จผํŠธ ๐ŸŒ

๋ ˆ๊ฑฐ์‹œ ํ—ค๋”๋ž‘ ๋ชจ๋“ˆ์„ ํ•จ๊ป˜ ์จ์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์ž–์•„?
๊ทธ๋Ÿด ๋•Œ ์ „์—ญ ๋ชจ๋“ˆ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•ด!

module;  // ์ „์—ญ ๋ชจ๋“ˆ ํ”„๋ž˜๊ทธ๋จผํŠธ ์‹œ์ž‘

// ์—ฌ๊ธฐ์„œ๋Š” ์ „ํ†ต์ ์ธ #include ์‚ฌ์šฉ ๊ฐ€๋Šฅ
#include <vector>
#include <string>
#include "legacy_header.h"

export module my_module;  // ์‹ค์ œ ๋ชจ๋“ˆ ์‹œ์ž‘

export class MyClass {
    std::vector<std::string> data;
    // legacy_header.h์˜ ํƒ€์ž…๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
};

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ ์ง„์ ์œผ๋กœ ๋ชจ๋“ˆ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด!
์‹ค๋ฌด์—์„œ ์ง„์งœ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด์•ผ ๐Ÿ’ฏ

๐Ÿ—๏ธ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐํ™” ์ „๋žต

์ž ์ด์ œ ์‹ค์ „์ด์•ผ!
๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ž‘ ๋ชจ๋“ˆ์„ ์–ด๋–ป๊ฒŒ ์กฐํ•ฉํ•ด์„œ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์กฐํ™”ํ• ์ง€ ์•Œ์•„๋ณด์ž ๐ŸŽฏ

๊ณ„์ธต์  ๊ตฌ์กฐ ์„ค๊ณ„ ์›์น™ ๐Ÿ“

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD) ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๊ฒŒ ์ข‹์•„.
๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ค‘์‹ฌ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋‚˜๋ˆ„๋Š” ๊ฑฐ์ง€!

๐ŸŽจ ์ถ”์ฒœ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

MyGameEngine/
โ”œโ”€โ”€ Core/
โ”‚   โ”œโ”€โ”€ core.ixx              (export module engine.core)
โ”‚   โ”œโ”€โ”€ memory.ixx            (export module engine.core:memory)
โ”‚   โ””โ”€โ”€ threading.ixx         (export module engine.core:threading)
โ”œโ”€โ”€ Graphics/
โ”‚   โ”œโ”€โ”€ graphics.ixx          (export module engine.graphics)
โ”‚   โ”œโ”€โ”€ rendering.ixx         (ํŒŒํ‹ฐ์…˜)
โ”‚   โ”œโ”€โ”€ shaders.ixx           (ํŒŒํ‹ฐ์…˜)
โ”‚   โ””โ”€โ”€ textures.ixx          (ํŒŒํ‹ฐ์…˜)
โ”œโ”€โ”€ Physics/
โ”‚   โ”œโ”€โ”€ physics.ixx           (export module engine.physics)
โ”‚   โ”œโ”€โ”€ collision.ixx         (ํŒŒํ‹ฐ์…˜)
โ”‚   โ””โ”€โ”€ dynamics.ixx          (ํŒŒํ‹ฐ์…˜)
โ””โ”€โ”€ Audio/
    โ”œโ”€โ”€ audio.ixx             (export module engine.audio)
    โ””โ”€โ”€ mixer.ixx             (ํŒŒํ‹ฐ์…˜)

๊ฐ ๋ชจ๋“ˆ ์•ˆ์—์„œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ถ”๊ฐ€ ๊ตฌ์กฐํ™”๋ฅผ ํ•ด์ฃผ๋Š” ๊ฑฐ์•ผ!

// graphics.ixx
export module engine.graphics;

export namespace Engine::Graphics {
    namespace Rendering {
        class Renderer { };
        class Pipeline { };
    }
    
    namespace Shaders {
        class ShaderProgram { };
        class ShaderCompiler { };
    }
    
    namespace Textures {
        class Texture2D { };
        class TextureCache { };
    }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Engine::Graphics::Rendering::Renderer์ฒ˜๋Ÿผ
๋ช…ํ™•ํ•œ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉด์„œ๋„ ๋ชจ๋“ˆ์˜ ๋น ๋ฅธ ์ปดํŒŒ์ผ ์†๋„๋ฅผ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์–ด! ๐Ÿš€

์˜์กด์„ฑ ๊ด€๋ฆฌ ์ „๋žต ๐Ÿ”—

๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒŒ ์˜์กด์„ฑ ๊ด€๋ฆฌ์•ผ.
์ˆœํ™˜ ์˜์กด์„ฑ์€ ์ง„์งœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ง์น˜๋Š” ์ง€๋ฆ„๊ธธ์ด๊ฑฐ๋“  ใ…‹ใ…‹ใ…‹

๐ŸŽฏ ์˜์กด์„ฑ ๊ด€๋ฆฌ ํ™ฉ๊ธˆ๋ฅ  1๏ธโƒฃ ๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ: ์ƒ์œ„ ๋ ˆ์ด์–ด๋งŒ ํ•˜์œ„ ๋ ˆ์ด์–ด์— ์˜์กด
2๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ: ํฐ ๋ชจ๋“ˆ์€ ์ž‘์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„ํ• 
3๏ธโƒฃ ์˜์กด์„ฑ ์—ญ์ „: ๊ตฌ์ฒด ํด๋ž˜์Šค ๋Œ€์‹  ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กด
4๏ธโƒฃ ์ˆœํ™˜ ์ œ๊ฑฐ: ๋ชจ๋“ˆ ๊ฐ„ ์ˆœํ™˜ ์ฐธ์กฐ ์ ˆ๋Œ€ ๊ธˆ์ง€!
โœ… ์ข‹์€ ์˜์กด์„ฑ ๊ตฌ์กฐ

// ๊ณ„์ธต์  ์˜์กด์„ฑ (OK!)
Application Layer
    โ†“ (์˜์กด)
Business Logic Layer
    โ†“ (์˜์กด)
Data Access Layer
    โ†“ (์˜์กด)
Core Utilities

// ๊ฐ ๋ ˆ์ด์–ด๋Š” ๋ชจ๋“ˆ๋กœ ๊ตฌํ˜„
export module app.ui;
import app.business;  // ํ•˜์œ„ ๋ ˆ์ด์–ด๋งŒ import

export module app.business;
import app.data;      // ํ•˜์œ„ ๋ ˆ์ด์–ด๋งŒ import

export module app.data;
import app.core;      // ์ตœํ•˜์œ„ ๋ ˆ์ด์–ด
โŒ ๋‚˜์œ ์˜์กด์„ฑ ๊ตฌ์กฐ (์ˆœํ™˜ ์˜์กด)

// ์ด๋Ÿฌ๋ฉด ์•ˆ ๋ผ!
export module graphics;
import physics;  // Graphics๊ฐ€ Physics ์˜์กด

export module physics;
import graphics;  // Physics๊ฐ€ Graphics ์˜์กด
// โ†’ ์ˆœํ™˜ ์˜์กด์„ฑ ๋ฐœ์ƒ! ์ปดํŒŒ์ผ ์—๋Ÿฌ!

์ด๋Ÿฐ ๊ฒฝ์šฐ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•ด!

์ˆœํ™˜ ์˜์กด์„ฑ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ด.
๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ„๋„ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฑฐ์ง€!

โœ… ์ˆœํ™˜ ์˜์กด์„ฑ ํ•ด๊ฒฐ

// common.ixx - ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค
export module engine.common;

export namespace Engine {
    class IRenderable {  // ์ธํ„ฐํŽ˜์ด์Šค
        virtual void render() = 0;
    };
}

// graphics.ixx
export module engine.graphics;
import engine.common;

export namespace Engine::Graphics {
    class Renderer {
        void draw(IRenderable* obj);
    };
}

// physics.ixx
export module engine.physics;
import engine.common;

export namespace Engine::Physics {
    class PhysicsObject : public IRenderable {
        void render() override;
    };
}

์ด์ œ Graphics๋ž‘ Physics๊ฐ€ ์„œ๋กœ ์ง์ ‘ ์˜์กดํ•˜์ง€ ์•Š๊ณ ,
๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๊ฒŒ ๋ผ!
์ด๊ฒŒ ๋ฐ”๋กœ ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)์˜ ์‹ค์ „ ์ ์šฉ์ด์•ผ ๐Ÿ’ช

๋นŒ๋“œ ์‹œ์Šคํ…œ ํ†ตํ•ฉ ๐Ÿ› ๏ธ

๋ชจ๋“ˆ์„ ์‹ค์ œ๋กœ ์“ฐ๋ ค๋ฉด ๋นŒ๋“œ ์‹œ์Šคํ…œ ์„ค์ •์ด ์ค‘์š”ํ•ด!
์ฃผ์š” ๋นŒ๋“œ ์‹œ์Šคํ…œ๋ณ„๋กœ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

CMake ์„ค์ • (๊ฐ€์žฅ ๋งŽ์ด ์”€!)

# CMakeLists.txt
cmake_minimum_required(VERSION 3.28)  # ๋ชจ๋“ˆ ์ง€์› ๋ฒ„์ „
project(MyProject CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ๋ชจ๋“ˆ ์ง€์› ํ™œ์„ฑํ™”
set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "aa1f7df0-828a-4fcd-9afc-2dc80491aca7")
set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP ON)

# ๋ชจ๋“ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
add_library(graphics)
target_sources(graphics
    PUBLIC
        FILE_SET CXX_MODULES FILES
        graphics.ixx
        rendering.ixx
        shaders.ixx
)

# ์‹คํ–‰ ํŒŒ์ผ
add_executable(game main.cpp)
target_link_libraries(game PRIVATE graphics)

CMake 3.28๋ถ€ํ„ฐ ๋ชจ๋“ˆ์„ ์ œ๋Œ€๋กœ ์ง€์›ํ•˜๋Š”๋ฐ,
์•„์ง ์‹คํ—˜์  ๊ธฐ๋Šฅ์ด๋ผ ์„ค์ •์ด ์ข€ ๋ณต์žกํ•ด ใ… ใ… 
ํ•˜์ง€๋งŒ ์ ์  ๊ฐœ์„ ๋˜๊ณ  ์žˆ์œผ๋‹ˆ ๊ธฐ๋Œ€ํ•ด๋„ ์ข‹์•„!

Visual Studio ์„ค์ •

VS 2022๋ถ€ํ„ฐ๋Š” ๋ชจ๋“ˆ์„ GUI์—์„œ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด!
ํ”„๋กœ์ ํŠธ ์†์„ฑ โ†’ C/C++ โ†’ Language โ†’ Enable C++ Modules๋ฅผ Yes๋กœ ์„ค์ •ํ•˜๋ฉด ๋ ใ…‹ใ…‹

Clang/GCC ์„ค์ •

# Clang (libc++ ์‚ฌ์šฉ)
clang++ -std=c++20 -stdlib=libc++ -fmodules \
    --precompile graphics.ixx -o graphics.pcm
clang++ -std=c++20 -stdlib=libc++ -fmodules \
    -fmodule-file=graphics.pcm main.cpp graphics.pcm -o game

# GCC (์•„์ง ๋ถ€๋ถ„ ์ง€์›)
g++ -std=c++20 -fmodules-ts \
    -xc++-system-header iostream
g++ -std=c++20 -fmodules-ts \
    graphics.ixx main.cpp -o game

์ปดํŒŒ์ผ๋Ÿฌ๋งˆ๋‹ค ๋ชจ๋“ˆ ์ง€์› ์ˆ˜์ค€์ด ๋‹ค๋ฅด๋‹ˆ๊นŒ,
ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ ์ „์— ํƒ€๊ฒŸ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋ชจ๋“ˆ ์ง€์› ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด! ๐ŸŽฏ

โšก ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ๋ดค์œผ๋‹ˆ ์ด์ œ ์‹ค์ „ ํŒ๋“ค์„ ๊ณต์œ ํ• ๊ฒŒ!
์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์จ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ฟ€ํŒ๋“ค์ด์•ผ ๐Ÿฏ

์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ตœ์ ํ™” ์ „๋žต โšก

๋ชจ๋“ˆ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด ๋น ๋ฅธ ์ปดํŒŒ์ผ์ธ๋ฐ,
์ œ๋Œ€๋กœ ํ™œ์šฉ ์•ˆ ํ•˜๋ฉด ์˜คํžˆ๋ ค ๋А๋ ค์งˆ ์ˆ˜๋„ ์žˆ์–ด ใ…‹ใ…‹ใ…‹

๐Ÿš€ ์ปดํŒŒ์ผ ์†๋„ ํ–ฅ์ƒ ํŒ 1๏ธโƒฃ ๋ชจ๋“ˆ ํฌ๊ธฐ ์ ์ ˆํžˆ ์œ ์ง€: ๋„ˆ๋ฌด ํฌ๋ฉด ์žฌ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ฆ๊ฐ€
2๏ธโƒฃ ํŒŒํ‹ฐ์…˜ ์ ๊ทน ํ™œ์šฉ: ๋ณ€๊ฒฝ ๋นˆ๋„์— ๋”ฐ๋ผ ํŒŒํ‹ฐ์…˜ ๋ถ„๋ฆฌ
3๏ธโƒฃ ์ „๋ฐฉ ์„ ์–ธ ํ™œ์šฉ: ๋ถˆํ•„์š”ํ•œ import ์ค„์ด๊ธฐ
4๏ธโƒฃ ํ”„๋ฆฌ์ปดํŒŒ์ผ๋“œ ๋ชจ๋“ˆ: ์ž์ฃผ ์“ฐ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ
5๏ธโƒฃ ๋ณ‘๋ ฌ ๋นŒ๋“œ: ๋…๋ฆฝ์ ์ธ ๋ชจ๋“ˆ์€ ๋™์‹œ ์ปดํŒŒ์ผ
๐Ÿ“Š ์‹ค์ œ ์„ฑ๋Šฅ ๋น„๊ต (10๋งŒ ์ค„ ํ”„๋กœ์ ํŠธ ๊ธฐ์ค€)

์ „ํ†ต์  ํ—ค๋” ๋ฐฉ์‹:
- ํ’€ ๋นŒ๋“œ: 8๋ถ„ 30์ดˆ
- ์ฆ๋ถ„ ๋นŒ๋“œ: 45์ดˆ
- ํ—ค๋” ๋ณ€๊ฒฝ ์‹œ: 3๋ถ„ 20์ดˆ

๋ชจ๋“ˆ ๋ฐฉ์‹:
- ํ’€ ๋นŒ๋“œ: 3๋ถ„ 10์ดˆ (63% ๊ฐœ์„ ! ๐ŸŽ‰)
- ์ฆ๋ถ„ ๋นŒ๋“œ: 12์ดˆ (73% ๊ฐœ์„ !)
- ๋ชจ๋“ˆ ๋ณ€๊ฒฝ ์‹œ: 25์ดˆ (87% ๊ฐœ์„ !)

โ†’ ํŠนํžˆ ์ฆ๋ถ„ ๋นŒ๋“œ์—์„œ ์••๋„์  ์ฐจ์ด!

์‹ค์ œ๋กœ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“ˆ ๋„์ž… ํ›„ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ์—„์ฒญ ์˜ฌ๋ผ๊ฐ”๋‹ค๋Š” ํ›„๊ธฐ๊ฐ€ ๋งŽ์•„!
์ปดํŒŒ์ผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์— ์ปคํ”ผ ๋งˆ์‹œ๋Ÿฌ ๊ฐˆ ํ•„์š”๊ฐ€ ์—†์–ด์ง„ ๊ฑฐ์ง€ ใ…‹ใ…‹ใ…‹ โ˜•

๋ชจ๋“ˆ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„ ์›์น™ ๐ŸŽจ

๋ชจ๋“ˆ์˜ ๊ณต๊ฐœ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์‹ ์ค‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•ด.
ํ•œ ๋ฒˆ ๊ณต๊ฐœํ•˜๋ฉด ๋ฐ”๊พธ๊ธฐ ์–ด๋ ต๊ฑฐ๋“ !

โœ… ์ข‹์€ ๋ชจ๋“ˆ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„

export module database;

// 1. ๋ช…ํ™•ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค
export namespace DB {
    // 2. ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
    class IConnection {
    public:
        virtual ~IConnection() = default;
        virtual bool connect(const std::string& url) = 0;
        virtual void disconnect() = 0;
    };
    
    // 3. ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ ์ˆจ๊ธฐ๊ธฐ
    std::unique_ptr<IConnection> createConnection(
        const std::string& type
    );
    
    // 4. ํ•„์š”ํ•œ ํƒ€์ž…๋งŒ ๊ณต๊ฐœ
    enum class ConnectionType {
        MySQL, PostgreSQL, SQLite
    };
    
    // 5. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
    std::string escapeString(const std::string& str);
}

// ๋‚ด๋ถ€ ๊ตฌํ˜„์€ export ์•ˆ ํ•จ (์บก์Аํ™”!)
namespace DB::Internal {
    class MySQLConnection : public IConnection {
        // ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ
    };
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์ž์œ ๋กญ๊ฒŒ ๋ฐ”๊ฟ”๋„ ์™ธ๋ถ€ ์ฝ”๋“œ๋Š” ์˜ํ–ฅ ์•ˆ ๋ฐ›์•„!
์ด๊ฒŒ ๋ฐ”๋กœ ์ง„์ •ํ•œ ์ •๋ณด ์€๋‹‰์ด์ง€ ๐Ÿ”’

๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ณ„์นญ๊ณผ using ์„ ์–ธ ํ™œ์šฉ ๐Ÿท๏ธ

๊ธด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฒฝ๋กœ๋Š” ๋ณ„์นญ์œผ๋กœ ์งง๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด!

// ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ณ„์นญ
namespace GFX = MyCompany::GameEngine::Graphics::Rendering;

GFX::Renderer renderer;  // ํ›จ์”ฌ ๊ฐ„๊ฒฐ!

// using ์„ ์–ธ (ํŠน์ • ํƒ€์ž…๋งŒ)
using MyCompany::GameEngine::Physics::Vector3D;

Vector3D position;  // ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ๋žต

// using ์ง€์‹œ๋ฌธ (๋กœ์ปฌ ์Šค์ฝ”ํ”„์—์„œ๋งŒ!)
void render() {
    using namespace MyCompany::GameEngine::Graphics;
    // ์ด ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ ์ ์šฉ
    Renderer r;
    Shader s;
}

๋ณ„์นญ์€ ํŠนํžˆ ํ…œํ”Œ๋ฆฟ ํƒ€์ž… ๋‹ค๋ฃฐ ๋•Œ ๊ฐœ๊ฟ€์ด์•ผ ใ…‹ใ…‹

// ๋ณต์žกํ•œ ํ…œํ”Œ๋ฆฟ ํƒ€์ž… ๋ณ„์นญ
namespace Utils {
    template<typename T>
    using SharedPtr = std::shared_ptr<T>;
    
    template<typename K, typename V>
    using HashMap = std::unordered_map<K, V>;
}

Utils::SharedPtr<Player> player;
Utils::HashMap<int, std::string> idToName;

์ด๋Ÿฐ ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ์ผ๊ด€๋œ ํƒ€์ž… ๋ณ„์นญ์„ ์“ฐ๋ฉด
๋‚˜์ค‘์— ๊ตฌํ˜„ ๋ฐ”๊พธ๊ธฐ๋„ ์‰ฝ๊ณ  ๊ฐ€๋…์„ฑ๋„ ์ข‹์•„์ ธ! ๐Ÿ‘

ํ—ค๋” ์œ ๋‹› - ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์™€์˜ ๋‹ค๋ฆฌ ๐ŸŒ‰

๊ธฐ์กด ํ—ค๋” ํŒŒ์ผ์„ ๋ชจ๋“ˆ์ฒ˜๋Ÿผ importํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด!
์ด๊ฒŒ ๋ฐ”๋กœ ํ—ค๋” ์œ ๋‹›(Header Unit)์ด์•ผ.

// ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ—ค๋”๋ฅผ ๋ชจ๋“ˆ์ฒ˜๋Ÿผ import
import <iostream>;
import <vector>;
import <string>;

// ์ „ํ†ต์ ์ธ #include๋ณด๋‹ค ๋น ๋ฆ„!
int main() {
    std::vector<std::string> names;
    std::cout << "Hello Module!\n";
}

ํ—ค๋” ์œ ๋‹›์€ ์™„์ „ํ•œ ๋ชจ๋“ˆ์€ ์•„๋‹ˆ์ง€๋งŒ,
์ปดํŒŒ์ผ ์†๋„ ํ–ฅ์ƒ ํšจ๊ณผ๋Š” ํ™•์‹คํžˆ ์žˆ์–ด!
๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋ชจ๋˜ํ™”ํ•  ๋•Œ ์œ ์šฉํ•˜์ง€ โœจ

๐ŸŽฏ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์˜ˆ์ œ

์ด๋ก ๋งŒ ๋ณด๋ฉด ์žฌ๋ฏธ์—†์œผ๋‹ˆ๊นŒ ์‹ค์ œ ๊ฒŒ์ž„ ์—”์ง„ ๊ตฌ์กฐ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณผ๊ฒŒ!
์ง„์งœ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€ ๋ณด์—ฌ์ค„๊ฒŒ ๐ŸŽฎ

๊ฒŒ์ž„ ์—”์ง„ ๋ชจ๋“ˆ ๊ตฌ์กฐ ์„ค๊ณ„ ๐ŸŽฎ

๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

AwesomeEngine/
โ”œโ”€โ”€ Core/
โ”‚   โ”œโ”€โ”€ core.ixx                    (๋ฉ”์ธ ๋ชจ๋“ˆ)
โ”‚   โ”œโ”€โ”€ core-memory.ixx             (๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ)
โ”‚   โ”œโ”€โ”€ core-threading.ixx          (๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ)
โ”‚   โ””โ”€โ”€ core-math.ixx               (์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)
โ”œโ”€โ”€ Platform/
โ”‚   โ”œโ”€โ”€ platform.ixx                (ํ”Œ๋žซํผ ์ถ”์ƒํ™”)
โ”‚   โ”œโ”€โ”€ platform-windows.ixx        (Windows ๊ตฌํ˜„)
โ”‚   โ””โ”€โ”€ platform-linux.ixx          (Linux ๊ตฌํ˜„)
โ”œโ”€โ”€ Graphics/
โ”‚   โ”œโ”€โ”€ graphics.ixx                (๊ทธ๋ž˜ํ”ฝ์Šค ๋ฉ”์ธ)
โ”‚   โ”œโ”€โ”€ graphics-renderer.ixx       (๋ Œ๋”๋Ÿฌ)
โ”‚   โ”œโ”€โ”€ graphics-shader.ixx         (์…ฐ์ด๋”)
โ”‚   โ””โ”€โ”€ graphics-texture.ixx        (ํ…์Šค์ฒ˜)
โ”œโ”€โ”€ Physics/
โ”‚   โ”œโ”€โ”€ physics.ixx                 (๋ฌผ๋ฆฌ ์—”์ง„)
โ”‚   โ”œโ”€โ”€ physics-collision.ixx       (์ถฉ๋Œ ๊ฐ์ง€)
โ”‚   โ””โ”€โ”€ physics-dynamics.ixx        (๋™์—ญํ•™)
โ””โ”€โ”€ Game/
    โ”œโ”€โ”€ game.ixx                    (๊ฒŒ์ž„ ๋กœ์ง)
    โ””โ”€โ”€ game-entities.ixx           (์—”ํ‹ฐํ‹ฐ ์‹œ์Šคํ…œ)

๊ฐ ๋ชจ๋“ˆ์„ ํ•˜๋‚˜์”ฉ ๊ตฌํ˜„ํ•ด๋ณด์ž!

1๏ธโƒฃ Core ๋ชจ๋“ˆ - ์—”์ง„์˜ ์‹ฌ์žฅ ๐Ÿ’“

// core-math.ixx
export module engine.core:math;

export namespace Engine::Core::Math {
    struct Vector3 {
        float x, y, z;
        
        Vector3 operator+(const Vector3& other) const {
            return {x + other.x, y + other.y, z + other.z};
        }
        
        float length() const {
            return std::sqrt(x*x + y*y + z*z);
        }
    };
    
    struct Matrix4x4 {
        float data[16];
        
        Matrix4x4 operator*(const Matrix4x4& other) const;
        Vector3 transform(const Vector3& v) const;
    };
    
    // ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค
    float lerp(float a, float b, float t);
    Vector3 normalize(const Vector3& v);
}
// core.ixx (๋ฉ”์ธ ๋ชจ๋“ˆ)
export module engine.core;

export import :math;
export import :memory;
export import :threading;

export namespace Engine::Core {
    // ์—”์ง„ ์ดˆ๊ธฐํ™”
    class Engine {
    public:
        static Engine& instance();
        
        bool initialize();
        void shutdown();
        void update(float deltaTime);
        
    private:
        Engine() = default;
        bool isInitialized = false;
    };
}

2๏ธโƒฃ Graphics ๋ชจ๋“ˆ - ํ™”๋ คํ•œ ๋น„์ฃผ์–ผ โœจ

// graphics-renderer.ixx
export module engine.graphics:renderer;

import engine.core;

export namespace Engine::Graphics {
    class Renderer {
    public:
        virtual ~Renderer() = default;
        
        virtual bool initialize() = 0;
        virtual void beginFrame() = 0;
        virtual void endFrame() = 0;
        virtual void draw(const Mesh& mesh) = 0;
    };
    
    // ํŒฉํ† ๋ฆฌ ํŒจํ„ด
    enum class RendererAPI {
        OpenGL, Vulkan, DirectX12
    };
    
    std::unique_ptr<Renderer> createRenderer(
        RendererAPI api
    );
}

// ๋‚ด๋ถ€ ๊ตฌํ˜„ (export ์•ˆ ํ•จ)
namespace Engine::Graphics::Internal {
    class OpenGLRenderer : public Renderer {
        // OpenGL ๊ตฌํ˜„
    };
    
    class VulkanRenderer : public Renderer {
        // Vulkan ๊ตฌํ˜„
    };
}

3๏ธโƒฃ Physics ๋ชจ๋“ˆ - ํ˜„์‹ค์ ์ธ ๋ฌผ๋ฆฌ ๐ŸŒ

// physics.ixx
export module engine.physics;

import engine.core;

export namespace Engine::Physics {
    class RigidBody {
    public:
        void applyForce(const Core::Math::Vector3& force);
        void applyImpulse(const Core::Math::Vector3& impulse);
        
        Core::Math::Vector3 getVelocity() const;
        void setVelocity(const Core::Math::Vector3& v);
        
    private:
        Core::Math::Vector3 velocity{0, 0, 0};
        Core::Math::Vector3 acceleration{0, 0, 0};
        float mass = 1.0f;
    };
    
    class PhysicsWorld {
    public:
        void addRigidBody(RigidBody* body);
        void removeRigidBody(RigidBody* body);
        
        void simulate(float deltaTime);
        
    private:
        std::vector<RigidBody*> bodies;
        Core::Math::Vector3 gravity{0, -9.81f, 0};
    };
}

4๏ธโƒฃ Game ๋ชจ๋“ˆ - ์‹ค์ œ ๊ฒŒ์ž„ ๋กœ์ง ๐ŸŽฒ

// game.ixx
export module engine.game;

import engine.core;
import engine.graphics;
import engine.physics;

export namespace Engine::Game {
    class GameObject {
    public:
        virtual ~GameObject() = default;
        
        virtual void update(float deltaTime) = 0;
        virtual void render(Graphics::Renderer& renderer) = 0;
        
        Core::Math::Vector3 position{0, 0, 0};
        Core::Math::Vector3 rotation{0, 0, 0};
        Core::Math::Vector3 scale{1, 1, 1};
    };
    
    class Player : public GameObject {
    public:
        void update(float deltaTime) override {
            // ํ”Œ๋ ˆ์ด์–ด ๋กœ์ง
            handleInput();
            updatePhysics(deltaTime);
        }
        
        void render(Graphics::Renderer& renderer) override {
            // ํ”Œ๋ ˆ์ด์–ด ๋ Œ๋”๋ง
        }
        
    private:
        void handleInput();
        void updatePhysics(float deltaTime);
        
        Physics::RigidBody* rigidBody = nullptr;
        float moveSpeed = 5.0f;
    };
    
    class GameWorld {
    public:
        void addGameObject(std::unique_ptr<GameObject> obj);
        void update(float deltaTime);
        void render(Graphics::Renderer& renderer);
        
    private:
        std::vector<std::unique_ptr<GameObject>> objects;
        Physics::PhysicsWorld physicsWorld;
    };
}

5๏ธโƒฃ ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๐Ÿš€

// main.cpp
import engine.core;
import engine.graphics;
import engine.physics;
import engine.game;

import <iostream>;
import <memory>;

int main() {
    using namespace Engine;
    
    // ์—”์ง„ ์ดˆ๊ธฐํ™”
    auto& engine = Core::Engine::instance();
    if (!engine.initialize()) {
        std::cerr << "Failed to initialize engine!\n";
        return -1;
    }
    
    // ๋ Œ๋”๋Ÿฌ ์ƒ์„ฑ
    auto renderer = Graphics::createRenderer(
        Graphics::RendererAPI::Vulkan
    );
    renderer->initialize();
    
    // ๊ฒŒ์ž„ ์›”๋“œ ์ƒ์„ฑ
    Game::GameWorld world;
    
    // ํ”Œ๋ ˆ์ด์–ด ์ถ”๊ฐ€
    auto player = std::make_unique<Game::Player>();
    player->position = {0, 0, 0};
    world.addGameObject(std::move(player));
    
    // ๊ฒŒ์ž„ ๋ฃจํ”„
    float deltaTime = 0.016f;  // 60 FPS
    bool running = true;
    
    while (running) {
        renderer->beginFrame();
        
        world.update(deltaTime);
        world.render(*renderer);
        
        renderer->endFrame();
        
        engine.update(deltaTime);
    }
    
    engine.shutdown();
    return 0;
}

๋ณด์ด์ง€? ๋ชจ๋“ˆ ๋•๋ถ„์— ๊ฐ ์‹œ์Šคํ…œ์ด ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜๊ณ ,
์˜์กด์„ฑ๋„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜์ž–์•„!
์ด๊ฒŒ ๋ฐ”๋กœ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐํ™”์˜ ์ •์„์ด์•ผ ๐Ÿ’ฏ

์‹ค์ „ ํŒ: ์ ์ง„์  ๋ชจ๋“ˆ ๋„์ž… ์ „๋žต ๐Ÿ“ˆ

๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ๊ฐ‘์ž๊ธฐ ๋ชจ๋“ˆ ๋„์ž…ํ•˜๋ฉด ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์–ด.
๋‹จ๊ณ„์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒŒ ํ˜„๋ช…ํ•ด!

๐ŸŽฏ 4๋‹จ๊ณ„ ๋ชจ๋“ˆ ์ „ํ™˜ ๋กœ๋“œ๋งต 1๋‹จ๊ณ„: ์ค€๋น„ (1-2์ฃผ)
- ์ปดํŒŒ์ผ๋Ÿฌ ๋ชจ๋“ˆ ์ง€์› ํ™•์ธ
- ๋นŒ๋“œ ์‹œ์Šคํ…œ ์—…๊ทธ๋ ˆ์ด๋“œ
- ํŒ€์› ๊ต์œก ๋ฐ ๊ฐ€์ด๋“œ๋ผ์ธ ์ž‘์„ฑ

2๋‹จ๊ณ„: ํŒŒ์ผ๋Ÿฟ (2-4์ฃผ)
- ๋…๋ฆฝ์ ์ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ชจ๋“ˆ๋ถ€ํ„ฐ ์‹œ์ž‘
- ์ž‘์€ ๋ชจ๋“ˆ๋กœ ๊ฒฝํ—˜ ์Œ“๊ธฐ
- ๋ฌธ์ œ์  ํŒŒ์•… ๋ฐ ํ•ด๊ฒฐ

3๋‹จ๊ณ„: ํ™•์žฅ (1-3๊ฐœ์›”)
- ํ•ต์‹ฌ ๋ชจ๋“ˆ ์ „ํ™˜
- ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ์ •๋ฆฌ
- ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์™€ ๊ณต์กด

4๋‹จ๊ณ„: ์™„์„ฑ (3-6๊ฐœ์›”)
- ์ „์ฒด ํ”„๋กœ์ ํŠธ ๋ชจ๋“ˆํ™”
- ์„ฑ๋Šฅ ์ตœ์ ํ™”
- ๋ฌธ์„œํ™” ๋ฐ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค ์ •๋ฆฝ

๊ธ‰ํ•˜๊ฒŒ ํ•˜์ง€ ๋ง๊ณ  ์ฒœ์ฒœํžˆ ์•ˆ์ •์ ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด!
ํŠนํžˆ ์ƒ์šฉ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๋”๋”์šฑ ์‹ ์ค‘ํ•ด์•ผ ํ•˜์ง€ โš ๏ธ

๋””๋ฒ„๊น…๊ณผ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๐Ÿ”ง

๋ชจ๋“ˆ ์“ฐ๋‹ค ๋ณด๋ฉด ๊ฐ€๋” ์ด์ƒํ•œ ์—๋Ÿฌ ๋งŒ๋‚  ๋•Œ ์žˆ์–ด ใ…‹ใ…‹
์ž์ฃผ ๋‚˜์˜ค๋Š” ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ดค์–ด!

โš ๏ธ ํ”ํ•œ ๋ชจ๋“ˆ ์—๋Ÿฌ๋“ค 1. "module not found" ์—๋Ÿฌ
โ†’ ๋ชจ๋“ˆ ํŒŒ์ผ ๊ฒฝ๋กœ ํ™•์ธ, ๋นŒ๋“œ ์ˆœ์„œ ์ฒดํฌ

2. "conflicting module declaration" ์—๋Ÿฌ
โ†’ ๊ฐ™์€ ๋ชจ๋“ˆ์„ ์—ฌ๋Ÿฌ ํŒŒ์ผ์—์„œ ์„ ์–ธํ–ˆ๋Š”์ง€ ํ™•์ธ

3. "cannot import in global module fragment" ์—๋Ÿฌ
โ†’ module; ์„ ์–ธ ์ „์—๋Š” #include๋งŒ ๊ฐ€๋Šฅ

4. ๋ง์ปค ์—๋Ÿฌ (undefined reference)
โ†’ export ํ‚ค์›Œ๋“œ ๋น ๋œจ๋ ธ๋Š”์ง€ ํ™•์ธ
โ†’ ๋ชจ๋“ˆ ๊ตฌํ˜„ ํŒŒ์ผ์ด ๋นŒ๋“œ์— ํฌํ•จ๋๋Š”์ง€ ํ™•์ธ

5. ์ˆœํ™˜ import ์—๋Ÿฌ
โ†’ ๋ชจ๋“ˆ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ๋‹ค์‹œ ์„ค๊ณ„ ํ•„์š”

๋””๋ฒ„๊น…ํ•  ๋•Œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋กœ๊ทธ๋ฅผ ์ž์„ธํžˆ ๋ด์•ผ ํ•ด!
๋ชจ๋“ˆ ๊ด€๋ จ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์•„์ง์€ ์ข€ ๋ถˆ์นœ์ ˆํ•œ ํŽธ์ด๊ฑฐ๋“  ใ… ใ… 

๐ŸŒŸ ๋ฏธ๋ž˜ ์ „๋ง๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฆฌ์†Œ์Šค

C++ ๋ชจ๋“ˆ์˜ ๋ฏธ๋ž˜ ๐Ÿ”ฎ

C++20์—์„œ ๋ชจ๋“ˆ์ด ๋„์ž…๋์ง€๋งŒ ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์•ผ.
์•ž์œผ๋กœ ๋” ๋ฐœ์ „ํ•  ๋ถ€๋ถ„๋“ค์ด ๋งŽ์•„!

์˜ˆ์ƒ๋˜๋Š” ๋ฐœ์ „ ๋ฐฉํ–ฅ:

1๏ธโƒฃ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋“ˆํ™”
C++23๋ถ€ํ„ฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์ฒด๊ฐ€ ๋ชจ๋“ˆ๋กœ ์ œ๊ณต๋  ์˜ˆ์ •์ด์•ผ!
import std; ํ•œ ์ค„์ด๋ฉด ๋ชจ๋“  ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ใ…‹ใ…‹

// C++23 ์ดํ›„
import std;  // ๋ชจ๋“  ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ!

int main() {
    std::vector<int> v = {1, 2, 3};
    std::cout << "Hello!\n";
    // iostream, vector ๋“ฑ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
}

2๏ธโƒฃ ๋นŒ๋“œ ์‹œ์Šคํ…œ ํ†ตํ•ฉ ๊ฐœ์„ 
CMake, Meson ๋“ฑ ์ฃผ์š” ๋นŒ๋“œ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“ˆ ์ง€์›์ด ๊ณ„์† ๊ฐœ์„ ๋˜๊ณ  ์žˆ์–ด.
๊ณง ์„ค์ •์ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด์งˆ ๊ฑฐ์•ผ!

3๏ธโƒฃ IDE ์ง€์› ๊ฐ•ํ™”
Visual Studio, CLion, VS Code ๋“ฑ์—์„œ ๋ชจ๋“ˆ ์ž๋™์™„์„ฑ, ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋Šฅ์ด ๊ฐ•ํ™”๋  ์˜ˆ์ •!
๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ํ›จ์”ฌ ์ข‹์•„์งˆ ๊ฑฐ๋ผ๊ณ  ๋ด โœจ

4๏ธโƒฃ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž ํ†ตํ•ฉ
vcpkg, Conan ๊ฐ™์€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ๋ชจ๋“ˆ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ง€์›ํ•˜๊ฒŒ ๋  ๊ฑฐ์•ผ.
์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ด ๋” ํŽธํ•ด์ง€๊ฒ ์ง€!

ํ•™์Šต ๋ฆฌ์†Œ์Šค์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๐Ÿ“š

๋ชจ๋“ˆ ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋Ÿฐ ๋ฆฌ์†Œ์Šค๋“ค ์ถ”์ฒœํ•ด!

๐ŸŽ“ ์ถ”์ฒœ ํ•™์Šต ์ž๋ฃŒ ๊ณต์‹ ๋ฌธ์„œ:
- cppreference.com์˜ ๋ชจ๋“ˆ ์„น์…˜
- ISO C++ ํ‘œ์ค€ ๋ฌธ์„œ
- ๊ฐ ์ปดํŒŒ์ผ๋Ÿฌ ๊ณต์‹ ๋ฌธ์„œ (MSVC, Clang, GCC)

์˜จ๋ผ์ธ ๊ฐ•์˜:
- CppCon ๋ฐœํ‘œ ์˜์ƒ๋“ค (YouTube)
- C++ Weekly by Jason Turner
- Back to Basics ์‹œ๋ฆฌ์ฆˆ

์ปค๋ฎค๋‹ˆํ‹ฐ:
- r/cpp (Reddit)
- C++ Slack ์ฑ„๋„
- Stack Overflow C++ ํƒœ๊ทธ
- ๊ตญ๋‚ด C++ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน

ํŠนํžˆ CppCon ์˜์ƒ๋“ค์€ ์ง„์งœ ๊ฟ€ํŒ ๋งŽ์•„!
๋ชจ๋“ˆ ์„ค๊ณ„ํ•œ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ ์„ค๋ช…ํ•ด์ฃผ๊ฑฐ๋“  ใ…‹ใ…‹

์‹ค๋ฌด ์ ์šฉ ์‚ฌ๋ก€ ๐Ÿ’ผ

์ด๋ฏธ ์—ฌ๋Ÿฌ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจ๋“ˆ์„ ๋„์ž…ํ•˜๊ณ  ์žˆ์–ด!
๋ช‡ ๊ฐ€์ง€ ์‚ฌ๋ก€๋ฅผ ์†Œ๊ฐœํ• ๊ฒŒ.

Microsoft์˜ ๊ฒฝ์šฐ:
Windows ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ ์ผ๋ถ€๋ฅผ ๋ชจ๋“ˆ๋กœ ์ „ํ™˜ ์ค‘์ด์•ผ.
๋นŒ๋“œ ์‹œ๊ฐ„์ด 40% ์ด์ƒ ๋‹จ์ถ•๋๋‹ค๊ณ  ํ•˜๋”๋ผ! ๐Ÿ˜ฎ

๊ฒŒ์ž„ ์—”์ง„๋“ค:
Unreal Engine 5๋„ ์ ์ง„์ ์œผ๋กœ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๋„์ž…์„ ๊ฒ€ํ†  ์ค‘์ด๊ณ ,
์ผ๋ถ€ ๋…๋ฆฝ ๊ฒŒ์ž„ ์—”์ง„๋“ค์€ ์ด๋ฏธ ์ „๋ฉด ๋„์ž…ํ–ˆ์–ด!

๊ธˆ์œต ์‹œ์Šคํ…œ:
๊ณ ๋นˆ๋„ ๊ฑฐ๋ž˜(HFT) ์‹œ์Šคํ…œ์—์„œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋‹จ์ถ•์ด ์ค‘์š”ํ•˜์ž–์•„?
๋ชจ๋“ˆ ๋„์ž…์œผ๋กœ ๊ฐœ๋ฐœ ์‚ฌ์ดํด์ด ํฌ๊ฒŒ ๊ฐœ์„ ๋๋‹ค๋Š” ์‚ฌ๋ก€๊ฐ€ ๋งŽ์•„.

์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ C++ ๋ชจ๋“ˆ ๊ด€๋ จ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜๋Š” ์ „๋ฌธ๊ฐ€๋“ค์ด ๋Š˜์–ด๋‚˜๊ณ  ์žˆ์–ด!
์‹ค๋ฌด ๊ฒฝํ—˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์žํ•œํ…Œ ์ง์ ‘ ๋ฐฐ์šฐ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€ ๐Ÿ‘จโ€๐Ÿซ

๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ ๐ŸŽฌ

์™€... ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์—ˆ๋‹ค๋ฉด ์ง„์งœ ๋Œ€๋‹จํ•ด ใ…‹ใ…‹ใ…‹
๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ถ€ํ„ฐ ๋ชจ๋“ˆ๊นŒ์ง€ ๊ฝค ๊ธด ์—ฌ์ •์ด์—ˆ์ง€?

ํ•ต์‹ฌ๋งŒ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด:

๐ŸŽฏ ํ•ต์‹ฌ ์š”์•ฝ ๋„ค์ž„์ŠคํŽ˜์ด์Šค:
โœ… ๋…ผ๋ฆฌ์  ๊ทธ๋ฃนํ™”์™€ ์ด๋ฆ„ ์ถฉ๋Œ ๋ฐฉ์ง€
โœ… ๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ์ฝ”๋“œ ์กฐ์งํ™”
โœ… ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋ชจ๋“ˆ ์‹œ์Šคํ…œ:
โœ… ํš๊ธฐ์ ์ธ ์ปดํŒŒ์ผ ์†๋„ ํ–ฅ์ƒ
โœ… ๋ช…ํ™•ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
โœ… ๋งคํฌ๋กœ ์˜ค์—ผ ๋ฐฉ์ง€
โœ… C++์˜ ๋ฏธ๋ž˜!

์‹ค์ „ ์ ์šฉ:
โœ… ์ ์ง„์  ๋„์ž…์ด ์•ˆ์ „
โœ… ์˜์กด์„ฑ ๊ด€๋ฆฌ๊ฐ€ ํ•ต์‹ฌ
โœ… ๋นŒ๋“œ ์‹œ์Šคํ…œ ์„ค์ • ์ค‘์š”
โœ… ํŒ€ ์ „์ฒด์˜ ์ดํ•ด์™€ ํ˜‘๋ ฅ ํ•„์š”

๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐํ™”๋Š” ๋‹จ์ˆœํžˆ ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์•ผ.
ํŒ€์›Œํฌ, ์„ค๊ณ„ ์ฒ ํ•™, ์žฅ๊ธฐ์  ๋น„์ „์ด ๋ชจ๋‘ ์ค‘์š”ํ•˜์ง€!

์ฒ˜์Œ์—๋Š” ์–ด๋ ต๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์–ด.
ํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ ์ œ๋Œ€๋กœ ๊ตฌ์กฐํ™”ํ•ด๋‘๋ฉด ๋‚˜์ค‘์— ์—„์ฒญ๋‚œ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์„ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋  ๊ฑฐ์•ผ! ๐Ÿš€

๋ชจ๋“ˆ์€ ์•„์ง ๋ฐœ์ „ ์ค‘์ธ ๊ธฐ์ˆ ์ด๋‹ˆ๊นŒ,
๊ณ„์† ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์ฐพ์•„๋ณด๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์†Œํ†ตํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด.
์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ฒฝํ—˜์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๊ณ !

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณผ ์ฐจ๋ก€์•ผ!
์ž‘์€ ๋ชจ๋“ˆ ํ•˜๋‚˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋•Œ? ๐Ÿ˜Š

ํ™”์ดํŒ…! ์šฐ๋ฆฌ ๋ชจ๋‘ ๋” ๋‚˜์€ C++ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์ž๊ตฌ! ๐Ÿ’ชโœจ

๐ŸŽ‰ Happy Coding with C++ Modules! ๐ŸŽ‰

๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋„ ์ด์ œ ๋‘๋ ต์ง€ ์•Š์•„!

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.