{"id":9664,"date":"2025-01-21T18:54:39","date_gmt":"2025-01-21T09:54:39","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=9664"},"modified":"2025-01-24T18:21:22","modified_gmt":"2025-01-24T09:21:22","slug":"c-%ea%b0%9c%eb%b0%9c%ec%9e%90%eb%a5%bc-%ec%9c%84%ed%95%9c-c-%ec%9e%85%eb%ac%b8","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=9664","title":{"rendered":"C \uac1c\ubc1c\uc790\ub97c \uc704\ud55c C++ \uc785\ubb38"},"content":{"rendered":"<h1>C \uac1c\ubc1c\uc790\ub97c \uc704\ud55c C++ \uc785\ubb38<\/h1>\n<p>C \uc5b8\uc5b4 \uac1c\ubc1c\uc790\ub97c \uc704\ud55c C++ \uac15\uc88c\uc758 \ubaa9\ucc28\ub97c \uc791\uc131\ud574\ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4. C \uac1c\ubc1c\uc790\uc758 \uad00\uc810\uc5d0\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c C++\uc744 \ubc30\uc6b8 \uc218 \uc788\ub3c4\ub85d \uad6c\uc131\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Part 1: C++\uc758 \uae30\ucd08\uc640 C\uc640\uc758 \ucc28\uc774\uc810<\/h2>\n<h3>1. \uc785\ucd9c\ub825\uacfc \ub124\uc784\uc2a4\ud398\uc774\uc2a4<\/h3>\n<h4>1.1 C++\uc758 \uc785\ucd9c\ub825 \uc2dc\uc2a4\ud15c<\/h4>\n<pre><code class=\"language-cpp\">\/\/ C \uc2a4\ud0c0\uc77c\n#include &lt;stdio.h&gt;\nint main() {\n    int num = 42;\n    printf(&quot;\uc22b\uc790\ub294 %d\uc785\ub2c8\ub2e4.\\n&quot;, num);\n\n    char str[100];\n    scanf(&quot;%s&quot;, str);\n    return 0;\n}\n\n\/\/ C++ \uc2a4\ud0c0\uc77c\n#include &lt;iostream&gt;\nusing namespace std;\nint main() {\n    int num = 42;\n    cout &lt;&lt; &quot;\uc22b\uc790\ub294 &quot; &lt;&lt; num &lt;&lt; &quot;\uc785\ub2c8\ub2e4.&quot; &lt;&lt; endl;\n\n    string str;\n    cin &gt;&gt; str;\n    return 0;\n}<\/code><\/pre>\n<p>C++\uc758 \uc785\ucd9c\ub825\uc740 \uc2a4\ud2b8\ub9bc(stream) \uac1c\ub150\uc744 \uae30\ubc18\uc73c\ub85c \ud569\ub2c8\ub2e4:<\/p>\n<ul>\n<li>cout: \ud45c\uc900 \ucd9c\ub825 \uc2a4\ud2b8\ub9bc (Console OUTput)<\/li>\n<li>cin: \ud45c\uc900 \uc785\ub825 \uc2a4\ud2b8\ub9bc (Console INput)<\/li>\n<li>cerr: \ud45c\uc900 \uc5d0\ub7ec \uc2a4\ud2b8\ub9bc<\/li>\n<li>endl: \uac1c\ud589\ubb38\uc790 + \ubc84\ud37c \ud50c\ub7ec\uc2dc<\/li>\n<\/ul>\n<h4>1.2 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\uc758 \uc774\ud574<\/h4>\n<p>\ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub294 \uc774\ub984 \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uae30 \uc704\ud55c \ub17c\ub9ac\uc801 \uc601\uc5ed\uc785\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">#include &lt;iostream&gt;\n\n\/\/ \uc804\uccb4 \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \uc0ac\uc6a9\nusing namespace std;\n\n\/\/ \ud2b9\uc815 \uc694\uc18c\ub9cc \uc0ac\uc6a9\nusing std::cout;\nusing std::endl;\n\n\/\/ \uc9c1\uc811 \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \uc9c0\uc815\nstd::cout &lt;&lt; &quot;Hello&quot; &lt;&lt; std::endl;\n\n\/\/ \uc0ac\uc6a9\uc790 \uc815\uc758 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\nnamespace MyApp {\n    void print() {\n        std::cout &lt;&lt; &quot;MyApp\uc758 print \ud568\uc218&quot; &lt;&lt; std::endl;\n    }\n}\n\nint main() {\n    MyApp::print();\n    return 0;\n}<\/code><\/pre>\n<h3>2. \ud5a5\uc0c1\ub41c \ubcc0\uc218\uc640 \ud0c0\uc785 \uc2dc\uc2a4\ud15c<\/h3>\n<h4>2.1 bool \ud0c0\uc785<\/h4>\n<pre><code class=\"language-cpp\">\/\/ C \uc2a4\ud0c0\uc77c\nint isValid = 1;  \/\/ 0\uc740 \uac70\uc9d3, 0\uc774 \uc544\ub2cc \uac12\uc740 \ucc38\n\n\/\/ C++ \uc2a4\ud0c0\uc77c\nbool isValid = true;  \/\/ true \ub610\ub294 false<\/code><\/pre>\n<h4>2.2 \ucc38\uc870\uc790(Reference)<\/h4>\n<p>\ud3ec\uc778\ud130\ubcf4\ub2e4 \uc548\uc804\ud558\uace0 \uc9c1\uad00\uc801\uc778 \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">\/\/ \ud3ec\uc778\ud130 \uc0ac\uc6a9 (C \uc2a4\ud0c0\uc77c)\nvoid swap(int* a, int* b) {\n    int temp = *a;\n    *a = *b;\n    *b = temp;\n}\n\n\/\/ \ucc38\uc870\uc790 \uc0ac\uc6a9 (C++ \uc2a4\ud0c0\uc77c)\nvoid swap(int&amp; a, int&amp; b) {\n    int temp = a;\n    a = b;\n    b = temp;\n}\n\nint main() {\n    int x = 5, y = 10;\n\n    \/\/ \ud3ec\uc778\ud130 \ud638\ucd9c\n    swap(&amp;x, &amp;y);\n\n    \/\/ \ucc38\uc870\uc790 \ud638\ucd9c\n    swap(x, y);\n}<\/code><\/pre>\n<h4>2.3 auto \ud0a4\uc6cc\ub4dc<\/h4>\n<p>\ud0c0\uc785 \ucd94\ub860\uc744 \ud1b5\ud574 \ucf54\ub4dc\ub97c \ub354 \uc720\uc5f0\ud558\uac8c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">\/\/ \uba85\uc2dc\uc801 \ud0c0\uc785 \uc120\uc5b8\nstd::vector&lt;int&gt;::iterator it = vec.begin();\n\n\/\/ auto \uc0ac\uc6a9\nauto it = vec.begin();\n\n\/\/ \ubcf5\uc7a1\ud55c \ud0c0\uc785\uc5d0\uc11c\uc758 \ud65c\uc6a9\nauto result = complicated_function();<\/code><\/pre>\n<h4>2.4 const\uc758 \ud655\uc7a5\ub41c \uc758\ubbf8<\/h4>\n<pre><code class=\"language-cpp\">\/\/ \ud3ec\uc778\ud130\uc640 const\nconst int* p1;        \/\/ \ud3ec\uc778\ud130\uac00 \uac00\ub9ac\ud0a4\ub294 \uac12\uc744 \uc218\uc815\ud560 \uc218 \uc5c6\uc74c\nint* const p2 = &amp;x;   \/\/ \ud3ec\uc778\ud130 \uc790\uccb4\ub97c \uc218\uc815\ud560 \uc218 \uc5c6\uc74c\nconst int* const p3;  \/\/ \ub458 \ub2e4 \uc218\uc815\ud560 \uc218 \uc5c6\uc74c\n\n\/\/ \ucc38\uc870\uc790\uc640 const\nvoid printValue(const int&amp; value) {  \/\/ \uc77d\uae30 \uc804\uc6a9 \ucc38\uc870\n    \/\/ value = 42;  \/\/ \ucef4\ud30c\uc77c \uc5d0\ub7ec\n    std::cout &lt;&lt; value &lt;&lt; std::endl;\n}\n\n\/\/ const \uba64\ubc84 \ud568\uc218\nclass MyClass {\n    void printData() const {  \/\/ \uac1d\uccb4\uc758 \uc0c1\ud0dc\ub97c \uc218\uc815\ud558\uc9c0 \uc54a\uc74c\uc744 \ubcf4\uc7a5\n        \/\/ data = 42;  \/\/ \ucef4\ud30c\uc77c \uc5d0\ub7ec\n    }\n};<\/code><\/pre>\n<h2>Part 2: C++\uc758 \ud575\uc2ec \uae30\ub2a5<\/h2>\n<h3>1. \ud568\uc218\uc758 \uc9c4\ud654<\/h3>\n<h4>1.1 \ud568\uc218 \uc624\ubc84\ub85c\ub529<\/h4>\n<p>C++\uc5d0\uc11c\ub294 \uac19\uc740 \uc774\ub984\uc758 \ud568\uc218\ub97c \ub9e4\uac1c\ubcc0\uc218\ub97c \ub2e4\ub974\uac8c \ud558\uc5ec \uc5ec\ub7ec \uac1c \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">\/\/ C \uc2a4\ud0c0\uc77c\nint add_int(int a, int b) {\n    return a + b;\n}\ndouble add_double(double a, double b) {\n    return a + b;\n}\n\n\/\/ C++ \uc2a4\ud0c0\uc77c\nint add(int a, int b) {\n    return a + b;\n}\ndouble add(double a, double b) {\n    return a + b;\n}\nstd::string add(const std::string&amp; a, const std::string&amp; b) {\n    return a + b;\n}<\/code><\/pre>\n<h4>1.2 \ub514\ud3f4\ud2b8 \ub9e4\uac1c\ubcc0\uc218<\/h4>\n<p>\ud568\uc218 \uc120\uc5b8 \uc2dc \ub9e4\uac1c\ubcc0\uc218\uc758 \uae30\ubcf8\uac12\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">void printMessage(const std::string&amp; msg, int count = 1, bool newLine = true) {\n    for(int i = 0; i &lt; count; i++) {\n        std::cout &lt;&lt; msg;\n        if(newLine) std::cout &lt;&lt; std::endl;\n    }\n}\n\nint main() {\n    printMessage(&quot;Hello&quot;);           \/\/ count=1, newLine=true\n    printMessage(&quot;Hello&quot;, 3);        \/\/ newLine=true\n    printMessage(&quot;Hello&quot;, 2, false); \/\/ \ubaa8\ub4e0 \ub9e4\uac1c\ubcc0\uc218 \uc9c0\uc815\n}<\/code><\/pre>\n<h4>1.3 \uc778\ub77c\uc778 \ud568\uc218<\/h4>\n<p>\uc791\uc740 \ud568\uc218\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">\/\/ \ub9e4\ud06c\ub85c \uc0ac\uc6a9 (C \uc2a4\ud0c0\uc77c)\n#define MAX(a,b) ((a) &gt; (b) ? (a) : (b))\n\n\/\/ \uc778\ub77c\uc778 \ud568\uc218 (C++ \uc2a4\ud0c0\uc77c)\ninline int max(int a, int b) {\n    return a &gt; b ? a : b;\n}<\/code><\/pre>\n<h4>1.4 \ud568\uc218 \ud15c\ud50c\ub9bf \uae30\ucd08<\/h4>\n<p>\ud0c0\uc785\uc5d0 \ub3c5\ub9bd\uc801\uc778 \ud568\uc218\ub97c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">template&lt;typename T&gt;\nT max(T a, T b) {\n    return a &gt; b ? a : b;\n}\n\nint main() {\n    std::cout &lt;&lt; max(10, 20) &lt;&lt; std::endl;      \/\/ int\n    std::cout &lt;&lt; max(10.5, 20.7) &lt;&lt; std::endl;  \/\/ double\n    std::cout &lt;&lt; max(&quot;abc&quot;, &quot;def&quot;) &lt;&lt; std::endl; \/\/ const char*\n}<\/code><\/pre>\n<h3>2. \uac1d\uccb4\uc9c0\ud5a5 \ud504\ub85c\uadf8\ub798\ubc0d \uae30\ucd08<\/h3>\n<h4>2.1 \uad6c\uc870\uccb4\uc5d0\uc11c \ud074\ub798\uc2a4\ub85c<\/h4>\n<pre><code class=\"language-cpp\">\/\/ C \uc2a4\ud0c0\uc77c \uad6c\uc870\uccb4\nstruct Person_C {\n    char name[50];\n    int age;\n};\nvoid Person_C_init(struct Person_C* p, const char* name, int age) {\n    strcpy(p-&gt;name, name);\n    p-&gt;age = age;\n}\n\n\/\/ C++ \uc2a4\ud0c0\uc77c \ud074\ub798\uc2a4\nclass Person {\nprivate:  \/\/ \uc811\uadfc \uc81c\uc5b4\n    std::string name;\n    int age;\n\npublic:\n    \/\/ \uc0dd\uc131\uc790\n    Person(const std::string&amp; n, int a) : name(n), age(a) {}\n\n    \/\/ \uba54\uc11c\ub4dc\n    void printInfo() const {\n        std::cout &lt;&lt; &quot;Name: &quot; &lt;&lt; name &lt;&lt; &quot;, Age: &quot; &lt;&lt; age &lt;&lt; std::endl;\n    }\n};<\/code><\/pre>\n<h4>2.2 \uc811\uadfc \uc81c\uc5b4\uc640 \ucea1\uc290\ud654<\/h4>\n<pre><code class=\"language-cpp\">class BankAccount {\nprivate:  \/\/ \uc678\ubd80\uc5d0\uc11c \uc811\uadfc \ubd88\uac00\n    double balance;\n    std::string accountNumber;\n\nprotected:  \/\/ \uc0c1\uc18d\ubc1b\uc740 \ud074\ub798\uc2a4\uc5d0\uc11c\ub9cc \uc811\uadfc \uac00\ub2a5\n    void updateBalance(double amount) {\n        balance += amount;\n    }\n\npublic:  \/\/ \uc678\ubd80\uc5d0\uc11c \uc811\uadfc \uac00\ub2a5\n    BankAccount(const std::string&amp; accNum) : balance(0), accountNumber(accNum) {}\n\n    void deposit(double amount) {\n        if(amount &gt; 0) {\n            updateBalance(amount);\n        }\n    }\n};<\/code><\/pre>\n<h4>2.3 \uc0dd\uc131\uc790\uc640 \uc18c\uba78\uc790<\/h4>\n<pre><code class=\"language-cpp\">class DynamicArray {\nprivate:\n    int* data;\n    size_t size;\n\npublic:\n    \/\/ \uc0dd\uc131\uc790\n    DynamicArray(size_t sz) : size(sz) {\n        data = new int[size];\n    }\n\n    \/\/ \ubcf5\uc0ac \uc0dd\uc131\uc790\n    DynamicArray(const DynamicArray&amp; other) : size(other.size) {\n        data = new int[size];\n        memcpy(data, other.data, size * sizeof(int));\n    }\n\n    \/\/ \uc18c\uba78\uc790\n    ~DynamicArray() {\n        delete[] data;\n    }\n};<\/code><\/pre>\n<h4>2.4 this \ud3ec\uc778\ud130<\/h4>\n<pre><code class=\"language-cpp\">class Counter {\nprivate:\n    int count;\n\npublic:\n    Counter(int count) {\n        this-&gt;count = count;  \/\/ \ub9e4\uac1c\ubcc0\uc218\uc640 \uba64\ubc84\ubcc0\uc218 \uad6c\ubd84\n    }\n\n    Counter&amp; increment() {\n        count++;\n        return *this;  \/\/ \uc790\uae30 \uc790\uc2e0\uc744 \ubc18\ud658\n    }\n\n    Counter&amp; add(int value) {\n        count += value;\n        return *this;\n    }\n};\n\nint main() {\n    Counter c(0);\n    c.increment().add(5).increment();  \/\/ \uba54\uc11c\ub4dc \uccb4\uc774\ub2dd\n}<\/code><\/pre>\n<h4>2.5 \uba64\ubc84 \ucd08\uae30\ud654 \ub9ac\uc2a4\ud2b8<\/h4>\n<p>\uba64\ubc84 \ubcc0\uc218\ub97c \ucd08\uae30\ud654\ud558\ub294 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class Point {\nprivate:\n    const int x;\n    const int y;\n    std::string label;\n\npublic:\n    \/\/ \uba64\ubc84 \ucd08\uae30\ud654 \ub9ac\uc2a4\ud2b8 \uc0ac\uc6a9\n    Point(int xVal, int yVal, const std::string&amp; l) \n        : x(xVal), y(yVal), label(l) {\n        \/\/ \ubcf8\ubb38\uc774 \ube44\uc5b4\uc788\uc5b4\ub3c4 \ub428\n    }\n};<\/code><\/pre>\n<h4>2.6 friend \ud074\ub798\uc2a4\uc640 \ud568\uc218<\/h4>\n<p>friend \ud0a4\uc6cc\ub4dc\ub97c \uc0ac\uc6a9\ud558\uba74 \uc678\ubd80 \ud568\uc218\ub098 \ud074\ub798\uc2a4\uac00 \ud604\uc7ac \ud074\ub798\uc2a4\uc758 private \ubc0f protected \uba64\ubc84\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class Rectangle {\nprivate:\n    int width;\n    int height;\n\n    friend void printArea(const Rectangle&amp; rect);\n    friend class RectangleManager;\n\npublic:\n    Rectangle(int w, int h) : width(w), height(h) {}\n};\n\nvoid printArea(const Rectangle&amp; rect) {\n    \/\/ private \uba64\ubc84\uc778 width\uc640 height\uc5d0 \uc9c1\uc811 \uc811\uadfc\n    std::cout &lt;&lt; &quot;Area: &quot; &lt;&lt; rect.width * rect.height &lt;&lt; std::endl;\n}\n\nclass RectangleManager {\npublic:\n    void adjustSize(Rectangle&amp; rect) {\n        \/\/ private \uba64\ubc84\uc5d0 \uc9c1\uc811 \uc811\uadfc\n        if (rect.width &lt; 0) rect.width = 0;\n        if (rect.height &lt; 0) rect.height = 0;\n    }\n\n    void printDimensions(const Rectangle&amp; rect) {\n        std::cout &lt;&lt; &quot;Width: &quot; &lt;&lt; rect.width \n                 &lt;&lt; &quot;, Height: &quot; &lt;&lt; rect.height &lt;&lt; std::endl;\n    }\n};<\/code><\/pre>\n<pre><code class=\"language-cpp\">\/\/ \uc5f0\uc0b0\uc790 \uc624\ubc84\ub85c\ub529\uc5d0\uc11c\uc758 \ud65c\uc6a9 \uc608\nclass Complex {\nprivate:\n    double real;\n    double imag;\n\npublic:\n    Complex(double r, double i) : real(r), imag(i) {}\n\n    \/\/ \uc5f0\uc0b0\uc790 \uc624\ubc84\ub85c\ub529\uc744 \uc704\ud55c friend \ud568\uc218\n    friend Complex operator+(const Complex&amp; a, const Complex&amp; b) {\n        return Complex(a.real + b.real, a.imag + b.imag);\n    }\n\n    \/\/ \ucd9c\ub825 \uc5f0\uc0b0\uc790 \uc624\ubc84\ub85c\ub529\n    friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const Complex&amp; c) {\n        os &lt;&lt; c.real &lt;&lt; &quot; + &quot; &lt;&lt; c.imag &lt;&lt; &quot;i&quot;;\n        return os;\n    }\n};\n\nint main() {\n    Complex a(1.0, 2.0);\n    Complex b(3.0, 4.0);\n    Complex c = a + b;  \/\/ operator+ friend \ud568\uc218 \ud638\ucd9c\n    std::cout &lt;&lt; c;     \/\/ operator&lt;&lt; friend \ud568\uc218 \ud638\ucd9c\n}<\/code><\/pre>\n<p>\uc8fc\uc758\uc0ac\ud56d:<\/p>\n<ul>\n<li>friend\ub294 \ucea1\uc290\ud654\ub97c \uc57d\ud654\uc2dc\ud0ac \uc218 \uc788\uc73c\ubbc0\ub85c \ud544\uc694\ud55c \uacbd\uc6b0\uc5d0\ub9cc \uc0ac\uc6a9\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>\uacfc\ub3c4\ud55c friend \uc0ac\uc6a9\uc740 \ucf54\ub4dc\uc758 \uc720\uc9c0\ubcf4\uc218\uc131\uc744 \uc800\ud558\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>friend \ub300\uc2e0 public \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud1b5\ud55c \uc811\uadfc\uc774 \uac00\ub2a5\ud55c\uc9c0 \uba3c\uc800 \uace0\ub824\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>3. C++\uc758 \ucd94\uac00 \ud575\uc2ec \uae30\ub2a5<\/h3>\n<h4>3.1 \uc5f0\uc0b0\uc790 \uc624\ubc84\ub85c\ub529<\/h4>\n<p>\ud074\ub798\uc2a4\uc5d0 \ub300\ud574 \uc5f0\uc0b0\uc790\uc758 \ub3d9\uc791\uc744 \uc7ac\uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class Complex {\nprivate:\n    double real, imag;\n\npublic:\n    Complex(double r = 0, double i = 0) : real(r), imag(i) {}\n\n    \/\/ \uba64\ubc84 \ud568\uc218\ub85c \uc5f0\uc0b0\uc790 \uc624\ubc84\ub85c\ub529\n    Complex operator+(const Complex&amp; other) const {\n        return Complex(real + other.real, imag + other.imag);\n    }\n\n    \/\/ \ubcf5\ud569 \ub300\uc785 \uc5f0\uc0b0\uc790\n    Complex&amp; operator+=(const Complex&amp; other) {\n        real += other.real;\n        imag += other.imag;\n        return *this;\n    }\n\n    \/\/ friend \ud568\uc218\ub85c \uc5f0\uc0b0\uc790 \uc624\ubc84\ub85c\ub529\n    friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const Complex&amp; c) {\n        os &lt;&lt; c.real &lt;&lt; &quot; + &quot; &lt;&lt; c.imag &lt;&lt; &quot;i&quot;;\n        return os;\n    }\n};\n\nint main() {\n    Complex a(1, 2), b(3, 4);\n    Complex c = a + b;     \/\/ operator+ \ud638\ucd9c\n    a += b;               \/\/ operator+= \ud638\ucd9c\n    std::cout &lt;&lt; c;       \/\/ operator&lt;&lt; \ud638\ucd9c\n}<\/code><\/pre>\n<h4>3.2 static \uba64\ubc84<\/h4>\n<p>\ud074\ub798\uc2a4\uc758 \ubaa8\ub4e0 \uc778\uc2a4\ud134\uc2a4\uac00 \uacf5\uc720\ud558\ub294 \uba64\ubc84\ub97c \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class Counter {\nprivate:\n    static int totalCount;    \/\/ \uc815\uc801 \uba64\ubc84 \ubcc0\uc218 \uc120\uc5b8\n    int instanceCount;\n\npublic:\n    Counter() : instanceCount(0) {\n        totalCount++;\n    }\n\n    static int getTotalCount() {  \/\/ \uc815\uc801 \uba64\ubc84 \ud568\uc218\n        return totalCount;\n        \/\/ \uc8fc\uc758: \uc815\uc801 \uba64\ubc84 \ud568\uc218\uc5d0\uc11c\ub294 \uc77c\ubc18 \uba64\ubc84 \ubcc0\uc218 \uc811\uadfc \ubd88\uac00\n    }\n\n    void printCounts() const {\n        std::cout &lt;&lt; &quot;Instance count: &quot; &lt;&lt; instanceCount &lt;&lt; std::endl;\n        std::cout &lt;&lt; &quot;Total count: &quot; &lt;&lt; totalCount &lt;&lt; std::endl;\n    }\n};\n\n\/\/ cpp \ud30c\uc77c\uc5d0\uc11c \uc815\uc801 \uba64\ubc84 \ubcc0\uc218 \uc815\uc758 (\ud544\uc218)\nint Counter::totalCount = 0;<\/code><\/pre>\n<h4>3.3 \ud2b9\uc218 \ud0a4\uc6cc\ub4dc\ub4e4<\/h4>\n<h5>3.3.1 mutable \ud0a4\uc6cc\ub4dc<\/h5>\n<p>const \uba64\ubc84 \ud568\uc218 \ub0b4\uc5d0\uc11c\ub3c4 \uc218\uc815\uc774 \uac00\ub2a5\ud55c \uba64\ubc84\ub97c \uc120\uc5b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class Cache {\nprivate:\n    mutable int accessCount;\n    mutable std::mutex mtx;\n    std::map&lt;std::string, std::string&gt; data;\n\npublic:\n    std::string getValue(const std::string&amp; key) const {\n        std::lock_guard&lt;std::mutex&gt; lock(mtx);  \/\/ mutable\uc774\ub77c \uc218\uc815 \uac00\ub2a5\n        accessCount++;  \/\/ mutable\uc774\ub77c const \ud568\uc218\uc5d0\uc11c\ub3c4 \uc218\uc815 \uac00\ub2a5\n        return data.at(key);\n    }\n};<\/code><\/pre>\n<h5>3.3.2 explicit \ud0a4\uc6cc\ub4dc<\/h5>\n<p>\uc758\ub3c4\ud558\uc9c0 \uc54a\uc740 \uc554\uc2dc\uc801 \ud615\ubcc0\ud658\uc744 \ubc29\uc9c0\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class MyString {\npublic:\n    explicit MyString(int n) : str(n, &#039;x&#039;) {}\n    \/\/ explicit\uc774 \uc5c6\ub2e4\uba74 MyString str = 10; \uac19\uc740 \uc554\uc2dc\uc801 \ubcc0\ud658\uc774 \uac00\ub2a5\nprivate:\n    std::string str;\n};\n\nvoid processString(const MyString&amp; str) {\n    \/\/ \ucc98\ub9ac \ub85c\uc9c1\n}\n\nint main() {\n    processString(MyString(10));  \/\/ OK\n    \/\/ processString(10);         \/\/ \ucef4\ud30c\uc77c \uc5d0\ub7ec: \uc554\uc2dc\uc801 \ubcc0\ud658 \ubd88\uac00\n}<\/code><\/pre>\n<h5>3.3.3 using \ud0a4\uc6cc\ub4dc\uc640 \ud0c0\uc785 \ubcc4\uce6d<\/h5>\n<p>\ud604\ub300\uc801\uc778 \ud0c0\uc785 \ubcc4\uce6d\uc744 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">\/\/ C \uc2a4\ud0c0\uc77c\ntypedef std::vector&lt;std::string&gt; StringList_t;\ntypedef void (*FunctionPtr)(int);\n\n\/\/ Modern C++ \uc2a4\ud0c0\uc77c\nusing StringList = std::vector&lt;std::string&gt;;\nusing FunctionPtr = void(*)(int);\nusing IntPtr = std::unique_ptr&lt;int&gt;;\n\n\/\/ \ud15c\ud50c\ub9bf \ubcc4\uce6d (typedef\ub85c\ub294 \ubd88\uac00\ub2a5)\ntemplate&lt;typename T&gt;\nusing Vec = std::vector&lt;T&gt;;\n\nVec&lt;int&gt; numbers;  \/\/ std::vector&lt;int&gt;\uc640 \ub3d9\uc77c<\/code><\/pre>\n<h4>3.4 enum class<\/h4>\n<p>\ubc94\uc704\uac00 \uc9c0\uc815\ub41c \uc5f4\uac70\ud615\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">\/\/ \uae30\uc874 enum\uc758 \ubb38\uc81c\uc810\nenum Color { RED, GREEN, BLUE };         \/\/ \uc804\uc5ed \ub124\uc784\uc2a4\ud398\uc774\uc2a4 \uc624\uc5fc\nenum TrafficLight { RED, YELLOW, GREEN }; \/\/ \uc5d0\ub7ec: RED, GREEN \uc911\ubcf5\n\n\/\/ enum class \uc0ac\uc6a9\nenum class NewColor { Red, Green, Blue };\nenum class Light { Red, Yellow, Green };  \/\/ OK\n\nvoid useColors() {\n    NewColor c1 = NewColor::Red;   \/\/ \uba85\uc2dc\uc801 \ubc94\uc704\n    Light signal = Light::Red;     \/\/ \uc774\ub984 \ucda9\ub3cc \uc5c6\uc74c\n\n    \/\/ int x = c1;                 \/\/ \uc5d0\ub7ec: \uc554\uc2dc\uc801 \ubcc0\ud658 \ubd88\uac00\n    int x = static_cast&lt;int&gt;(c1);  \/\/ OK: \uba85\uc2dc\uc801 \ubcc0\ud658 \ud544\uc694\n}<\/code><\/pre>\n<h4>3.5 \ucd08\uae30\ud654 \ubc29\ubc95\ub4e4<\/h4>\n<p>C++11 \uc774\ud6c4 \ud1b5\uc77c\ub41c \ucd08\uae30\ud654 \ubb38\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class Widget {\n    \/\/ \uba64\ubc84 \ubcc0\uc218 \ucd08\uae30\ud654\n    int n{42};                     \/\/ \uc911\uad04\ud638 \ucd08\uae30\ud654\n    std::string s{&quot;hello&quot;};        \/\/ \uc9c1\uc811 \ucd08\uae30\ud654\n    std::vector&lt;int&gt; v{1, 2, 3};   \/\/ \ucee8\ud14c\uc774\ub108 \ucd08\uae30\ud654\n    int arr[3]{1, 2, 3};          \/\/ \ubc30\uc5f4 \ucd08\uae30\ud654\n\npublic:\n    \/\/ \uc0dd\uc131\uc790 \ucd08\uae30\ud654 \ub9ac\uc2a4\ud2b8\n    Widget() : n{42}, s{&quot;hello&quot;} { }\n};\n\nint main() {\n    \/\/ \ud1b5\uc77c\ub41c \ucd08\uae30\ud654 \ubb38\ubc95\n    int x{42};                    \/\/ \uae30\ubcf8 \ud0c0\uc785\n    std::string s{&quot;hello&quot;};       \/\/ \uac1d\uccb4\n    std::vector&lt;int&gt; v{1, 2, 3};  \/\/ \ucee8\ud14c\uc774\ub108\n    Widget w{};                   \/\/ \uc0ac\uc6a9\uc790 \uc815\uc758 \ud0c0\uc785\n}<\/code><\/pre>\n<h2>Part 3: \uace0\uae09 \uae30\ub2a5\uacfc \ud604\ub300\uc801 \ud504\ub85c\uadf8\ub798\ubc0d<\/h2>\n<h3>1. \uc0c1\uc18d\uacfc \ub2e4\ud615\uc131<\/h3>\n<h4>1.1 \ud074\ub798\uc2a4 \uc0c1\uc18d\uc758 \uae30\ubcf8<\/h4>\n<pre><code class=\"language-cpp\">class Animal {\nprotected:\n    std::string name;\n\npublic:\n    Animal(const std::string&amp; n) : name(n) {}\n\n    virtual void makeSound() {\n        std::cout &lt;&lt; &quot;Some sound&quot; &lt;&lt; std::endl;\n    }\n};\n\nclass Dog : public Animal {\npublic:\n    Dog(const std::string&amp; n) : Animal(n) {}\n\n    void makeSound() override {\n        std::cout &lt;&lt; name &lt;&lt; &quot; says: Woof!&quot; &lt;&lt; std::endl;\n    }\n};<\/code><\/pre>\n<h4>1.2 \uac00\uc0c1 \ud568\uc218\uc640 \ub3d9\uc801 \ubc14\uc778\ub529<\/h4>\n<pre><code class=\"language-cpp\">void playSound(Animal* animal) {\n    animal-&gt;makeSound();  \/\/ \ub7f0\ud0c0\uc784\uc5d0 \uc2e4\uc81c \ud0c0\uc785\uc758 \ud568\uc218 \ud638\ucd9c\n}\n\nint main() {\n    Animal* dog = new Dog(&quot;Bobby&quot;);\n    Animal* cat = new Cat(&quot;Kitty&quot;);\n\n    playSound(dog);  \/\/ &quot;Bobby says: Woof!&quot;\n    playSound(cat);  \/\/ &quot;Kitty says: Meow!&quot;\n\n    delete dog;\n    delete cat;\n}<\/code><\/pre>\n<h4>1.3 \uc21c\uc218 \uac00\uc0c1 \ud568\uc218\uc640 \ucd94\uc0c1 \ud074\ub798\uc2a4<\/h4>\n<pre><code class=\"language-cpp\">class Shape {\npublic:\n    virtual double getArea() const = 0;  \/\/ \uc21c\uc218 \uac00\uc0c1 \ud568\uc218\n    virtual ~Shape() {}  \/\/ \uac00\uc0c1 \uc18c\uba78\uc790\n};\n\nclass Circle : public Shape {\nprivate:\n    double radius;\n\npublic:\n    Circle(double r) : radius(r) {}\n\n    double getArea() const override {\n        return 3.14159 * radius * radius;\n    }\n    \/\/ \uc18c\uba78\uc790\ub294 \uba54\ubaa8\ub9ac \ud574\uc81c \ub4f1 \ud2b9\ubcc4\ud55c \uc791\uc5c5\uc774 \ud544\uc694\uc5c6\ub294 \uacbd\uc6b0 \uc0dd\ub7b5\ud560 \uc218 \uc788\ub2e4.\n};<\/code><\/pre>\n<h4>1.4 final\uacfc override<\/h4>\n<p>\uc0c1\uc18d\uacfc \uad00\ub828\ub41c \uba85\uc2dc\uc801 \ud0a4\uc6cc\ub4dc\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class Base {\npublic:\n    virtual void foo() = 0; \/\/ \uc624\ubc84\ub77c\uc774\ub4dc \ud544\uc218\n    virtual void bar() { }  \/\/ \ub514\ud3f4\ud2b8 \uad6c\ud604\uc788\uc74c (\uc624\ubc84\ub77c\uc774\ub4dc \uc120\ud0dd)\n    void baz() { }\n};\n\nclass Derived final : public Base {  \/\/ \ub354 \uc774\uc0c1 \uc0c1\uc18d \ubd88\uac00\ub2a5\n    void foo() override { }          \/\/ \uae30\ubc18 \ud074\ub798\uc2a4 \ud568\uc218\ub97c \uc624\ubc84\ub77c\uc774\ub4dc\n    void bar() override { }          \/\/ override \ud0a4\uc6cc\ub4dc\ub85c (\uc624\ud0c0 \ub4f1) \uc2e4\uc218 \ubc29\uc9c0\n    \/\/ void baz() override { }       \/\/ \ucef4\ud30c\uc77c \uc5d0\ub7ec: \uac00\uc0c1 \ud568\uc218\uac00 \uc544\ub2d8\n};\n\n\/\/ class Further : public Derived { }; \/\/ \uc5d0\ub7ec: final \ud074\ub798\uc2a4\ub294 \uc0c1\uc18d \ubd88\uac00<\/code><\/pre>\n<h4>1.5 \ud2b9\uc218 \uba64\ubc84 \ud568\uc218<\/h4>\n<p>C++\uc758 \ud2b9\uc218 \uba64\ubc84 \ud568\uc218\ub4e4\uc740 \ucef4\ud30c\uc77c\ub7ec\uac00 \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class Example {\npublic:\n   \/\/ \uae30\ubcf8 \uc0dd\uc131\uc790 \n   Example() = default;  \/\/ \uba85\uc2dc\uc801\uc73c\ub85c \uae30\ubcf8 \uad6c\ud604 \uc0ac\uc6a9\n\n   \/\/ \ubcf5\uc0ac \uc0dd\uc131\uc790\n   Example(const Example&amp; other) = delete;  \/\/ \ubcf5\uc0ac \uc0dd\uc131 \uae08\uc9c0\n\n   \/\/ \uc774\ub3d9 \uc0dd\uc131\uc790 (C++11 \uc774\uc0c1)\n   Example(Example&amp;&amp; other) noexcept { \/\/ noexcept \ub294 \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc74c \uba85\uc2dc\n       \/\/ \ub9ac\uc18c\uc2a4 \uc774\ub3d9\n   }\n\n   \/\/ \ubcf5\uc0ac \ub300\uc785 \uc5f0\uc0b0\uc790\n   Example&amp; operator=(const Example&amp; other) {\n       if (this != &amp;other) {\n           \/\/ \uae4a\uc740 \ubcf5\uc0ac \uad6c\ud604\n       }\n       return *this;\n   }\n\n   \/\/ \uc774\ub3d9 \ub300\uc785 \uc5f0\uc0b0\uc790 (C++11 \uc774\uc0c1)\n   Example&amp; operator=(Example&amp;&amp; other) noexcept = default;\n\n   \/\/ \uc18c\uba78\uc790 (\uac00\uc0c1 \uc18c\uba78\uc790 XX)\n   \/\/ \uac00\uc0c1 \uc18c\uba78\uc790\uac00 \ud544\uc694\ud55c \uacbd\uc6b0 virtual \uc744 \ubd99\uc5ec\uc900\ub2e4.\n   ~Example() {\n       \/\/ \ub9ac\uc18c\uc2a4 \uc815\ub9ac\n   }\n};<\/code><\/pre>\n<h4>1.6 special member functions\uc758 \uc81c\uc5b4<\/h4>\n<p>\ucef4\ud30c\uc77c\ub7ec\uac00 \uc790\ub3d9\uc73c\ub85c \uc0dd\uc131\ud558\ub294 \ud2b9\uc218 \uba64\ubc84 \ud568\uc218\ub4e4\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \uc81c\uc5b4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class NonCopyable {\npublic:\n    NonCopyable() = default;                              \/\/ \uae30\ubcf8 \uc0dd\uc131\uc790 \uc0ac\uc6a9\n    NonCopyable(const NonCopyable&amp;) = delete;            \/\/ \ubcf5\uc0ac \uc0dd\uc131\uc790 \uc0ad\uc81c\n    NonCopyable&amp; operator=(const NonCopyable&amp;) = delete;  \/\/ \ubcf5\uc0ac \ub300\uc785 \uc5f0\uc0b0\uc790 \uc0ad\uc81c\n\n    \/\/ \uc774\ub3d9 \uc0dd\uc131\uc790\uc640 \uc774\ub3d9 \ub300\uc785 \uc5f0\uc0b0\uc790\ub294 \uc790\ub3d9 \uc0dd\uc131\n    NonCopyable(NonCopyable&amp;&amp;) = default;\n    NonCopyable&amp; operator=(NonCopyable&amp;&amp;) = default;\n};\n\nclass OnlyMoveable {\npublic:\n    OnlyMoveable() = default;\n\n    \/\/ \ubcf5\uc0ac \uc5f0\uc0b0 \uc0ad\uc81c\n    OnlyMoveable(const OnlyMoveable&amp;) = delete;\n    OnlyMoveable&amp; operator=(const OnlyMoveable&amp;) = delete;\n\n    \/\/ \uc774\ub3d9 \uc5f0\uc0b0 \uba85\uc2dc\uc801 \uc815\uc758\n    OnlyMoveable(OnlyMoveable&amp;&amp; other) noexcept = default;\n    OnlyMoveable&amp; operator=(OnlyMoveable&amp;&amp; other) noexcept = default;\n};<\/code><\/pre>\n<h3>2. \uc608\uc678 \ucc98\ub9ac<\/h3>\n<h4>2.1 \uae30\ubcf8 \uc608\uc678 \ucc98\ub9ac<\/h4>\n<pre><code class=\"language-cpp\">\/\/ C \uc2a4\ud0c0\uc77c \uc5d0\ub7ec \ucc98\ub9ac\nint divide_c(int a, int b, int* result) {\n    if (b == 0) return -1;  \/\/ \uc5d0\ub7ec \ucf54\ub4dc \ubc18\ud658\n    *result = a \/ b;\n    return 0;  \/\/ \uc131\uacf5\n}\n\n\/\/ C++ \uc2a4\ud0c0\uc77c \uc608\uc678 \ucc98\ub9ac\ndouble divide(int a, int b) {\n    if (b == 0) {\n        throw std::runtime_error(&quot;Division by zero!&quot;);\n    }\n    return static_cast&lt;double&gt;(a) \/ b;\n}\n\nint main() {\n    try {\n        double result = divide(10, 0);\n    }\n    catch (const std::exception&amp; e) {\n        std::cerr &lt;&lt; &quot;Error: &quot; &lt;&lt; e.what() &lt;&lt; std::endl;\n    }\n}<\/code><\/pre>\n<h4>2.2 \uc0ac\uc6a9\uc790 \uc815\uc758 \uc608\uc678<\/h4>\n<pre><code class=\"language-cpp\">class DatabaseError : public std::runtime_error {\npublic:\n    DatabaseError(const std::string&amp; message)\n        : std::runtime_error(message) {}\n};\n\nclass Database {\npublic:\n    void connect(const std::string&amp; connectionString) {\n        if (connectionString.empty()) {\n            throw DatabaseError(&quot;Empty connection string&quot;);\n        }\n        \/\/ \uc5f0\uacb0 \ub85c\uc9c1...\n    }\n};<\/code><\/pre>\n<h3>3. \ud15c\ud50c\ub9bf\uacfc \uc77c\ubc18\ud654 \ud504\ub85c\uadf8\ub798\ubc0d<\/h3>\n<h4>3.1 \ud568\uc218 \ud15c\ud50c\ub9bf \uc2ec\ud654<\/h4>\n<pre><code class=\"language-cpp\">\/\/ \uc5ec\ub7ec \ud0c0\uc785 \ub9e4\uac1c\ubcc0\uc218\ntemplate&lt;typename T, typename U&gt;\nauto add(T a, U b) -&gt; decltype(a + b) {\n    return a + b;\n}\n\n\/\/ \ud15c\ud50c\ub9bf \ud2b9\uc218\ud654\ntemplate&lt;typename T&gt;\nT abs(T value) {\n    return value &lt; 0 ? -value : value;\n}\n\ntemplate&lt;&gt;\nstd::string abs(std::string value) {\n    return value;  \/\/ \ubb38\uc790\uc5f4\uc740 \uc808\ub300\uac12\uc774 \uc758\ubbf8 \uc5c6\uc74c\n}<\/code><\/pre>\n<h4>3.2 \ud074\ub798\uc2a4 \ud15c\ud50c\ub9bf<\/h4>\n<pre><code class=\"language-cpp\">template&lt;typename T&gt;\nclass Stack {\nprivate:\n    std::vector&lt;T&gt; elements;\n\npublic:\n    void push(const T&amp; element) {\n        elements.push_back(element);\n    }\n\n    T pop() {\n        if (elements.empty()) {\n            throw std::runtime_error(&quot;Stack is empty&quot;);\n        }\n        T top = elements.back();\n        elements.pop_back();\n        return top;\n    }\n};\n\n\/\/ \uc0ac\uc6a9 \uc608\uc2dc\nStack&lt;int&gt; intStack;\nStack&lt;std::string&gt; stringStack;<\/code><\/pre>\n<h4>3.3 STL \uc18c\uac1c<\/h4>\n<pre><code class=\"language-cpp\">#include &lt;vector&gt;\n#include &lt;algorithm&gt;\n#include &lt;string&gt;\n\nint main() {\n    \/\/ \ubca1\ud130 \uc0ac\uc6a9\n    std::vector&lt;int&gt; numbers = {1, 5, 3, 4, 2};\n\n    \/\/ \uc54c\uace0\ub9ac\uc998 \uc0ac\uc6a9\n    std::sort(numbers.begin(), numbers.end());\n\n    \/\/ find \uc0ac\uc6a9\n    auto it = std::find(numbers.begin(), numbers.end(), 3);\n    if (it != numbers.end()) {\n        std::cout &lt;&lt; &quot;Found 3!&quot; &lt;&lt; std::endl;\n    }\n\n    \/\/ for_each \uc0ac\uc6a9\n    std::for_each(numbers.begin(), numbers.end(), \n        [](int n) { std::cout &lt;&lt; n &lt;&lt; &quot; &quot;; });\n}<\/code><\/pre>\n<h4>3.4 \ud15c\ud50c\ub9bf \uba54\ud0c0\ud504\ub85c\uadf8\ub798\ubc0d \uae30\ucd08<\/h4>\n<p>constexpr \ub294 \ucef4\ud30c\uc77c\uc2dc\uc810\uc5d0 \uc0c1\uc218\ub85c \ud655\uc815\ub428\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">\/\/ \ucef4\ud30c\uc77c \uc2dc\uc810 \ud329\ud1a0\ub9ac\uc5bc \uacc4\uc0b0\ntemplate&lt;unsigned int N&gt;\nstruct Factorial {\n    static constexpr unsigned int value = N * Factorial&lt;N-1&gt;::value;\n};\n\ntemplate&lt;&gt;\nstruct Factorial&lt;0&gt; {\n    static constexpr unsigned int value = 1;\n};<\/code><\/pre>\n<pre><code class=\"language-cpp\">\/\/ \uc0ac\uc6a9 \uc608\uc2dc\nconstexpr auto fact5 = Factorial&lt;5&gt;::value;  \/\/ \ucef4\ud30c\uc77c \uc2dc\uc810\uc5d0 \uacc4\uc0b0<\/code><\/pre>\n<h4>3.5 RAII\uc640 \ub9ac\uc18c\uc2a4 \uad00\ub9ac<\/h4>\n<p>RAII(Resource Acquisition Is Initialization) \ub294 \ub9ac\uc18c\uc2a4 \ucde8\ub4dd\uacfc \ud574\uc81c\ub97c \uc790\ub3d9\ud654\ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">class File {\nprivate:\n    FILE* fp;\n\npublic:\n    File(const char* filename, const char* mode) {\n        fp = fopen(filename, mode);\n        if (!fp) throw std::runtime_error(&quot;Failed to open file&quot;);\n    }\n\n    ~File() {\n        if (fp) fclose(fp);\n    }\n\n    \/\/ \ubcf5\uc0ac \ubc29\uc9c0 (\uc2e4\uc218\ub85c \uc778\ud55c \uc911\ubcf5 close \ubc29\uc9c0)\n    File(const File&amp;) = delete;\n    File&amp; operator=(const File&amp;) = delete;\n\n    \/\/ \ud30c\uc77c \uc791\uc5c5 \uba54\uc11c\ub4dc\ub4e4...\n};\n\n\/\/ \uc0ac\uc6a9 \uc608\uc2dc\nvoid processFile() {\n    File f(&quot;data.txt&quot;, &quot;r&quot;);  \/\/ \uc790\ub3d9\uc73c\ub85c \uc5f4\uace0\n    \/\/ \ud30c\uc77c \uc791\uc5c5...\n}  \/\/ \uc2a4\ucf54\ud504\ub97c \ubc97\uc5b4\ub098\uba74 \uc790\ub3d9\uc73c\ub85c \ub2eb\ud798<\/code><\/pre>\n<h2>Part 4: \uc2e4\uc804\uacfc \ud604\ub300 C++<\/h2>\n<h3>1. STL \ud65c\uc6a9<\/h3>\n<h4>1.1 \ucee8\ud14c\uc774\ub108 \uae30\ucd08<\/h4>\n<pre><code class=\"language-cpp\">#include &lt;vector&gt;\n#include &lt;list&gt;\n#include &lt;map&gt;\n#include &lt;set&gt;\n\nint main() {\n    \/\/ \ubca1\ud130 (\ub3d9\uc801 \ubc30\uc5f4)\n    std::vector&lt;int&gt; vec = {1, 2, 3, 4, 5};\n    vec.push_back(6);  \/\/ \ub05d\uc5d0 \ucd94\uac00\n\n    \/\/ \ub9ac\uc2a4\ud2b8 (\uc774\uc911 \uc5f0\uacb0 \ub9ac\uc2a4\ud2b8)\n    std::list&lt;int&gt; lst = {1, 2, 3};\n    lst.push_front(0);  \/\/ \uc55e\uc5d0 \ucd94\uac00\n\n    \/\/ \ub9f5 (\ud0a4-\uac12 \uc30d)\n    std::map&lt;std::string, int&gt; scores;\n    scores[&quot;Alice&quot;] = 95;\n    scores[&quot;Bob&quot;] = 87;\n\n    \/\/ \uc14b (\uc911\ubcf5 \uc5c6\ub294 \uc815\ub82c\ub41c \uceec\ub809\uc158)\n    std::set&lt;int&gt; uniqueNums = {3, 1, 4, 1, 5};  \/\/ 1\uc740 \ud55c \ubc88\ub9cc \uc800\uc7a5\ub428\n\n    \/\/ remove_if (\uc870\uac74\ubd80 \uc81c\uac70) \ub294 \uc544\ub798\uc5d0\uc11c \uc124\uba85\ud568\n}<\/code><\/pre>\n<h4>1.2 \ubc18\ubcf5\uc790 \ud65c\uc6a9<\/h4>\n<pre><code class=\"language-cpp\">std::vector&lt;int&gt; numbers = {1, 2, 3, 4, 5};\n\n\/\/ \uae30\ubcf8 \ubc18\ubcf5\uc790 \uc0ac\uc6a9\nfor (auto it = numbers.begin(); it != numbers.end(); ++it) {\n    std::cout &lt;&lt; *it &lt;&lt; &quot; &quot;;\n}\n\n\/\/ \uc5ed\ubc29\ud5a5 \ubc18\ubcf5\uc790\nfor (auto rit = numbers.rbegin(); rit != numbers.rend(); ++rit) {\n    std::cout &lt;&lt; *rit &lt;&lt; &quot; &quot;;\n}\n\n\/\/ \ubc94\uc704 \uae30\ubc18 for \ub8e8\ud504 (\uac00\uc7a5 \ud604\ub300\uc801\uc778 \ubc29\ubc95)\nfor (const auto&amp; num : numbers) {\n    std::cout &lt;&lt; num &lt;&lt; &quot; &quot;;\n}<\/code><\/pre>\n<h4>1.3 \uc54c\uace0\ub9ac\uc998 \ub77c\uc774\ube0c\ub7ec\ub9ac<\/h4>\n<pre><code class=\"language-cpp\">#include &lt;algorithm&gt;\n\nstd::vector&lt;int&gt; v = {5, 2, 8, 1, 9};\n\n\/\/ \uc815\ub82c\nstd::sort(v.begin(), v.end());\n\n\/\/ \uc774\uc9c4 \uac80\uc0c9\nbool found = std::binary_search(v.begin(), v.end(), 8);\n\n\/\/ \ucd5c\ub300\/\ucd5c\uc18c \uc694\uc18c \ucc3e\uae30\nauto max_it = std::max_element(v.begin(), v.end());\nauto min_it = std::min_element(v.begin(), v.end());\n\n\/\/ \ud2b9\uc815 \uac12 \ucc3e\uae30\nauto it = std::find(v.begin(), v.end(), 8);\nif (it != v.end()) {\n    std::cout &lt;&lt; &quot;Found 8 at position: &quot; &lt;&lt; std::distance(v.begin(), it) &lt;&lt; std::endl;\n}\n\n\/\/ \uc870\uac74\uc5d0 \ub9de\ub294 \uc694\uc18c \uac1c\uc218 \uc138\uae30\nint count = std::count_if(v.begin(), v.end(), \n    [](int n) { return n % 2 == 0; });  \/\/ \uc9dd\uc218 \uac1c\uc218<\/code><\/pre>\n<h4>1.4 \uc790\uc8fc \uc0ac\uc6a9\ub418\ub294 \ucee8\ud14c\uc774\ub108 \ud65c\uc6a9<\/h4>\n<h5>1.4.1 std::deque (Double-ended Queue)<\/h5>\n<pre><code class=\"language-cpp\">#include &lt;deque&gt;\n\n\/\/ deque\ub294 \uc591\ucabd \ub05d\uc5d0\uc11c \ube60\ub978 \uc0bd\uc785\/\uc0ad\uc81c\uac00 \uac00\ub2a5\ud55c \ucee8\ud14c\uc774\ub108\nstd::deque&lt;int&gt; dq;\n\n\/\/ \uc55e\ub4a4\ub85c \ucd94\uac00\ndq.push_front(1);  \/\/ [1]\ndq.push_back(2);   \/\/ [1,2]\n\n\/\/ \uc784\uc758\uc758 \uc704\uce58 \uc811\uadfc\ndq[0] = 10;        \/\/ [10,2]\n\n\/\/ \uc55e\ub4a4\ub85c \uc81c\uac70\ndq.pop_front();    \/\/ [2]\ndq.pop_back();     \/\/ []<\/code><\/pre>\n<h5>1.4.2 std::set\uacfc std::multiset<\/h5>\n<pre><code class=\"language-cpp\">#include &lt;set&gt;\n\n\/\/ set: \uc911\ubcf5\uc744 \ud5c8\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc815\ub82c\ub41c \ucee8\ud14c\uc774\ub108\nstd::set&lt;int&gt; s = {4, 1, 3, 1, 2};  \/\/ {1, 2, 3, 4}\n\n\/\/ \uc0bd\uc785\nauto [it, success] = s.insert(5);  \/\/ \uc0bd\uc785 \uc131\uacf5 \uc5ec\ubd80 \ud655\uc778\nif (success) {\n    std::cout &lt;&lt; &quot;5 inserted successfully\\n&quot;;\n}\n\n\/\/ \uac80\uc0c9\nif (s.find(3) != s.end()) {\n    std::cout &lt;&lt; &quot;3 exists\\n&quot;;\n}\n\n\/\/ multiset: \uc911\ubcf5\uc744 \ud5c8\uc6a9\ud558\ub294 \uc815\ub82c\ub41c \ucee8\ud14c\uc774\ub108\nstd::multiset&lt;int&gt; ms = {4, 1, 3, 1, 2};  \/\/ {1, 1, 2, 3, 4}\n\n\/\/ \ud2b9\uc815 \uac12\uc758 \uac1c\uc218 \ud655\uc778\nstd::cout &lt;&lt; &quot;Count of 1: &quot; &lt;&lt; ms.count(1) &lt;&lt; std::endl;  \/\/ 2<\/code><\/pre>\n<h5>1.4.3 std::unordered_set\uacfc std::unordered_map<\/h5>\n<pre><code class=\"language-cpp\">#include &lt;unordered_set&gt;\n#include &lt;unordered_map&gt;\n\n\/\/ unordered_set: \ud574\uc2dc \ud14c\uc774\ube14 \uae30\ubc18\uc758 \uc9d1\ud569\nstd::unordered_set&lt;std::string&gt; words = {&quot;apple&quot;, &quot;banana&quot;, &quot;orange&quot;};\n\n\/\/ \ube60\ub978 \uac80\uc0c9\nif (words.find(&quot;apple&quot;) != words.end()) {\n    std::cout &lt;&lt; &quot;apple exists\\n&quot;;\n}\n\n\/\/ unordered_map: \ud574\uc2dc \ud14c\uc774\ube14 \uae30\ubc18\uc758 \ud0a4-\uac12 \uc30d\nstd::unordered_map&lt;std::string, int&gt; scores = {\n    {&quot;Alice&quot;, 100},\n    {&quot;Bob&quot;, 95},\n    {&quot;Charlie&quot;, 90}\n};\n\n\/\/ \ud0a4\ub85c \uc811\uadfc\nscores[&quot;David&quot;] = 85;  \/\/ \uc0c8\ub85c\uc6b4 \uc694\uc18c \ucd94\uac00\n\n\/\/ \uc548\uc804\ud55c \uac80\uc0c9\nif (auto it = scores.find(&quot;Alice&quot;); it != scores.end()) {\n    std::cout &lt;&lt; &quot;Alice&#039;s score: &quot; &lt;&lt; it-&gt;second &lt;&lt; &quot;\\n&quot;;\n}<\/code><\/pre>\n<h5>1.4.4 std::stack\uacfc std::queue<\/h5>\n<pre><code class=\"language-cpp\">#include &lt;stack&gt;\n#include &lt;queue&gt;\n\n\/\/ stack: LIFO (Last In First Out)\nstd::stack&lt;int&gt; st;\nst.push(1);\nst.push(2);\nst.push(3);\n\nwhile (!st.empty()) {\n    std::cout &lt;&lt; st.top() &lt;&lt; &quot; &quot;;  \/\/ 3 2 1\n    st.pop();\n}\n\n\/\/ queue: FIFO (First In First Out)\nstd::queue&lt;int&gt; q;\nq.push(1);\nq.push(2);\nq.push(3);\n\nwhile (!q.empty()) {\n    std::cout &lt;&lt; q.front() &lt;&lt; &quot; &quot;;  \/\/ 1 2 3\n    q.pop();\n}<\/code><\/pre>\n<h5>1.4.5 std::priority_queue<\/h5>\n<pre><code class=\"language-cpp\">#include &lt;queue&gt;\n\n\/\/ \uae30\ubcf8\uc801\uc73c\ub85c \ucd5c\ub300 \ud799\nstd::priority_queue&lt;int&gt; pq;\npq.push(3);\npq.push(1);\npq.push(4);\n\nwhile (!pq.empty()) {\n    std::cout &lt;&lt; pq.top() &lt;&lt; &quot; &quot;;  \/\/ 4 3 1\n    pq.pop();\n}\n\n\/\/ \ucd5c\uc18c \ud799 \ub9cc\ub4e4\uae30\nstd::priority_queue&lt;int, std::vector&lt;int&gt;, std::greater&lt;int&gt;&gt; min_pq;\nmin_pq.push(3);\nmin_pq.push(1);\nmin_pq.push(4);\n\nwhile (!min_pq.empty()) {\n    std::cout &lt;&lt; min_pq.top() &lt;&lt; &quot; &quot;;  \/\/ 1 3 4\n    min_pq.pop();\n}<\/code><\/pre>\n<h4>1.5 \uc720\uc6a9\ud55c STL \uc54c\uace0\ub9ac\uc998<\/h4>\n<h5>1.5.1 \uc815\ub82c\uacfc \uac80\uc0c9<\/h5>\n<pre><code class=\"language-cpp\">#include &lt;algorithm&gt;\n\nstd::vector&lt;int&gt; v = {4, 1, 3, 5, 2};\n\n\/\/ \uc815\ub82c\nstd::sort(v.begin(), v.end());  \/\/ [1,2,3,4,5]\n\n\/\/ \uc5ed\uc21c \uc815\ub82c\nstd::sort(v.begin(), v.end(), std::greater&lt;int&gt;());  \/\/ [5,4,3,2,1]\n\n\/\/ \ubd80\ubd84 \uc815\ub82c\nstd::partial_sort(v.begin(), v.begin() + 3, v.end());  \/\/ \uc55e\uc758 3\uac1c\ub9cc \uc815\ub82c\n\n\/\/ \uc774\uc9c4 \uac80\uc0c9\nif (std::binary_search(v.begin(), v.end(), 3)) {\n    std::cout &lt;&lt; &quot;3 exists\\n&quot;;\n}\n\n\/\/ lower_bound: \uac12 \uc774\uc0c1\uc758 \uccab \uc704\uce58\nauto it = std::lower_bound(v.begin(), v.end(), 3);\n\n\/\/ upper_bound: \uac12 \ucd08\uacfc\uc758 \uccab \uc704\uce58\nauto it2 = std::upper_bound(v.begin(), v.end(), 3);<\/code><\/pre>\n<h5>1.5.2 \uc218\uc815 \uc54c\uace0\ub9ac\uc998<\/h5>\n<pre><code class=\"language-cpp\">std::vector&lt;int&gt; v = {1, 2, 3, 4, 5};\n\n\/\/ \uac12 \ubcc0\uacbd\nstd::replace(v.begin(), v.end(), 3, 30);  \/\/ 3\uc744 30\uc73c\ub85c\n\n\/\/ \uc870\uac74\ubd80 \ubcc0\uacbd\nstd::replace_if(v.begin(), v.end(),\n    [](int n) { return n % 2 == 0; },  \/\/ \uc9dd\uc218\ub97c\n    0);                                \/\/ 0\uc73c\ub85c\n\n\/\/ \uac12 \uc81c\uac70\nauto new_end = std::remove(v.begin(), v.end(), 3);\nv.erase(new_end, v.end());  \/\/ \uc2e4\uc81c\ub85c \ucee8\ud14c\uc774\ub108\uc5d0\uc11c \uc81c\uac70\n\n\/\/ \uc870\uac74\ubd80 \uc81c\uac70\nauto new_end2 = std::remove_if(v.begin(), v.end(),\n    [](int n) { return n &lt; 0; });  \/\/ \uc74c\uc218 \uc81c\uac70\nv.erase(new_end2, v.end());<\/code><\/pre>\n<h5>1.5.3 \uc21c\uc5f4 \uc54c\uace0\ub9ac\uc998<\/h5>\n<pre><code class=\"language-cpp\">std::vector&lt;int&gt; v = {1, 2, 3};\n\n\/\/ \ub2e4\uc74c \uc21c\uc5f4\ndo {\n    for (int n : v) std::cout &lt;&lt; n &lt;&lt; &#039; &#039;;\n    std::cout &lt;&lt; &#039;\\n&#039;;\n} while (std::next_permutation(v.begin(), v.end()));\n\/\/ \ucd9c\ub825: 1 2 3\n\/\/       1 3 2\n\/\/       2 1 3\n\/\/       2 3 1\n\/\/       3 1 2\n\/\/       3 2 1\n\n\/\/ \uc774\uc804 \uc21c\uc5f4\nwhile (std::prev_permutation(v.begin(), v.end())) {\n    \/\/ \ucc98\ub9ac\n}<\/code><\/pre>\n<h5>1.5.4 \uc218\uce58 \uc54c\uace0\ub9ac\uc998<\/h5>\n<pre><code class=\"language-cpp\">#include &lt;numeric&gt;\n\nstd::vector&lt;int&gt; v = {1, 2, 3, 4, 5};\n\n\/\/ \ud569\uacc4\nint sum = std::accumulate(v.begin(), v.end(), 0);\n\n\/\/ \uacf1\nint product = std::accumulate(v.begin(), v.end(), 1,\n    std::multiplies&lt;int&gt;());\n\n\/\/ \ub0b4\uc801\nstd::vector&lt;int&gt; v2 = {2, 3, 4, 5, 6};\nint dot_product = std::inner_product(\n    v.begin(), v.end(),  \/\/ \uccab \ubc88\uc9f8 \ubc94\uc704\n    v2.begin(),          \/\/ \ub450 \ubc88\uc9f8 \ubc94\uc704\uc758 \uc2dc\uc791\n    0);                  \/\/ \ucd08\uae30\uac12\n\n\/\/ \ubd80\ubd84\ud569\nstd::vector&lt;int&gt; partial_sums;\nstd::partial_sum(v.begin(), v.end(),\n    std::back_inserter(partial_sums));\n\/\/ partial_sums: [1,3,6,10,15]<\/code><\/pre>\n<h5>1.5.5 \uc2e4\uc6a9\uc801\uc778 \uc54c\uace0\ub9ac\uc998 \uc870\ud569 \uc608\uc81c<\/h5>\n<pre><code class=\"language-cpp\">\/\/ \ud559\uc0dd \uc131\uc801 \ucc98\ub9ac \uc608\uc81c\nstruct Student {\n    std::string name;\n    int score;\n};\n\nstd::vector&lt;Student&gt; students = {\n    {&quot;Alice&quot;, 85}, {&quot;Bob&quot;, 92}, {&quot;Charlie&quot;, 78}\n};\n\n\/\/ \uc131\uc801\uc21c \uc815\ub82c\nstd::sort(students.begin(), students.end(),\n    [](const Student&amp; a, const Student&amp; b) {\n        return a.score &gt; b.score;  \/\/ \ub0b4\ub9bc\ucc28\uc21c\n    });\n\n\/\/ 80\uc810 \uc774\uc0c1\uc778 \ud559\uc0dd \uc218 \uc138\uae30\nint honor_count = std::count_if(students.begin(), students.end(),\n    [](const Student&amp; s) { return s.score &gt;= 80; });\n\n\/\/ \uc804\uccb4 \ud3c9\uade0 \uacc4\uc0b0\ndouble avg = std::accumulate(students.begin(), students.end(), 0.0,\n    [](double acc, const Student&amp; s) { return acc + s.score; })\n    \/ students.size();\n\n\/\/ \ud2b9\uc815 \uc810\uc218 \ubc94\uc704\uc758 \ud559\uc0dd\ub4e4 \ucc3e\uae30\nauto [lower, upper] = std::equal_range(students.begin(), students.end(),\n    Student{&quot;&quot;, 85},  \/\/ 85\uc810\uc744 \uae30\uc900\uc73c\ub85c\n    [](const Student&amp; a, const Student&amp; b) {\n        return a.score &gt; b.score;\n    });<\/code><\/pre>\n<h3>2. \ud604\ub300 C++ \uae30\ub2a5 (C++11 \uc774\ud6c4)<\/h3>\n<h4>2.1 \ub78c\ub2e4 \ud45c\ud604\uc2dd<\/h4>\n<pre><code class=\"language-cpp\">\/\/ \uae30\ubcf8 \ub78c\ub2e4\nauto add = [](int a, int b) { return a + b; };\nstd::cout &lt;&lt; add(3, 4) &lt;&lt; std::endl;\n\n\/\/ \ucea1\ucc98 \uc0ac\uc6a9\nint multiplier = 10;\nauto multiply = [multiplier](int x) { return x * multiplier; };\n\n\/\/ \uc54c\uace0\ub9ac\uc998\uacfc \ud568\uaed8 \uc0ac\uc6a9\nstd::vector&lt;int&gt; numbers = {1, 2, 3, 4, 5};\nstd::for_each(numbers.begin(), numbers.end(),\n    [](int&amp; n) { n *= 2; });  \/\/ \ubaa8\ub4e0 \uc694\uc18c 2\ubc30\ub85c<\/code><\/pre>\n<h4>2.2 \uc2a4\ub9c8\ud2b8 \ud3ec\uc778\ud130<\/h4>\n<pre><code class=\"language-cpp\">#include &lt;memory&gt;\n\n\/\/ unique_ptr: \ub2e8\uc77c \uc18c\uc720\uad8c\nstd::unique_ptr&lt;int&gt; p1(new int(42));\nauto p2 = std::make_unique&lt;int&gt;(42);  \/\/ \ub354 \uc548\uc804\ud55c \ubc29\ubc95\n\n\/\/ shared_ptr: \uacf5\uc720 \uc18c\uc720\uad8c\nstd::shared_ptr&lt;int&gt; sp1 = std::make_shared&lt;int&gt;(100);\nstd::shared_ptr&lt;int&gt; sp2 = sp1;  \/\/ \ucc38\uc870 \uce74\uc6b4\ud2b8 \uc99d\uac00\n\n\/\/ weak_ptr: \uc21c\ud658 \ucc38\uc870 \ubc29\uc9c0\nstd::weak_ptr&lt;int&gt; wp = sp1;\nif (auto sp = wp.lock()) {  \/\/ \uc720\ud6a8\ud55c \uac1d\uccb4\uc778\uc9c0 \ud655\uc778\n    std::cout &lt;&lt; *sp &lt;&lt; std::endl;\n}<\/code><\/pre>\n<h4>2.3 move \uc2dc\ub9e8\ud2f1\uc2a4<\/h4>\n<pre><code class=\"language-cpp\">class BigData {\n    std::vector&lt;int&gt; data;\npublic:\n    \/\/ \uc774\ub3d9 \uc0dd\uc131\uc790\n    BigData(BigData&amp;&amp; other) noexcept \n        : data(std::move(other.data)) {}\n\n    \/\/ \uc774\ub3d9 \ub300\uc785 \uc5f0\uc0b0\uc790\n    BigData&amp; operator=(BigData&amp;&amp; other) noexcept {\n        if (this != &amp;other) {\n            data = std::move(other.data);\n        }\n        return *this;\n    }\n};\n\n\/\/ std::move \uc0ac\uc6a9\nstd::vector&lt;std::string&gt; v1 = {&quot;hello&quot;, &quot;world&quot;};\nstd::vector&lt;std::string&gt; v2 = std::move(v1);  \/\/ v1\uc758 \ub0b4\uc6a9\uc774 v2\ub85c \uc774\ub3d9<\/code><\/pre>\n<p>std::move \uc774\ub3d9\ub418\uae30 \uc804 \ub370\uc774\ud0c0 \uc811\uadfc\uc740 \uc624\ub958\uac00 \ub0a0\uc218\ub3c4 \ub098\uc9c0 \uc54a\uc744 \uc218\ub3c4 \uc788\ub2e4.<br \/>\n\uadf8\ub0e5 \uba85\uc2dc\uc801\uc73c\ub85c \ucd08\uae30\ud654\ud574\uc8fc\uc790.<\/p>\n<h3>3. \uc2e4\uc804 \ud504\ub85c\uc81d\ud2b8\uc640 \ub514\ubc84\uae45<\/h3>\n<h4>3.1 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870\ud654<\/h4>\n<pre><code class=\"language-cpp\">\/\/ \ud5e4\ub354 \ud30c\uc77c (.hpp)\nclass Project {\npublic:\n    Project();\n    void run();\nprivate:\n    \/\/ \uad6c\ud604 \uc138\ubd80\uc0ac\ud56d\n};\n\n\/\/ \uad6c\ud604 \ud30c\uc77c (.cpp)\n#include &quot;project.hpp&quot;\n\nProject::Project() {\n    \/\/ \ucd08\uae30\ud654 \ucf54\ub4dc\n}\n\nvoid Project::run() {\n    \/\/ \uc2e4\ud589 \ucf54\ub4dc\n}<\/code><\/pre>\n<h4>3.2 \uc131\ub2a5 \ucd5c\uc801\ud654<\/h4>\n<pre><code class=\"language-cpp\">\/\/ \ucd5c\uc801\ud654 \ud14c\ud06c\ub2c9\ub4e4\nclass OptimizedClass {\npublic:\n    \/\/ \ubd88\ud544\uc694\ud55c \ubcf5\uc0ac \ubc29\uc9c0\n    void process(const std::vector&lt;int&gt;&amp; data) {\n        \/\/ data\ub97c \ucc38\uc870\ub85c \ubc1b\uc544 \ubcf5\uc0ac \ubc29\uc9c0\n    }\n\n    \/\/ \uc791\uc740 \uac1d\uccb4\ub294 \uac12\uc73c\ub85c \uc804\ub2ec\n    void setCoordinate(Point p) {  \/\/ Point\uac00 \uc791\uc740 \uad6c\uc870\uccb4\uc77c \uacbd\uc6b0\n        coord = p;\n    }\n\n    \/\/ RVO (Return Value Optimization)\n    \/\/ \uc784\uc2dc vector \uc0dd\uc131 -&gt; \ubc18\ud658\uac12\uc73c\ub85c \ubcf5\uc0ac -&gt; \uc784\uc2dc \uac1d\uccb4 \uc18c\uba78 \ub2e8\uacc4\ub97c \uac70\uce58\uc9c0 \uc54a\uace0 \uc989\uc2dc \ubc18\ud658\uac12 \uc0dd\uc131\n    std::vector&lt;int&gt; getNumbers() {\n        return std::vector&lt;int&gt;{1, 2, 3};  \/\/ \ucef4\ud30c\uc77c\ub7ec\uac00 \uc790\ub3d9\uc73c\ub85c \ucd5c\uc801\ud654\n    }\n};<\/code><\/pre>\n<h4>3.3 \ub514\ubc84\uae45 \uae30\ubc95<\/h4>\n<pre><code class=\"language-cpp\">class DebugHelper {\npublic:\n    static void log(const std::string&amp; message) {\n        #ifdef _DEBUG\n            \/\/ _DEBUG \ub9e4\ud06c\ub85c\uac00 \uc815\uc758\ub41c \uacbd\uc6b0\uc5d0\ub9cc \ub3d9\uc791\n            std::cerr &lt;&lt; &quot;[DEBUG] &quot; &lt;&lt; message &lt;&lt; std::endl;\n        #endif\n    }\n\n    \/\/ RAII \uae30\ubc18\uc2e4\ud589 \uc2dc\uac04 \uce21\uc815 \ud074\ub798\uc2a4\n    class Timer {\n        std::chrono::steady_clock::time_point start;\n        std::string name;\n    public:\n        Timer(const std::string&amp; n) : name(n) {\n            start = std::chrono::steady_clock::now();\n        }\n        ~Timer() {\n            auto end = std::chrono::steady_clock::now();\n            auto diff = end - start;\n            std::cout &lt;&lt; name &lt;&lt; &quot; took &quot; \n                     &lt;&lt; std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(diff).count()\n                     &lt;&lt; &quot; ms&quot; &lt;&lt; std::endl;\n        }\n    };\n};<\/code><\/pre>\n<pre><code class=\"language-cpp\">\/\/ \uc0ac\uc6a9 \uc608\uc2dc\nvoid someFunction() {\n    DebugHelper::Timer t(&quot;someFunction&quot;);\n    \/\/ ... \ucf54\ub4dc \uc2e4\ud589 ...\n}<\/code><\/pre>\n<h2>\ubd80\ub85d<\/h2>\n<h3>1. C++ \ucf54\ub529 \uc2a4\ud0c0\uc77c \uac00\uc774\ub4dc<\/h3>\n<h4>1.1 \uc77c\ubc18\uc801\uc778 \uba85\uba85 \uaddc\uce59<\/h4>\n<pre><code class=\"language-cpp\">\/\/ \ud074\ub798\uc2a4 \uc774\ub984: \ud30c\uc2a4\uce7c \ucf00\uc774\uc2a4\nclass StudentManager {};\n\n\/\/ \ud568\uc218 \ubc0f \ubcc0\uc218: \uce74\uba5c \ucf00\uc774\uc2a4\nvoid calculateGrade();\nint totalScore;\n\n\/\/ \uc0c1\uc218: \ub300\ubb38\uc790\uc640 \uc5b8\ub354\uc2a4\ucf54\uc5b4\nconst int MAX_STUDENTS = 100;\n\n\/\/ \uba64\ubc84 \ubcc0\uc218: m_ \ub610\ub294 _ \uc811\ub450\uc0ac\nclass Student {\nprivate:\n    std::string m_name;\n    int _age;\n};<\/code><\/pre>\n<h4>1.2 \ud30c\uc77c \uad6c\uc870<\/h4>\n<pre><code class=\"language-cpp\">\/\/ header.hpp\n#ifndef HEADER_HPP\n#define HEADER_HPP\n\n\/\/ 1. \uc2dc\uc2a4\ud15c \ud5e4\ub354\n#include &lt;string&gt;\n#include &lt;vector&gt;\n\n\/\/ 2. \ud504\ub85c\uc81d\ud2b8 \ud5e4\ub354\n#include &quot;project_header.hpp&quot;\n\n\/\/ 3. \uc120\uc5b8\ubd80\nclass MyClass {\n    \/\/ ...\n};\n\n#endif\n\n\/\/ source.cpp\n#include &quot;header.hpp&quot;\n\n\/\/ \uad6c\ud604\ubd80<\/code><\/pre>\n<h4>1.3 \ubaa8\ub358 C++ \uad8c\uc7a5 \uc0ac\ud56d<\/h4>\n<pre><code class=\"language-cpp\">\/\/ \uad8c\uc7a5\nauto iter = container.begin();  \/\/ auto \uc0ac\uc6a9\nconst auto&amp; value = getValue(); \/\/ const \ucc38\uc870\nstd::string str{&quot;\ucd08\uae30\ud654&quot;};     \/\/ \uc720\ub2c8\ud3fc \ucd08\uae30\ud654\n\n\/\/ \ube44\uad8c\uc7a5\niterator&lt;vector&lt;int&gt;&gt; iter = container.begin();\nvalue = getValue();\nstd::string str = &quot;\ucd08\uae30\ud654&quot;;<\/code><\/pre>\n<h3>2. C\uc5d0\uc11c C++\ub85c\uc758 \ucf54\ub4dc \ub9c8\uc774\uadf8\ub808\uc774\uc158<\/h3>\n<h4>2.1 \uae30\ubcf8 \ub370\uc774\ud130 \uad6c\uc870 \ubcc0\ud658<\/h4>\n<pre><code class=\"language-cpp\">\/\/ C \uc2a4\ud0c0\uc77c\ntypedef struct {\n    char name[50];\n    int age;\n} Person_C;\n\nvoid print_person(const Person_C* p) {\n    printf(&quot;%s: %d\\n&quot;, p-&gt;name, p-&gt;age);\n}\n\n\/\/ C++ \uc2a4\ud0c0\uc77c\nclass Person {\nprivate:\n    std::string name;\n    int age;\n\npublic:\n    Person(const std::string&amp; n, int a) \n        : name(n), age(a) {}\n\n    void print() const {\n        std::cout &lt;&lt; name &lt;&lt; &quot;: &quot; &lt;&lt; age &lt;&lt; std::endl;\n    }\n};<\/code><\/pre>\n<h4>2.2 \uba54\ubaa8\ub9ac \uad00\ub9ac \ubcc0\ud658<\/h4>\n<pre><code class=\"language-cpp\">\/\/ C \uc2a4\ud0c0\uc77c\nint* array = (int*)malloc(size * sizeof(int));\nfree(array);\n\n\/\/ C++ \uc2a4\ud0c0\uc77c\nstd::vector&lt;int&gt; array(size);\n\/\/ \uc790\ub3d9\uc73c\ub85c \uba54\ubaa8\ub9ac \ud574\uc81c\n\n\/\/ \ub610\ub294 \uc2a4\ub9c8\ud2b8 \ud3ec\uc778\ud130 \uc0ac\uc6a9\nauto ptr = std::make_unique&lt;int[]&gt;(size);<\/code><\/pre>\n<h4>2.3 \ubb38\uc790\uc5f4 \ucc98\ub9ac \ubcc0\ud658<\/h4>\n<pre><code class=\"language-cpp\">\/\/ C \uc2a4\ud0c0\uc77c\nchar str[100];\nstrcpy(str, &quot;Hello&quot;);\nstrcat(str, &quot; World&quot;);\n\n\/\/ C++ \uc2a4\ud0c0\uc77c\nstd::string str = &quot;Hello&quot;;\nstr += &quot; World&quot;;\n\n\/\/ \ubb38\uc790\uc5f4 \uac80\uc0c9\nif (str.find(&quot;World&quot;) != std::string::npos) {\n    \/\/ \ucc3e\uc74c\n}<\/code><\/pre>\n<h3>3. \uc790\uc8fc \ubc1c\uc0dd\ud558\ub294 \uc2e4\uc218\uc640 \ud574\uacb0 \ubc29\ubc95<\/h3>\n<h4>3.1 \uba54\ubaa8\ub9ac \uad00\ub828 \uc2e4\uc218<\/h4>\n<pre><code class=\"language-cpp\">\/\/ \uc2e4\uc218 1: \uba54\ubaa8\ub9ac \ub204\uc218\nclass Resource {\n    int* data;\npublic:\n    Resource() { data = new int[100]; }\n    \/\/ \uc18c\uba78\uc790 \uc5c6\uc74c - \uba54\ubaa8\ub9ac \ub204\uc218!\n};\n\n\/\/ \ud574\uacb0\nclass Resource {\n    std::unique_ptr&lt;int[]&gt; data;\npublic:\n    Resource() : data(std::make_unique&lt;int[]&gt;(100)) {}\n    \/\/ \uc790\ub3d9\uc73c\ub85c \uba54\ubaa8\ub9ac \ud574\uc81c\n};<\/code><\/pre>\n<h4>3.2 \ucc38\uc870\uc790 \uad00\ub828 \uc2e4\uc218<\/h4>\n<pre><code class=\"language-cpp\">\/\/ \uc2e4\uc218 2: \ub315\uae00\ub9c1 \ucc38\uc870 (\uc218\uba85\uc774 \ub05d\ub09c \uba54\ubaa8\ub9ac \uc601\uc5ed \ucc38\uc870)\nint&amp; getDanglingReference() {\n    int local = 42;\n    return local;  \/\/ \uc9c0\uc5ed \ubcc0\uc218 \ucc38\uc870 \ubc18\ud658 - \uc704\ud5d8!\n}\n\n\/\/ \ud574\uacb0\nint getValue() {\n    int local = 42;\n    return local;  \/\/ \uac12 \ubc18\ud658\n}<\/code><\/pre>\n<h4>3.3 \uc0c1\uc18d \uad00\ub828 \uc2e4\uc218<\/h4>\n<p>BaseClass (\ucd5c\uc0c1\uc704 \ud074\ub798\uc2a4) \ub294 \ubc18\ub4dc\uc2dc \uac00\uc0c1 \uc18c\uba78\uc790\ub97c \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.<br \/>\n\uc548\uadf8\ub7ec\uba74 \ud558\uc704 \uc18c\uba78\uc790\ub4e4\uc774 \ud638\ucd9c\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n<pre><code class=\"language-cpp\">\/\/ \uc2e4\uc218 3: \uac00\uc0c1 \uc18c\uba78\uc790 \ub204\ub77d\nclass Base {\npublic:\n    ~Base() {}  \/\/ \ube44\uac00\uc0c1 \uc18c\uba78\uc790\n};\n\nclass Derived : public Base {\n    int* ptr;\npublic:\n    Derived() : ptr(new int(42)) {}\n    ~Derived() { delete ptr; }  \/\/ \uba54\ubaa8\ub9ac \ub204\uc218 \uac00\ub2a5\uc131\n};\n\n\/\/ \ud574\uacb0\nclass Base {\npublic:\n    virtual ~Base() {}  \/\/ \uac00\uc0c1 \uc18c\uba78\uc790\n};<\/code><\/pre>\n<h3>4. \ucd94\ucc9c \ub3c4\uc11c \ubc0f \ucc38\uace0 \uc790\ub8cc<\/h3>\n<h4>4.1 \uc785\ubb38\uc790\ub97c \uc704\ud55c \ub3c4\uc11c<\/h4>\n<ol>\n<li>&quot;C++ Primer&quot; (Stanley Lippman)<\/li>\n<li>&quot;Effective C++&quot; (Scott Meyers)<\/li>\n<li>&quot;A Tour of C++&quot; (Bjarne Stroustrup)<\/li>\n<\/ol>\n<h4>4.2 \uc911\uae09\uc790\ub97c \uc704\ud55c \ub3c4\uc11c<\/h4>\n<ol>\n<li>&quot;Modern C++ Design&quot; (Andrei Alexandrescu)<\/li>\n<li>&quot;Effective Modern C++&quot; (Scott Meyers)<\/li>\n<li>&quot;C++ Templates: The Complete Guide&quot; (David Vandevoorde)<\/li>\n<\/ol>\n<h4>4.3 \uc628\ub77c\uc778 \uc790\ub8cc<\/h4>\n<ol>\n<li>cppreference.com &#8211; \uacf5\uc2dd \ub808\ud37c\ub7f0\uc2a4<\/li>\n<li>isocpp.org &#8211; C++ \ud45c\uc900 \uc704\uc6d0\ud68c<\/li>\n<li>modernescpp.com &#8211; \ubaa8\ub358 C++ \ube14\ub85c\uadf8<\/li>\n<\/ol>\n<h4>4.4 \uc720\uc6a9\ud55c \ub3c4\uad6c\ub4e4<\/h4>\n<ol>\n<li>\n<p>\ucef4\ud30c\uc77c\ub7ec<\/p>\n<ul>\n<li>GCC\/G++<\/li>\n<li>Clang<\/li>\n<li>MSVC<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\uac1c\ubc1c \ub3c4\uad6c<\/p>\n<ul>\n<li>Visual Studio<\/li>\n<li>CLion<\/li>\n<li>VS Code with C++ extensions<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\uc815\uc801 \ubd84\uc11d \ub3c4\uad6c<\/p>\n<ul>\n<li>Clang-Tidy<\/li>\n<li>Cppcheck<\/li>\n<li>SonarQube<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>C \uac1c\ubc1c\uc790\ub97c \uc704\ud55c C++ \uc785\ubb38 C \uc5b8\uc5b4 \uac1c\ubc1c\uc790\ub97c \uc704\ud55c C++ \uac15\uc88c\uc758 \ubaa9\ucc28\ub97c \uc791\uc131\ud574\ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4. C \uac1c\ubc1c\uc790\uc758 \uad00\uc810\uc5d0\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c C++\uc744 \ubc30\uc6b8 \uc218 \uc788\ub3c4\ub85d \uad6c\uc131\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. Part 1: C++\uc758 \uae30\ucd08\uc640 C\uc640\uc758 \ucc28\uc774\uc810 1. \uc785\ucd9c\ub825\uacfc \ub124\uc784\uc2a4\ud398\uc774\uc2a4 1.1 C++\uc758 \uc785\ucd9c\ub825 \uc2dc\uc2a4\ud15c \/\/ C \uc2a4\ud0c0\uc77c #include &lt;stdio.h&gt; int main() { int num = 42; printf(&quot;\uc22b\uc790\ub294 %d\uc785\ub2c8\ub2e4.\\n&quot;, num); char str[100]; scanf(&quot;%s&quot;, str); return\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=9664\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[],"class_list":["post-9664","post","type-post","status-publish","format-standard","hentry","category-c-c"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/9664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9664"}],"version-history":[{"count":27,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/9664\/revisions"}],"predecessor-version":[{"id":9719,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/9664\/revisions\/9719"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}