<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>백구 게임개발 스터디</title>
    <link>https://baggu4402.tistory.com/</link>
    <description>게임개발 공부블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 11 May 2026 09:18:23 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>백구</managingEditor>
    <image>
      <title>백구 게임개발 스터디</title>
      <url>https://tistory1.daumcdn.net/tistory/8634171/attach/6014c6b28419458e9523169c81d1cb8c</url>
      <link>https://baggu4402.tistory.com</link>
    </image>
    <item>
      <title>5/8 (코드카타)</title>
      <link>https://baggu4402.tistory.com/20</link>
      <description>&lt;pre id=&quot;code_1778198369390&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

string solution(string phone_number) {
    string answer = phone_number;
    
    for (int i = 0; i &amp;lt; answer.size() - 4; i++) {
        answer[i] = '*';
    }
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드카타 전화번호 가리기코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class의 정의&lt;/p&gt;
&lt;pre id=&quot;code_1778226950225&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Student
{
    //동작 정의(이를 멤버함수라고 합니다)
    double getAvg();
    int getMaxNum();
    
    //데이터 정의(이를 멤버변수라고 합니다.)
    int kor[3];
    int eng[3];
    int math[3];
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멤버함수 구현(클래스 내부)&lt;/p&gt;
&lt;pre id=&quot;code_1778227001656&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt; //max 함수 사용
#include &amp;lt;string&amp;gt;
using namespace std;
class Student
{
    //동작 정의(이를 멤버함수라고 합니다)
    double getAvg()
    {
        return (kor + eng + math ) / 3.0; 
    }
    int getMax()
    {
        return max(max(kor, eng), math); 
    }
    
    //데이터 정의(이를 멤버변수라고 합니다.)
    int kor;
    int eng;
    int math;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멤버함수 구현(클래스 내부)&lt;/p&gt;
&lt;pre id=&quot;code_1778227014998&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt; //max 함수 사용
#include &amp;lt;string&amp;gt;
using namespace std;
class Student
{
    //동작 정의(이를 멤버함수라고 합니다)
    double getAvg();
    int getMaxNum();
    //데이터 정의(이를 멤버변수라고 합니다.)
    int kor;
    int eng;
    int math;
};

double Student::getAvg()
{
    return (kor + eng + math) / 3.0;
}
int Student::getMaxNum()
{
    return max(max(kor, eng), math);
    // 다른 방법 return max({ kor, eng, math });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;접근제어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;private에 접근제어&lt;/p&gt;
&lt;pre id=&quot;code_1778227088744&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt; //max 함수 사용
#include &amp;lt;string&amp;gt;
using namespace std;

class Student
{
    //동작 정의(이를 멤버함수라고 합니다)
    double getAvg();
    int getMaxScore();
    //데이터 정의(이를 멤버변수라고 합니다.)
    int kor;
    int eng;
    int math;
};

double Student::getAvg()
{
    return (kor + eng + math) / 3.0;
}

int Student::getMaxScore()
{
    return max(max(kor, eng), math);
}

int main()
{
    Student s;
    s.getAvg();
    
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public,private으로 접근제어&lt;/p&gt;
&lt;pre id=&quot;code_1778227116041&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt; //max 함수 사용
#include &amp;lt;string&amp;gt;
using namespace std;

class Student
{
public:
    //동작 정의(이를 멤버함수라고 합니다)
    double getAvg();
    int getMaxScore();

private:
    //데이터 정의(이를 멤버변수라고 합니다.)
    int kor;
    int eng;
    int math;
};

double Student::getAvg()
{
    return (kor + eng + math) / 3.0;
}

int Student::getMaxScore()
{
    return max(max(kor, eng), math);
}

int main()
{
    Student s;
    s.getAvg();
    
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스의 멤버 함수나 멤버 변수에 접근할 때는 객체 뒤에 멤버 접근 연산자 .을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 클래스는 접근 지정자를 사용하여 멤버의 접근 권한을 제어할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;getter와 setter를 적용한 clss&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778227308022&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt; //max 함수 사용
#include &amp;lt;string&amp;gt;

using namespace std;

class Student
{
public:
    //동작 정의(이를 멤버함수라고 합니다)
    double getAvg();
    int getMaxScore();

	    void setMathScore(int math)
    {
        this-&amp;gt;math = math;
    }
    void setEngScore(int eng)
    {
        this-&amp;gt;eng = eng;
  
    }
    void setKorScore(int kor)
    {
        this-&amp;gt;kor = kor;
    }

    int  getMathScore() { return math; }
    int  getEngScore() { return eng; }
    int  getKorScore() { return kor; }

private:
    //데이터 정의(이를 멤버변수라고 합니다.)
    int kor;
    int eng;
    int math;
};

double Student::getAvg()
{
    return (kor + eng + math) / 3.0;
}

int Student::getMaxScore()
{
    return max(max(kor, eng), math);
}

int main()
{
    Student s;

    s.setEngScore(32);
    s.setKorScore(52);
    s.setMathScore(74);

    //평균 최대점수 출력
    cout &amp;lt;&amp;lt; s.getAvg() &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; s.getMaxScore() &amp;lt;&amp;lt; endl;

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후 과제2가 끝난 팀원들과 팀프로젝트 기획과 실습을 하였습니다&lt;/p&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/20</guid>
      <comments>https://baggu4402.tistory.com/20#entry20comment</comments>
      <pubDate>Fri, 8 May 2026 12:13:40 +0900</pubDate>
    </item>
    <item>
      <title>5/7 (코드카타)</title>
      <link>https://baggu4402.tistory.com/19</link>
      <description>&lt;pre id=&quot;code_1778112545869&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

int solution(vector&amp;lt;int&amp;gt; absolutes, vector&amp;lt;bool&amp;gt; signs) {
    int answer = 0;
    
    for (int i = 0; i &amp;lt; absolutes.size(); i++) {
        if (signs[i]) {
            answer += absolutes[i];
        } else {
            answer -= absolutes[i];
        }
    }
    
    return answer;
}  // 배열안에 절대값이있고 true면양수 false면 음수 모두 더한값 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;강의 포인터와 레퍼런스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반변수에서 대입 연산 =를 하면 변수에 있는 값이 그대로 복사됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 변수를 다른 변수에 대입하면 새로운 메모리 공간에 동일한 값이 복제됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 복사 이후에 두 변수는 서로 독립적인 공간을 가지므로, 한 쪽 값을 변경해도 다른쪽에는 영향이 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 복사비용이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 크기가 커지면 복사 비용이 꽤 부담스러울 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 복사비용 때문에 C++에서는 값을 직접 복사하는 방식 대신 변수의 주소를 가리켜서 동일한 데이터에 접근할 수 있도록 할 수 있게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터의 모든 연산은 주소값과 관련되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A=B를 하면 B에있는 값이 A변수에 그대로 저장됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값이 아닌 주소값의 정보를 제공하겠다는 것을 알려줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 사용하는 연산자가 &amp;amp;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A=B가 아닌,A=&amp;amp;B를 하게 되면 A에 B의 주소값이 들어갑니다.&lt;/p&gt;
&lt;pre id=&quot;code_1778119592025&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main() {
    int a = 10;
    int* p = &amp;amp;a; // 변수 a의 주소를 포인터 p에 저장

    cout &amp;lt;&amp;lt; &quot;변수 a의 값: &quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;변수 a의 주소: &quot; &amp;lt;&amp;lt; &amp;amp;a &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;포인터 p의 값(저장된 주소): &quot; &amp;lt;&amp;lt; p &amp;lt;&amp;lt; endl;

    return 0;
}

/*
출력 결과:
변수 a의 값: 10
변수 a의 주소: 0x61ff08 (주소는 실행할 때마다 다를 수 있음)
포인터 p의 값(저장된 주소): 0x61ff08
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;포인터 변수의 역참조&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터는 주소를 다루는 특성 떄문에 산술 연산 역시 주소를 제어하는 방식으로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 역참조 연산자 *를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A를 출력하면 주소값이 나오고, *A를 출력하면 해당 메모리에 있는 값이 나옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1778119714734&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

int main() {
    int x = 3;    // 정수형 변수 x 선언
    int* ptr = &amp;amp;x; // 포인터 ptr에 x의 주소 저장

    cout &amp;lt;&amp;lt; &quot;x의 값: &quot; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;x의 주소: &quot; &amp;lt;&amp;lt; &amp;amp;x &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;ptr의 값(저장된 주소): &quot; &amp;lt;&amp;lt; ptr &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;*ptr이 가리키는 값: &quot; &amp;lt;&amp;lt; *ptr &amp;lt;&amp;lt; endl;

    return 0;
}

/*
출력 결과:
x의 값: 3
x의 주소: 0x61ff00 (주소는 실행할 때마다 다름)
ptr의 값(저장된 주소): 0x61ff00
*ptr이 가리키는 값: 3
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배열과 포인터의 차이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 이름은 사용될 때 대부분 포인터로 암시적 형 변환되어 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) in arr[4];가 있을 때 arr은 배열 전체를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 식이나 인자로 사용되면 int*형으로 변환되어 배열의 첫번째 원소 주소로 해석됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778119874542&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;

// 레퍼런스를 활용하여 변수에 별명을 부여하는 예제
int main() {
    int var = 10;
    int&amp;amp; ref = var; // var의 레퍼런스 선언

    cout &amp;lt;&amp;lt; &quot;초기 값:&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;var: &quot; &amp;lt;&amp;lt; var &amp;lt;&amp;lt; endl; // 10
    cout &amp;lt;&amp;lt; &quot;ref: &quot; &amp;lt;&amp;lt; ref &amp;lt;&amp;lt; endl; // 10

    ref = 20; // ref를 변경하면 var도 변경됨

    cout &amp;lt;&amp;lt; &quot;ref 값을 변경한 후:&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;var: &quot; &amp;lt;&amp;lt; var &amp;lt;&amp;lt; endl; // 20
    cout &amp;lt;&amp;lt; &quot;ref: &quot; &amp;lt;&amp;lt; ref &amp;lt;&amp;lt; endl; // 20

    return 0;
}

/*
출력 결과:
초기 값:
var: 10
ref: 10
ref 값을 변경한 후:
var: 20
ref: 20
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;레퍼런스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터를 사용하면 주소값을 직접 다루어야 하므로 복잡해질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 완화하기 위해 C++에서는 변수에 또 다른 이름을 부여하는 'fpvjfjstm'문법을 도입했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레퍼런스는 일반 변수와 거의 동일하게 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 내부적으로는 해당 변수를 직접 가리켜 주는 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터와 레퍼런스의 차이점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.선언과 초기화 시점이 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-포인터는 선언 후, 나중에 =연산자를 통해 가리킬 대상을 변경할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면에 레퍼런스는 선언과 동시에 초기화해야 하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기화 이후에는 다른 대상에 재연결할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.레퍼런스는 항상 다른 변수와 연결되어 있기 때문에 NULL이라는 게 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-반면에 포인터는 유효한 대상이 없음을 나타내기 위해 NULL 혹은 nullptr을 가질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.간접 참조 문법의 유무입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-포인터는 주소값을 담으므로 접근할 때는 *연산을 사용하고 주소를 가져올 때는 &amp;amp;연산을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 레퍼런스는 변수 자체의 별명이므로 일반변수와 연산하는 방법이 동일합니다.&lt;/p&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/19</guid>
      <comments>https://baggu4402.tistory.com/19#entry19comment</comments>
      <pubDate>Thu, 7 May 2026 16:36:23 +0900</pubDate>
    </item>
    <item>
      <title>텍스트던전rpg 분석</title>
      <link>https://baggu4402.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;#include&lt;/p&gt;
&lt;pre id=&quot;code_1778062687365&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt; // cout, cin, endl
#include &amp;lt;string&amp;gt;   // string 문자열 자료형
#include &amp;lt;vector&amp;gt;   // vector 동적 배열
#include &amp;lt;algorithm&amp;gt;// sort, min
#include &amp;lt;map&amp;gt;      // key-value 저장소&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;using namespace std;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778062870305&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using namespace std;

// std를 안썼을때
std::cout &amp;lt;&amp;lt; &quot;hello&quot;;
std::string name;

// std를 썼을때
cout &amp;lt;&amp;lt; &quot;hello&quot;;
string name;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++ 표준 라이브러리의 기능들은 원래 std::cout, std::string처럼 써야 함.&lt;br /&gt;그런데 이 문장을 쓰면 std::를 생략할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿 template&amp;lt;typename T&amp;gt; &amp;mdash; 자료형을 일반화&lt;/p&gt;
&lt;pre id=&quot;code_1778063027061&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template&amp;lt;typename T&amp;gt; //여기서 T는 &amp;ldquo;아직 정해지지 않은 타입&amp;rdquo;.
class Inventory
{
    ...
};

Inventory&amp;lt;Item&amp;gt; inventory(10); // 예시코드&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿은 &lt;b&gt;자료형을 나중에 정하게 하는 문법&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 통해 &lt;b&gt;하나의 클래스로 여러 타입을 처리하는 방법을 알수잇음.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 class - 사용자 정의 자료형&lt;/p&gt;
&lt;pre id=&quot;code_1778063264710&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Player
{
protected:
    string name;
    string job;
    int level;
    int exp;
    int maxExp;
    int hp;
    int mp;
    int power;
    int defence;
    ...
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스는 &lt;b&gt;데이터와 기능을 하나로 묶는 문법&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1861&quot; data-start=&quot;1803&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1829&quot; data-start=&quot;1803&quot; data-section-id=&quot;k20vf2&quot;&gt;데이터: 이름, 직업, HP, MP, 공격력&lt;/li&gt;
&lt;li data-end=&quot;1861&quot; data-start=&quot;1830&quot; data-section-id=&quot;1qs34fb&quot;&gt;기능: 공격, 상태 출력, getter, setter&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1923&quot; data-start=&quot;1863&quot; data-ke-size=&quot;size16&quot;&gt;접근 지정자 private, protected, public&lt;/p&gt;
&lt;pre id=&quot;code_1778063406838&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private: // 클래스 내부에서만 사용
    T* pItems;
    int capacity_;
    int size_;

protected: // 클래스 내부 + 자식 클래스
    string name;
    string job;

public: // 외부에서도 사용 가능
    Player(string name, int hp, int mp, int power, int defence)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2478&quot; data-start=&quot;2429&quot; data-section-id=&quot;16cd507&quot;&gt;Inventory 내부 배열은 외부가 함부로 건드리면 안 되니까 private&lt;/li&gt;
&lt;li data-end=&quot;2532&quot; data-start=&quot;2479&quot; data-section-id=&quot;sw97s3&quot;&gt;Player의 이름/직업은 자식 클래스(전사, 궁수)가 써야 하니까 protected&lt;/li&gt;
&lt;li data-end=&quot;2576&quot; data-start=&quot;2533&quot; data-section-id=&quot;2br3gp&quot;&gt;생성자, getter, setter는 외부에서 써야 하니까 public&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자 - 객체가 만들어질 때 자동 실행&lt;/p&gt;
&lt;pre id=&quot;code_1778063512108&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Player(string name, int hp, int mp, int power, int defence)
{
    this-&amp;gt;name = name;
    this-&amp;gt;job = &quot;None&quot;;
    this-&amp;gt;level = 1;
    this-&amp;gt;exp = 0;
    this-&amp;gt;maxExp = 100;
    this-&amp;gt;hp = hp;
    this-&amp;gt;mp = mp;
    this-&amp;gt;power = power;
    this-&amp;gt;defence = defence;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3042&quot; data-start=&quot;3014&quot; data-ke-size=&quot;size16&quot;&gt;생성자는 객체를 만들 때 자동으로 호출되는 함수야.&lt;/p&gt;
&lt;p data-end=&quot;3042&quot; data-start=&quot;3014&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3042&quot; data-start=&quot;3014&quot; data-ke-size=&quot;size16&quot;&gt;역할&lt;/p&gt;
&lt;p data-end=&quot;3065&quot; data-start=&quot;3050&quot; data-ke-size=&quot;size16&quot;&gt;플레이어 객체가 만들어지면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3116&quot; data-start=&quot;3066&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3073&quot; data-start=&quot;3066&quot; data-section-id=&quot;1y87ucd&quot;&gt;이름 저장&lt;/li&gt;
&lt;li data-end=&quot;3084&quot; data-start=&quot;3074&quot; data-section-id=&quot;154nnt1&quot;&gt;초기 직업 설정&lt;/li&gt;
&lt;li data-end=&quot;3094&quot; data-start=&quot;3085&quot; data-section-id=&quot;1b3v06g&quot;&gt;레벨 1 설정&lt;/li&gt;
&lt;li data-end=&quot;3105&quot; data-start=&quot;3095&quot; data-section-id=&quot;238fhw&quot;&gt;경험치 0 설정&lt;/li&gt;
&lt;li data-end=&quot;3116&quot; data-start=&quot;3106&quot; data-section-id=&quot;hn5ijy&quot;&gt;기본 스탯 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 &lt;b&gt;초기화 작업&lt;/b&gt;을 해줌.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;this-&amp;gt; -- 현재 객체 자신 가리키기&lt;/p&gt;
&lt;pre id=&quot;code_1778064752917&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;this-&amp;gt;name = name;
this-&amp;gt;hp = hp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3382&quot; data-start=&quot;3350&quot; data-ke-size=&quot;size16&quot;&gt;this는 &lt;b&gt;현재 객체 자신을 가리키는 포인터&lt;/b&gt;.&lt;/p&gt;
&lt;p data-end=&quot;3423&quot; data-start=&quot;3393&quot; data-ke-size=&quot;size16&quot;&gt;매개변수 이름과 멤버변수 이름이 같아서 구분하려고 씀.&lt;/p&gt;
&lt;p data-end=&quot;3423&quot; data-start=&quot;3393&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3423&quot; data-start=&quot;3393&quot; data-ke-size=&quot;size16&quot;&gt;상속 : public Player&lt;/p&gt;
&lt;pre id=&quot;code_1778064796436&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Warrior : public Player
{
public:
    Warrior(string name, int hp, int mp, int power, int defence)
        : Player(name, hp, mp, power, defence)
    {
        job = &quot;전사&quot;;
        this-&amp;gt;hp += 30;
    }

    void attack(Monster* monster) override;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;3423&quot; data-start=&quot;3393&quot; data-ke-size=&quot;size16&quot;&gt;상속은 &lt;b&gt;기존 클래스의 기능을 물려받아 새 클래스를 만드는 문법.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;3423&quot; data-start=&quot;3393&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3423&quot; data-start=&quot;3393&quot; data-ke-size=&quot;size16&quot;&gt;생성자 초기화 리스트 : Player(...)&lt;/p&gt;
&lt;pre id=&quot;code_1778064859746&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Warrior(string name, int hp, int mp, int power, int defence)
    : Player(name, hp, mp, power, defence)
{
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4423&quot; data-start=&quot;4382&quot; data-ke-size=&quot;size16&quot;&gt;자식 클래스가 만들어질 때, 먼저 부모 클래스 생성자를 호출하는 문법.&lt;/p&gt;
&lt;p data-end=&quot;4492&quot; data-start=&quot;4435&quot; data-ke-size=&quot;size16&quot;&gt;전사를 만들기 전에 먼저 Player 부분을 초기화하고,&lt;br /&gt;그 다음에 전사 전용 설정을 추가한다.&lt;/p&gt;
&lt;p data-end=&quot;4492&quot; data-start=&quot;4435&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;4492&quot; data-start=&quot;4435&quot; data-ke-size=&quot;size16&quot;&gt;가상 함수와 순수 가상 함수&lt;/p&gt;
&lt;pre id=&quot;code_1778064939028&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;virtual void attack(Monster* monster) = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;4790&quot; data-start=&quot;4729&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;순수 가상 함수&lt;/b&gt;.&lt;br /&gt;부모 클래스에서는 형태만 정하고, 구현은 자식이 꼭 하게 만드는 문법.&lt;/p&gt;
&lt;p data-end=&quot;4873&quot; data-start=&quot;4797&quot; data-ke-size=&quot;size16&quot;&gt;Player는 &amp;ldquo;플레이어는 공격할 수 있다&amp;rdquo;는 틀만 제공하고,&lt;br /&gt;실제 공격 방식은 전사/마법사/도적/궁수가 각자 구현.&lt;/p&gt;
&lt;p data-end=&quot;4873&quot; data-start=&quot;4797&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;4873&quot; data-start=&quot;4797&quot; data-ke-size=&quot;size16&quot;&gt;오버라이딩 override&lt;/p&gt;
&lt;pre id=&quot;code_1778064997109&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void attack(Monster* monster) override;  // 예시코드

void Archer::attack(Monster* monster)
{
    int damage = (power - monster-&amp;gt;getDefence()) / 3;
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;5270&quot; data-start=&quot;5223&quot; data-ke-size=&quot;size16&quot;&gt;오버라이딩은 부모 클래스의 함수를 자식 클래스가 &lt;b&gt;다르게 다시 구현&lt;/b&gt;.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5340&quot; data-start=&quot;5282&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5295&quot; data-start=&quot;5282&quot; data-section-id=&quot;cmjp73&quot;&gt;전사: 한 번 강하게&lt;/li&gt;
&lt;li data-end=&quot;5310&quot; data-start=&quot;5296&quot; data-section-id=&quot;9dtal2&quot;&gt;마법사: 한 번 강하게&lt;/li&gt;
&lt;li data-end=&quot;5325&quot; data-start=&quot;5311&quot; data-section-id=&quot;1csqw0o&quot;&gt;궁수: 3번 나눠 때림&lt;/li&gt;
&lt;li data-end=&quot;5340&quot; data-start=&quot;5326&quot; data-section-id=&quot;17wti1u&quot;&gt;도적: 5번 나눠 때림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5364&quot; data-start=&quot;5342&quot; data-ke-size=&quot;size16&quot;&gt;같은 attack인데 행동이 다르다.&lt;/p&gt;
&lt;p data-end=&quot;5364&quot; data-start=&quot;5342&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;5364&quot; data-start=&quot;5342&quot; data-ke-size=&quot;size16&quot;&gt;전방 선언 class Monster;&lt;/p&gt;
&lt;pre id=&quot;code_1778065057126&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Monster;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 &amp;ldquo;Monster라는 클래스가 뒤에 나올 거다&amp;rdquo;라고 &lt;b&gt;미리 이름만 알려주는 문법.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 필요한가?&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778065119807&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;virtual void attack(Monster* monster) = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;player 안에서 위의 코드가있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 Monster 클래스 정의는 뒤쪽에 있기때문에&lt;br /&gt;컴파일러에게 &amp;ldquo;Monster라는 타입이 나중에 나와&amp;rdquo;라고 미리 알려줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터 T*, Player*, Monster*&lt;/p&gt;
&lt;pre id=&quot;code_1778065167852&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;T* pItems;  // 아이템 배열의 시작 주소
Player* player = nullptr; // 플레이어 객체를 가리키는 주소
virtual void attack(Monster* monster) = 0; // 몬스터 객체를 가리키는 주소&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터는 &lt;b&gt;메모리 주소를 저장하는 변수&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6167&quot; data-start=&quot;6155&quot; data-section-id=&quot;vm4v57&quot;&gt;동적 메모리 할당&lt;/li&gt;
&lt;li data-end=&quot;6183&quot; data-start=&quot;6168&quot; data-section-id=&quot;ue6r3k&quot;&gt;함수에 원본 객체 전달&lt;/li&gt;
&lt;li data-end=&quot;6204&quot; data-start=&quot;6184&quot; data-section-id=&quot;1cbcxcg&quot;&gt;부모 포인터로 자식 객체 다루기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적 메모리 new, delete[], delete&lt;/p&gt;
&lt;pre id=&quot;code_1778065243313&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pItems = new T[capacity_];
delete[] pItems;


player = new Warrior(name, stat[0], stat[1], stat[2], stat[3]);
...
delete player;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 실행중에 메모리를 직접 만들고 해제하는 문법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6607&quot; data-start=&quot;6579&quot; data-section-id=&quot;lrgvrz&quot;&gt;new T[capacity_] : 배열 생성&lt;/li&gt;
&lt;li data-end=&quot;6635&quot; data-start=&quot;6608&quot; data-section-id=&quot;46z76f&quot;&gt;delete[] pItems : 배열 해제&lt;/li&gt;
&lt;li data-end=&quot;6667&quot; data-start=&quot;6636&quot; data-section-id=&quot;1udi6y3&quot;&gt;new Warrior(...) : 객체 1개 생성&lt;/li&gt;
&lt;li data-end=&quot;6696&quot; data-start=&quot;6668&quot; data-section-id=&quot;1ia9xw&quot;&gt;delete player : 객체 1개 해제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소멸자 ~Inventory()&lt;/p&gt;
&lt;pre id=&quot;code_1778065302188&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;~Inventory()
{
    delete[] pItems;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소멸자는 객체가 사라질 때 자동 호출되는 함수.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inventory가 사라질 때 내부에서 new[]로 만든 메모리를 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복사 생성자&lt;/p&gt;
&lt;pre id=&quot;code_1778065346379&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Inventory(const Inventory&amp;amp; other)
{
    capacity_ = other.capacity_;
    size_ = other.size_;
    pItems = new T[capacity_];

    for (int i = 0; i &amp;lt; size_; i++)
    {
        pItems[i] = other.pItems[i];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;7404&quot; data-start=&quot;7367&quot; data-ke-size=&quot;size16&quot;&gt;복사 생성자는 객체를 복사해서 새 객체를 만들 때 호출되는 함수.&lt;/p&gt;
&lt;p data-end=&quot;7491&quot; data-start=&quot;7416&quot; data-ke-size=&quot;size16&quot;&gt;Inventory는 내부에 포인터 pItems가 있어서,&lt;br /&gt;그냥 복사하면 주소만 복사되는 &lt;b&gt;얕은 복사&lt;/b&gt; 문제가 생길 수 있음.&lt;/p&gt;
&lt;p data-end=&quot;7526&quot; data-start=&quot;7493&quot; data-ke-size=&quot;size16&quot;&gt;그래서 새 메모리를 만들고, 안의 값들을 직접 복사해야함.&lt;/p&gt;
&lt;p data-end=&quot;7526&quot; data-start=&quot;7493&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;7526&quot; data-start=&quot;7493&quot; data-ke-size=&quot;size16&quot;&gt;배열과 인덱스&lt;/p&gt;
&lt;pre id=&quot;code_1778065407634&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int stat[SIZE] = { 0 };
cout &amp;lt;&amp;lt; &quot;HP: &quot; &amp;lt;&amp;lt; stat[0] &amp;lt;&amp;lt; &quot;     MP: &quot; &amp;lt;&amp;lt; stat[1] &amp;lt;&amp;lt; endl;
cout &amp;lt;&amp;lt; &quot;공격력: &quot; &amp;lt;&amp;lt; stat[2] &amp;lt;&amp;lt; &quot;     방어력: &quot; &amp;lt;&amp;lt; stat[3] &amp;lt;&amp;lt; endl;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;7864&quot; data-start=&quot;7834&quot; data-ke-size=&quot;size16&quot;&gt;배열은 같은 타입의 데이터를 순서대로 저장하는 구조.&lt;/p&gt;
&lt;p data-end=&quot;7864&quot; data-start=&quot;7834&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;7864&quot; data-start=&quot;7834&quot; data-ke-size=&quot;size16&quot;&gt;함수 매개변수와 반환값&lt;/p&gt;
&lt;pre id=&quot;code_1778065453191&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int GetStock(map&amp;lt;string, int&amp;gt;&amp;amp; potionStock, string name)
{
    return potionStock[name];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수는 입력을 받고 결과를 돌려줄 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 &amp;amp; 와 포인터 * 차이&lt;/p&gt;
&lt;pre id=&quot;code_1778065503502&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 예시1
int GetStock(map&amp;lt;string, int&amp;gt;&amp;amp; potionStock, string name)
// 예시2
void setPotion(int count, int* p_HPPotion, int* p_MPPotion)
{
    *p_HPPotion = count;
    *p_MPPotion = count;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;8716&quot; data-start=&quot;8690&quot; data-ke-size=&quot;size16&quot;&gt;둘 다 원본에 접근할 수 있지만 다르다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;8778&quot; data-start=&quot;8724&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;8749&quot; data-start=&quot;8724&quot; data-section-id=&quot;z73n7l&quot;&gt;참조 &amp;amp; : 원본의 다른 이름처럼 사용&lt;/li&gt;
&lt;li data-end=&quot;8778&quot; data-start=&quot;8750&quot; data-section-id=&quot;s0yvh7&quot;&gt;포인터 * : 주소를 받아서 역참조해서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘다나오는 이유&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;8778&quot; data-start=&quot;8724&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;8824&quot; data-start=&quot;8798&quot; data-section-id=&quot;17jlela&quot;&gt;map은 참조로 넘겨서 편하게 수정/조회&lt;/li&gt;
&lt;li data-end=&quot;8851&quot; data-start=&quot;8825&quot; data-section-id=&quot;13far8e&quot;&gt;포션 숫자는 포인터로 넘겨서 주소 개념 연습&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getter / setter&lt;/p&gt;
&lt;pre id=&quot;code_1778065569812&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int getHP()
{
    return hp;
}

void setHP(int hp)
{
    this-&amp;gt;hp = hp;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;9110&quot; data-start=&quot;9066&quot; data-ke-size=&quot;size16&quot;&gt;클래스 내부 데이터를 직접 열어두지 않고,&lt;br /&gt;함수를 통해 읽고 수정하는 방법.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;9168&quot; data-start=&quot;9118&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;9141&quot; data-start=&quot;9118&quot; data-section-id=&quot;fo2ryu&quot;&gt;외부가 내부 구조를 직접 건드리지 않음&lt;/li&gt;
&lt;li data-end=&quot;9159&quot; data-start=&quot;9142&quot; data-section-id=&quot;1c7b70g&quot;&gt;나중에 검증 로직 추가 가능&lt;/li&gt;
&lt;li data-end=&quot;9168&quot; data-start=&quot;9160&quot; data-section-id=&quot;1ihpywc&quot;&gt;캡슐화 강화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체 struct&lt;/p&gt;
&lt;pre id=&quot;code_1778065630775&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct Item
{
    string name;
    int price;

    void PrintInfo() const
    {
        cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &quot; (&quot; &amp;lt;&amp;lt; price &amp;lt;&amp;lt; &quot;G)&quot; &amp;lt;&amp;lt; endl;
    }
};

// 또는

struct PotionRecipe
{
    string potionName;
    string ingredient1;
    string ingredient2;
};&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;9567&quot; data-start=&quot;9560&quot; data-section-id=&quot;1h8hlhq&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-end=&quot;9635&quot; data-start=&quot;9568&quot; data-ke-size=&quot;size16&quot;&gt;구조체는 관련 있는 데이터를 묶는 자료형.&lt;br /&gt;C++에서는 함수도 넣을 수 있어서 class와 비슷하게 쓸 수 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;9716&quot; data-start=&quot;9647&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;9664&quot; data-start=&quot;9647&quot; data-section-id=&quot;8mpmi2&quot;&gt;Item : 아이템 정보&lt;/li&gt;
&lt;li data-end=&quot;9693&quot; data-start=&quot;9665&quot; data-section-id=&quot;1xr01t0&quot;&gt;PotionRecipe : 포션 레시피 정보&lt;/li&gt;
&lt;li data-end=&quot;9716&quot; data-start=&quot;9694&quot; data-section-id=&quot;1sr18nt&quot;&gt;DungeonRoom : 방 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const - 수정 금지 약속&lt;/p&gt;
&lt;pre id=&quot;code_1778065705450&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void PrintInfo() const

void ShowAllRecipes(const vector&amp;lt;PotionRecipe&amp;gt;&amp;amp; recipes)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;9991&quot; data-start=&quot;9962&quot; data-ke-size=&quot;size16&quot;&gt;const는 &amp;ldquo;이걸 수정하지 않겠다&amp;rdquo;는 약속이야.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;10105&quot; data-start=&quot;10002&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;10047&quot; data-start=&quot;10002&quot; data-section-id=&quot;cbngdw&quot;&gt;PrintInfo() const : 이 함수는 객체의 멤버값을 바꾸지 않음&lt;/li&gt;
&lt;li data-end=&quot;10105&quot; data-start=&quot;10048&quot; data-section-id=&quot;v9epd8&quot;&gt;const vector&amp;lt;PotionRecipe&amp;gt;&amp;amp; : recipes를 읽기만 하고 수정하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vector &amp;mdash; 동적 배열&lt;/p&gt;
&lt;pre id=&quot;code_1778065741564&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vector&amp;lt;PotionRecipe&amp;gt; recipes;
recipes.push_back({ &quot;HP포션&quot;, &quot;허브&quot;, &quot;맑은물&quot; });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;10359&quot; data-start=&quot;10330&quot; data-ke-size=&quot;size16&quot;&gt;vector는 크기가 자동으로 늘어나는 배열.&lt;/p&gt;
&lt;p data-end=&quot;10407&quot; data-start=&quot;10374&quot; data-ke-size=&quot;size16&quot;&gt;포션 레시피 개수가 고정이 아니어도 편하게 추가할 수 있음.&lt;/p&gt;
&lt;p data-end=&quot;10407&quot; data-start=&quot;10374&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;10407&quot; data-start=&quot;10374&quot; data-ke-size=&quot;size16&quot;&gt;map&amp;lt;string, int&amp;gt; &amp;mdash; key-value 자료구조&lt;/p&gt;
&lt;pre id=&quot;code_1778065785591&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;map&amp;lt;string, int&amp;gt; potionStock;

potionStock[&quot;HP 포션&quot;] = 3;
potionStock[&quot;MP 포션&quot;] = 3;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map은 &lt;b&gt;이름표(key)&lt;/b&gt; 와 &lt;b&gt;값(value)&lt;/b&gt; 를 짝으로 저장하는 자료구조.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문 for, while&lt;/p&gt;
&lt;pre id=&quot;code_1778065828990&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt; size_; i++)
{
    pItems[i] = other.pItems[i];
}


while (true)
{
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;11160&quot; data-start=&quot;11113&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;11132&quot; data-start=&quot;11113&quot; data-section-id=&quot;f7qcdu&quot;&gt;for : 횟수가 명확할 때&lt;/li&gt;
&lt;li data-end=&quot;11160&quot; data-start=&quot;11133&quot; data-section-id=&quot;1kqy0od&quot;&gt;while : 조건이 참인 동안 반복할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;11160&quot; data-start=&quot;11113&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;11202&quot; data-start=&quot;11172&quot; data-section-id=&quot;1izokzo&quot;&gt;for : 인벤토리 복사, 배열 출력, 방 순회&lt;/li&gt;
&lt;li data-end=&quot;11237&quot; data-start=&quot;11203&quot; data-section-id=&quot;1h5aj80&quot;&gt;while : 게임 메뉴 반복, 전투 반복, 입력 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문 if, else if, switch&lt;/p&gt;
&lt;pre id=&quot;code_1778065875173&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (damage &amp;lt;= 0)
{
    damage = 1;
}


switch (jobChoice)
{
case 1:
    player = new Warrior(...);
    break;
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;11533&quot; data-start=&quot;11516&quot; data-ke-size=&quot;size16&quot;&gt;조건에 따라 분기하는 문법이야.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;11593&quot; data-start=&quot;11541&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;11567&quot; data-start=&quot;11541&quot; data-section-id=&quot;4c0vzg&quot;&gt;if : 범위, 비교, 복합 조건에 강함&lt;/li&gt;
&lt;li data-end=&quot;11593&quot; data-start=&quot;11568&quot; data-section-id=&quot;jf8505&quot;&gt;switch : 번호 선택 메뉴에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sort, min &amp;mdash; 알고리즘 함수&lt;/p&gt;
&lt;pre id=&quot;code_1778065940095&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sort(pItems, pItems + size_, compareByPrice);

int newHP = min(player-&amp;gt;getHP() + 50, 100);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;11951&quot; data-start=&quot;11923&quot; data-ke-size=&quot;size16&quot;&gt;표준 라이브러리 알고리즘을 직접 사용하는 방법이야.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;11991&quot; data-start=&quot;11959&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;11972&quot; data-start=&quot;11959&quot; data-section-id=&quot;8exmr5&quot;&gt;sort : 정렬&lt;/li&gt;
&lt;li data-end=&quot;11991&quot; data-start=&quot;11973&quot; data-section-id=&quot;131ri7m&quot;&gt;min : 둘 중 작은 값&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;11991&quot; data-start=&quot;11959&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;12015&quot; data-start=&quot;12003&quot; data-section-id=&quot;1tm1fxk&quot;&gt;아이템 가격순 정렬&lt;/li&gt;
&lt;li data-end=&quot;12038&quot; data-start=&quot;12016&quot; data-section-id=&quot;rjhmt2&quot;&gt;HP/MP가 최대값을 넘지 않게 제한&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/18</guid>
      <comments>https://baggu4402.tistory.com/18#entry18comment</comments>
      <pubDate>Wed, 6 May 2026 20:15:06 +0900</pubDate>
    </item>
    <item>
      <title>5/6 (개인프로젝트,과제2도전step8)</title>
      <link>https://baggu4402.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;주말과 남은시간을 모두 사용해서 게임개발을 하였습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://youtu.be/_Tymr6o0sO8&quot;&gt;https://youtu.be/_Tymr6o0sO8&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=_Tymr6o0sO8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/blhkTQ/dJMb9hC5dhD/0IH7Bthp4zLM4JAtqsiPD0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/c92bkg/dJMb9fZzhpo/YlCIKeB2ND5LPGMajaSjT1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/Y21ZF/dJMb9iIKXVh/FbXb9Y3hLLW0tYtl5auVKk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;프로젝트 게임플레이&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_Tymr6o0sO8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터를 이용해 함수 바깥 변수 값을 변경하는 방법을 연습했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setPotion(int count, int* p_HPPotion, int* p_MPPotion) 함수를 만들어 HP 포션과 MP 포션 개수를 한 번에 설정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;455&quot; data-start=&quot;438&quot;&gt;&amp;amp;변수는 주소를 뜻한다.&lt;/li&gt;
&lt;li data-end=&quot;485&quot; data-start=&quot;456&quot;&gt;*포인터는 해당 주소가 가리키는 실제 값이다.&lt;/li&gt;
&lt;li data-end=&quot;521&quot; data-start=&quot;486&quot;&gt;함수 밖 변수 값을 바꾸려면 포인터나 참조를 사용해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 단계에서는 Player 클래스에 레벨, 경험치, 최대 경험치 개념을 추가했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exp, maxExp, level을 관리하도록 만들고, 전투 승리 시 경험치를 획득하도록 구현했다.&lt;br /&gt;경험치가 최대 경험치 이상이 되면 레벨업이 발생하고, 레벨업 시 HP, MP, 공격력이 증가하도록 연결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 단계에서는 &lt;b&gt;오버라이딩&lt;/b&gt;을 활용해 직업마다 다른 공격 방식을 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1162&quot; data-start=&quot;1045&quot; data-ke-size=&quot;size16&quot;&gt;기존 attack() 함수를 virtual void attack(Monster* monster) = 0; 형태로 바꾸고,&lt;br /&gt;전사 / 마법사 / 궁수 / 도적이 각각 자기 방식대로 공격하도록 재정의했다.&lt;/p&gt;
&lt;p data-end=&quot;1174&quot; data-start=&quot;1164&quot; data-ke-size=&quot;size16&quot;&gt;직업별 공격 방식:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1291&quot; data-start=&quot;1175&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1197&quot; data-start=&quot;1175&quot;&gt;전사: 공격력 - 방어력, 1회 공격&lt;/li&gt;
&lt;li data-end=&quot;1221&quot; data-start=&quot;1198&quot;&gt;마법사: 공격력 - 방어력, 1회 공격&lt;/li&gt;
&lt;li data-end=&quot;1256&quot; data-start=&quot;1222&quot;&gt;궁수: (공격력 - 방어력) / 3 데미지를 3번 적용&lt;/li&gt;
&lt;li data-end=&quot;1291&quot; data-start=&quot;1257&quot;&gt;도적: (공격력 - 방어력) / 5 데미지를 5번 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step4&lt;/p&gt;
&lt;p data-end=&quot;1570&quot; data-start=&quot;1512&quot; data-ke-size=&quot;size16&quot;&gt;이번 단계에서는 전투 중 플레이어가 &lt;b&gt;공격 또는 아이템 사용&lt;/b&gt;을 선택할 수 있도록 시스템을 확장했다.&lt;/p&gt;
&lt;p data-end=&quot;1589&quot; data-start=&quot;1572&quot; data-ke-size=&quot;size16&quot;&gt;플레이어 턴에 메뉴를 출력하고:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1605&quot; data-start=&quot;1590&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1595&quot; data-start=&quot;1590&quot;&gt;공격&lt;/li&gt;
&lt;li data-end=&quot;1605&quot; data-start=&quot;1596&quot;&gt;아이템 사용&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1677&quot; data-start=&quot;1607&quot; data-ke-size=&quot;size16&quot;&gt;중 하나를 선택하게 만들었다.&lt;br /&gt;아이템 사용을 고르면 인벤토리를 보여주고, 선택한 포션에 따라 HP 또는 MP를 회복시켰다.&lt;/p&gt;
&lt;p data-end=&quot;1724&quot; data-start=&quot;1679&quot; data-ke-size=&quot;size16&quot;&gt;회복량은 50으로 설정했고, min()을 사용해 최대치를 넘지 않게 처리했다.&lt;/p&gt;
&lt;p data-end=&quot;1729&quot; data-start=&quot;1726&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1853&quot; data-start=&quot;1730&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1791&quot; data-start=&quot;1730&quot;&gt;HP 포션 사용 &amp;rarr; player-&amp;gt;setHP(min(player-&amp;gt;getHP() + 50, 100));&lt;/li&gt;
&lt;li data-end=&quot;1853&quot; data-start=&quot;1792&quot;&gt;MP 포션 사용 &amp;rarr; player-&amp;gt;setMP(min(player-&amp;gt;getMP() + 50, 100));&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step5&lt;/p&gt;
&lt;p data-end=&quot;2054&quot; data-start=&quot;1998&quot; data-ke-size=&quot;size16&quot;&gt;이번 단계에서는 vector&amp;lt;Item&amp;gt; 대신 &lt;b&gt;직접 만든 템플릿 인벤토리 클래스&lt;/b&gt;를 구현했다.&lt;/p&gt;
&lt;p data-end=&quot;2108&quot; data-start=&quot;2056&quot; data-ke-size=&quot;size16&quot;&gt;template&amp;lt;typename T&amp;gt; 형태로 Inventory&amp;lt;T&amp;gt;를 만들고, 내부에:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2154&quot; data-start=&quot;2109&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2122&quot; data-start=&quot;2109&quot;&gt;T* pItems&lt;/li&gt;
&lt;li data-end=&quot;2140&quot; data-start=&quot;2123&quot;&gt;int capacity_&lt;/li&gt;
&lt;li data-end=&quot;2154&quot; data-start=&quot;2141&quot;&gt;int size_&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2162&quot; data-start=&quot;2156&quot; data-ke-size=&quot;size16&quot;&gt;를 두었다.&lt;/p&gt;
&lt;p data-end=&quot;2242&quot; data-start=&quot;2164&quot; data-ke-size=&quot;size16&quot;&gt;생성자에서 new T[capacity_]로 메모리를 할당하고,&lt;br /&gt;소멸자에서 delete[] pItems를 호출해 메모리를 정리했다.&lt;/p&gt;
&lt;p data-end=&quot;2254&quot; data-start=&quot;2244&quot; data-ke-size=&quot;size16&quot;&gt;추가한 주요 함수:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2356&quot; data-start=&quot;2255&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2266&quot; data-start=&quot;2255&quot;&gt;AddItem&lt;/li&gt;
&lt;li data-end=&quot;2285&quot; data-start=&quot;2267&quot;&gt;RemoveLastItem&lt;/li&gt;
&lt;li data-end=&quot;2298&quot; data-start=&quot;2286&quot;&gt;RemoveAt&lt;/li&gt;
&lt;li data-end=&quot;2316&quot; data-start=&quot;2299&quot;&gt;PrintAllItems&lt;/li&gt;
&lt;li data-end=&quot;2328&quot; data-start=&quot;2317&quot;&gt;GetSize&lt;/li&gt;
&lt;li data-end=&quot;2344&quot; data-start=&quot;2329&quot;&gt;GetCapacity&lt;/li&gt;
&lt;li data-end=&quot;2356&quot; data-start=&quot;2345&quot;&gt;GetItem&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2390&quot; data-start=&quot;2358&quot; data-ke-size=&quot;size16&quot;&gt;또한 &lt;b&gt;복사 생성자&lt;/b&gt;를 구현해서 깊은 복사를 적용했다.&lt;/p&gt;
&lt;p data-end=&quot;2390&quot; data-start=&quot;2358&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2390&quot; data-start=&quot;2358&quot; data-ke-size=&quot;size16&quot;&gt;step6&lt;/p&gt;
&lt;p data-end=&quot;2618&quot; data-start=&quot;2554&quot; data-ke-size=&quot;size16&quot;&gt;이번 단계에서는 인벤토리가 꽉 찼을 때 자동으로 늘어나는 &lt;b&gt;Resize 기능&lt;/b&gt;과, 가격순 정렬 기능을 추가했다.&lt;/p&gt;
&lt;p data-end=&quot;2651&quot; data-start=&quot;2620&quot; data-ke-size=&quot;size16&quot;&gt;Resize(int newCapacity)를 구현해:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2698&quot; data-start=&quot;2652&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2662&quot; data-start=&quot;2652&quot;&gt;새 배열 생성&lt;/li&gt;
&lt;li data-end=&quot;2675&quot; data-start=&quot;2663&quot;&gt;기존 데이터 복사&lt;/li&gt;
&lt;li data-end=&quot;2687&quot; data-start=&quot;2676&quot;&gt;기존 배열 해제&lt;/li&gt;
&lt;li data-end=&quot;2698&quot; data-start=&quot;2688&quot;&gt;새 배열 연결&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2709&quot; data-start=&quot;2700&quot; data-ke-size=&quot;size16&quot;&gt;순서로 처리했다.&lt;/p&gt;
&lt;p data-end=&quot;2779&quot; data-start=&quot;2711&quot; data-ke-size=&quot;size16&quot;&gt;그리고 AddItem()에서 공간이 부족하면 자동으로 Resize(capacity_ * 2)를 호출하도록 만들었다.&lt;/p&gt;
&lt;p data-end=&quot;2927&quot; data-start=&quot;2781&quot; data-ke-size=&quot;size16&quot;&gt;정렬 기능은 compareByPrice(const Item&amp;amp; a, const Item&amp;amp; b) 비교 함수를 만들고,&lt;br /&gt;SortItems()에서 std::sort(pItems, pItems + size_, compareByPrice)를 사용해 구현했다.&lt;/p&gt;
&lt;p data-end=&quot;2927&quot; data-start=&quot;2781&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2927&quot; data-start=&quot;2781&quot; data-ke-size=&quot;size16&quot;&gt;step7&lt;/p&gt;
&lt;p data-end=&quot;3135&quot; data-start=&quot;3082&quot; data-ke-size=&quot;size16&quot;&gt;이번 단계에서는 map&amp;lt;string, int&amp;gt;를 이용해 &lt;b&gt;포션 재고 시스템&lt;/b&gt;을 구현했다.&lt;/p&gt;
&lt;p data-end=&quot;3168&quot; data-start=&quot;3137&quot; data-ke-size=&quot;size16&quot;&gt;포션 이름을 key, 재고 수량을 value로 저장했다.&lt;/p&gt;
&lt;p data-end=&quot;3168&quot; data-start=&quot;3137&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3168&quot; data-start=&quot;3137&quot; data-ke-size=&quot;size16&quot;&gt;step8&lt;/p&gt;
&lt;p data-end=&quot;3646&quot; data-start=&quot;3582&quot; data-ke-size=&quot;size16&quot;&gt;이번 단계에서는 단순 1회 전투가 아니라, &lt;b&gt;여러 방을 순서대로 클리어한 뒤 보스방이 열리는 구조&lt;/b&gt;를 만들었다.&lt;/p&gt;
&lt;p data-end=&quot;3685&quot; data-start=&quot;3648&quot; data-ke-size=&quot;size16&quot;&gt;DungeonRoom 구조체를 만들어 각 방의 정보를 저장했다.&lt;/p&gt;
&lt;p data-end=&quot;3699&quot; data-start=&quot;3687&quot; data-ke-size=&quot;size16&quot;&gt;구조체에 포함한 정보:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3758&quot; data-start=&quot;3700&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3708&quot; data-start=&quot;3700&quot;&gt;몬스터 이름&lt;/li&gt;
&lt;li data-end=&quot;3713&quot; data-start=&quot;3709&quot;&gt;HP&lt;/li&gt;
&lt;li data-end=&quot;3719&quot; data-start=&quot;3714&quot;&gt;공격력&lt;/li&gt;
&lt;li data-end=&quot;3725&quot; data-start=&quot;3720&quot;&gt;방어력&lt;/li&gt;
&lt;li data-end=&quot;3737&quot; data-start=&quot;3726&quot;&gt;드랍 아이템 이름&lt;/li&gt;
&lt;li data-end=&quot;3749&quot; data-start=&quot;3738&quot;&gt;드랍 아이템 가격&lt;/li&gt;
&lt;li data-end=&quot;3758&quot; data-start=&quot;3750&quot;&gt;경험치 보상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3824&quot; data-start=&quot;3760&quot; data-ke-size=&quot;size16&quot;&gt;이후 vector&amp;lt;DungeonRoom&amp;gt;로 일반 방 3개를 만들고,&lt;br /&gt;for문으로 순서대로 클리어하도록 했다.&lt;/p&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/17</guid>
      <comments>https://baggu4402.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 6 May 2026 17:35:54 +0900</pubDate>
    </item>
    <item>
      <title>4/30(코드카타)</title>
      <link>https://baggu4402.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;나누어 떨어지는 수&lt;/p&gt;
&lt;pre id=&quot;code_1777509187310&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;

vector&amp;lt;int&amp;gt; solution(vector&amp;lt;int&amp;gt; arr, int divisor) {
    vector&amp;lt;int&amp;gt; answer;
    
    for (int i = 0; i &amp;lt; arr.size(); i++) {
        if (arr[i] % divisor == 0) {
            answer.push_back(arr[i]);
        }
    }
    
    if (answer.empty()) {
        answer.push_back(-1);
    } else {
        sort(answer.begin(), answer.end());
    }
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘 해더를 안넣으면 sort를 못넣는걸 알았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;녹음 2026-04-30 160429.gif&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JiiwM/dJMcaaSGMzE/TOwqYjc9W1GvIaOf9BuyK1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JiiwM/dJMcaaSGMzE/TOwqYjc9W1GvIaOf9BuyK1/img.gif&quot; data-alt=&quot;개인프로젝트 진행 점프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JiiwM/dJMcaaSGMzE/TOwqYjc9W1GvIaOf9BuyK1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/JiiwM/dJMcaaSGMzE/TOwqYjc9W1GvIaOf9BuyK1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;454&quot; data-filename=&quot;녹음 2026-04-30 160429.gif&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개인프로젝트 진행 점프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.gif&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K8IkY/dJMcabcWt4p/FDJ0DkvWL8gkMisMOKrQ7k/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K8IkY/dJMcabcWt4p/FDJ0DkvWL8gkMisMOKrQ7k/img.gif&quot; data-alt=&quot;공격 밀치기 구현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K8IkY/dJMcabcWt4p/FDJ0DkvWL8gkMisMOKrQ7k/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/K8IkY/dJMcabcWt4p/FDJ0DkvWL8gkMisMOKrQ7k/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;536&quot; data-filename=&quot;2.gif&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공격 밀치기 구현&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/16</guid>
      <comments>https://baggu4402.tistory.com/16#entry16comment</comments>
      <pubDate>Thu, 30 Apr 2026 21:34:44 +0900</pubDate>
    </item>
    <item>
      <title>던전탈출rpg과제 총정리+학습</title>
      <link>https://baggu4402.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;게임의 전체 흐름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.이름입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.hp,mp,공격력,방어력 총 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.입력값 검사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.캐릭터강화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6.직업 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7.던전입장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8.몬스터 전투&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9.승리 시 아이템 획득&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10.인벤토리 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11.인벤토리 확인 /포션제작/게임종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용한 헤더 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#include &amp;lt;iostream&amp;gt;&amp;nbsp; cout,cin,endl 사용&lt;br /&gt;#include &amp;lt;string&amp;gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;string 사용&lt;br /&gt;#include &amp;lt;vector&amp;gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vector&amp;lt;Item&amp;gt;, vector&amp;lt;PotionRecipe&amp;gt; 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step1&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;string name;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int stat[SIZE] = {0};&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;으로 입력받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stat[0]&amp;nbsp;=&amp;nbsp;HP &lt;br /&gt;stat[1]&amp;nbsp;=&amp;nbsp;MP &lt;br /&gt;stat[2]&amp;nbsp;=&amp;nbsp;공격력 &lt;br /&gt;stat[3]&amp;nbsp;=&amp;nbsp;방어력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step2&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 유효성 검사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘못된 값을 입력하면 다시 입력받기 위해 와일문 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while&amp;nbsp;(true) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(stat[0]&amp;nbsp;&amp;gt;=&amp;nbsp;50&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;stat[1]&amp;nbsp;&amp;gt;=&amp;nbsp;50) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;다시&amp;nbsp;입력해주세요.&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step3&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 시작전에 강화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while&amp;nbsp;(!isGameStart) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; switch (choice) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;1: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stat[0]&amp;nbsp;+=&amp;nbsp;20; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hpPotion--; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;0: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isGameStart&amp;nbsp;=&amp;nbsp;true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step4&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개체지향시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class&amp;nbsp;Player &lt;br /&gt;{ &lt;br /&gt;protected:&amp;nbsp; &amp;nbsp; &amp;nbsp;// 자식 클래스에서는 접근 가능하지만, main같은 외부에서는 접근할 수 없다&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;name; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;job; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;level; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;hp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;mp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;power; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;defence; &lt;br /&gt;};&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;==&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;job&amp;nbsp;=&amp;nbsp;&quot;전사&quot;; &lt;br /&gt;this-&amp;gt;hp&amp;nbsp;+=&amp;nbsp;30;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;player&lt;/span&gt;&lt;span&gt;-&amp;gt;hp; &lt;/span&gt;&lt;span&gt;// 불가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;순수가상함수와 오버라이딩 //중요하다고 생각함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;virtual&amp;nbsp;void&amp;nbsp;attack()&amp;nbsp;=&amp;nbsp;0;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Player는&amp;nbsp;attack이라는&amp;nbsp;함수가&amp;nbsp;반드시&amp;nbsp;있어야&amp;nbsp;한다. &lt;br /&gt;하지만&amp;nbsp;Player가&amp;nbsp;직접&amp;nbsp;공격&amp;nbsp;방식을&amp;nbsp;정하지&amp;nbsp;않는다. &lt;br /&gt;자식&amp;nbsp;클래스가&amp;nbsp;반드시&amp;nbsp;구현해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void&amp;nbsp;attack()&amp;nbsp;override &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;*&amp;nbsp;파이어볼을&amp;nbsp;발사한다!&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수&amp;nbsp;가상&amp;nbsp;함수는&amp;nbsp;부모의&amp;nbsp;강제&amp;nbsp;규칙,&amp;nbsp;오버라이딩은&amp;nbsp;자식의&amp;nbsp;실제&amp;nbsp;구현.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;player포인터,다형성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Player*&amp;nbsp;player&amp;nbsp;=&amp;nbsp;nullptr; &lt;br /&gt;player&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Magician(name,&amp;nbsp;stat[0],&amp;nbsp;stat[1],&amp;nbsp;stat[2],&amp;nbsp;stat[3]);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플레이어 직업이 여러개이기 때문에 포인터를 씀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;player&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Warrior(...); &lt;br /&gt;player&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Magician(...); &lt;br /&gt;player&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Thief(...); &lt;br /&gt;player&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Archer(...);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;와.차이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;player-&amp;gt;getName(); &lt;br /&gt;monster.getName();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터는&amp;nbsp;화살표&amp;nbsp;-&amp;gt;,&amp;nbsp;일반&amp;nbsp;객체는&amp;nbsp;점&amp;nbsp;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step5&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; getter / setter&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getter // 값을 읽는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int&amp;nbsp;getHP() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hp; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setter // 값을 바꾸는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void&amp;nbsp;setHP(int&amp;nbsp;hp) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this-&amp;gt;hp&amp;nbsp;=&amp;nbsp;hp; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전투 while문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while&amp;nbsp;(player-&amp;gt;getHP()&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;monster.getHP()&amp;nbsp;&amp;gt;&amp;nbsp;0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플레이어와&amp;nbsp;몬스터가&amp;nbsp;둘&amp;nbsp;다&amp;nbsp;살아&amp;nbsp;있는&amp;nbsp;동안&amp;nbsp;전투&amp;nbsp;반복.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step6&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Item 구조체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;struct&amp;nbsp;Item &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;name; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int price;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void&amp;nbsp;PrintInfo()&amp;nbsp;const &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;name&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;&amp;nbsp;(&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;price&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;G)&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;};&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인벤토리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;vector&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Item&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inventory&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Item들을 여러 개 저장할 수 있는 동적 배열.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step7&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포션 제작소와 레시피 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PotionRecipe 구조체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;struct&amp;nbsp;PotionRecipe &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; ...&lt;br /&gt;};&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vector&amp;lt;PotionRecipe&amp;gt; recipes;//레시피 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for (const PotionRecipe&amp;amp; recipe : recipes)&amp;nbsp; recipes안에 레시피를 하나씩 꺼내서 출력.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;recipe&lt;/span&gt;&lt;span&gt;.potionName &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;) //이름으로 검색&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bool found = false; // found변수 찾으면 ture&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if (recipe.ingredient1 == ingredient || recipe.ingredient2 == ingredient)// 재료로 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재료1이 같거나 재료2가 같으면 검색 성공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step8&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 메뉴 중심으로 전체 기능을 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while&amp;nbsp;(true) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;1.&amp;nbsp;던전&amp;nbsp;입장&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;2.&amp;nbsp;인벤토리&amp;nbsp;확인&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;3.&amp;nbsp;포션&amp;nbsp;제작소&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout &amp;lt;&amp;lt; &quot;0. 게임 종료&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cin &amp;gt;&amp;gt; menuChoice;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(menuChoice&amp;nbsp;==&amp;nbsp;1) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;던전&amp;nbsp;입장&amp;nbsp;+&amp;nbsp;전투 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(menuChoice&amp;nbsp;==&amp;nbsp;2) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;인벤토리&amp;nbsp;확인 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(menuChoice&amp;nbsp;==&amp;nbsp;3) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;포션&amp;nbsp;제작소 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(menuChoice&amp;nbsp;==&amp;nbsp;0) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;던전입장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if&amp;nbsp;(dungeonChoice&amp;nbsp;==&amp;nbsp;1) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monster&amp;nbsp;=&amp;nbsp;Monster(&quot;슬라임&quot;,&amp;nbsp;30,&amp;nbsp;20,&amp;nbsp;10,&amp;nbsp;&quot;슬라임의&amp;nbsp;끈적한&amp;nbsp;젤리&quot;,&amp;nbsp;30); &lt;br /&gt;} &lt;br /&gt;else&amp;nbsp;if&amp;nbsp;(dungeonChoice&amp;nbsp;==&amp;nbsp;2) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monster&amp;nbsp;=&amp;nbsp;Monster(&quot;고블린&quot;,&amp;nbsp;50,&amp;nbsp;25,&amp;nbsp;15,&amp;nbsp;&quot;고블린의&amp;nbsp;이빨&quot;,&amp;nbsp;50); &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;던전&amp;nbsp;번호에&amp;nbsp;따라&amp;nbsp;다른&amp;nbsp;몬스터&amp;nbsp;객체를&amp;nbsp;만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;==================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;외울코드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;==================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while&amp;nbsp;(true) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cin&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;value; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(조건) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메뉴 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while&amp;nbsp;(true) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cin&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;choice; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(choice&amp;nbsp;==&amp;nbsp;0) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;switch 메뉴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;switch&amp;nbsp;(choice) &lt;br /&gt;{ &lt;br /&gt;case&amp;nbsp;1: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&lt;br /&gt;case&amp;nbsp;0: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&lt;br /&gt;default: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인트 객체접근&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;player-&amp;gt;getHP();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 객체접근&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;monster.getHP();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vector추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inventory.push_back(item);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vector전체 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for&amp;nbsp;(const&amp;nbsp;Item&amp;amp;&amp;nbsp;item&amp;nbsp;:&amp;nbsp;inventory) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item.PrintInfo(); &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전투 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while&amp;nbsp;(player-&amp;gt;getHP()&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;monster.getHP()&amp;nbsp;&amp;gt;&amp;nbsp;0) &lt;br /&gt;{ &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데미지 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int&amp;nbsp;damage&amp;nbsp;=&amp;nbsp;attackPower&amp;nbsp;-&amp;nbsp;defence; &lt;br /&gt;&lt;br /&gt;if&amp;nbsp;(damage&amp;nbsp;&amp;lt;=&amp;nbsp;0) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;damage&amp;nbsp;=&amp;nbsp;1; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개념&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 코드&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;문자열&lt;/td&gt;
&lt;td&gt;string name;&lt;/td&gt;
&lt;td&gt;이름 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배열&lt;/td&gt;
&lt;td&gt;int stat[SIZE];&lt;/td&gt;
&lt;td&gt;능력치 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;무한 반복&lt;/td&gt;
&lt;td&gt;while(true)&lt;/td&gt;
&lt;td&gt;계속 반복&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;반복 탈출&lt;/td&gt;
&lt;td&gt;break;&lt;/td&gt;
&lt;td&gt;반복문 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;조건문&lt;/td&gt;
&lt;td&gt;if&lt;/td&gt;
&lt;td&gt;조건 검사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;그리고&lt;/td&gt;
&lt;td&gt;&amp;amp;&amp;amp;&lt;/td&gt;
&lt;td&gt;둘 다 참&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;또는&lt;/td&gt;
&lt;td&gt;`&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;클래스&lt;/td&gt;
&lt;td&gt;class Player&lt;/td&gt;
&lt;td&gt;객체 설계도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;구조체&lt;/td&gt;
&lt;td&gt;struct Item&lt;/td&gt;
&lt;td&gt;단순 데이터 묶음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;상속&lt;/td&gt;
&lt;td&gt;class Warrior : public Player&lt;/td&gt;
&lt;td&gt;Player 기능 물려받기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;순수 가상 함수&lt;/td&gt;
&lt;td&gt;virtual void attack() = 0;&lt;/td&gt;
&lt;td&gt;자식에게 구현 강제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;오버라이딩&lt;/td&gt;
&lt;td&gt;void attack() override&lt;/td&gt;
&lt;td&gt;자식이 함수 재정의&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;포인터&lt;/td&gt;
&lt;td&gt;Player* player&lt;/td&gt;
&lt;td&gt;객체 주소 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;동적 생성&lt;/td&gt;
&lt;td&gt;new Magician(...)&lt;/td&gt;
&lt;td&gt;객체 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;메모리 해제&lt;/td&gt;
&lt;td&gt;delete player;&lt;/td&gt;
&lt;td&gt;객체 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;포인터 접근&lt;/td&gt;
&lt;td&gt;player-&amp;gt;getHP()&lt;/td&gt;
&lt;td&gt;포인터 멤버 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;객체 접근&lt;/td&gt;
&lt;td&gt;monster.getHP()&lt;/td&gt;
&lt;td&gt;일반 객체 멤버 접근&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vector&lt;/td&gt;
&lt;td&gt;vector&amp;lt;Item&amp;gt; inventory;&lt;/td&gt;
&lt;td&gt;동적 배열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추가&lt;/td&gt;
&lt;td&gt;push_back()&lt;/td&gt;
&lt;td&gt;vector에 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;크기&lt;/td&gt;
&lt;td&gt;size()&lt;/td&gt;
&lt;td&gt;개수 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비었는지&lt;/td&gt;
&lt;td&gt;empty()&lt;/td&gt;
&lt;td&gt;비어 있는지 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;전체 순회&lt;/td&gt;
&lt;td&gt;for (const Item&amp;amp; item : inventory)&lt;/td&gt;
&lt;td&gt;모든 요소 반복&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;햇갈리는 포인트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getter/setter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/15</guid>
      <comments>https://baggu4402.tistory.com/15#entry15comment</comments>
      <pubDate>Wed, 29 Apr 2026 16:15:27 +0900</pubDate>
    </item>
    <item>
      <title>4/29(코드카타,과제2 step8)</title>
      <link>https://baggu4402.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;코드카타&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#include&amp;nbsp;&amp;lt;string&amp;gt; &lt;br /&gt;#include&amp;nbsp;&amp;lt;vector&amp;gt; &lt;br /&gt;&lt;br /&gt;using&amp;nbsp;namespace&amp;nbsp;std; &lt;br /&gt;&lt;br /&gt;string&amp;nbsp;solution(vector&amp;lt;string&amp;gt;&amp;nbsp;seoul)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;seoul.size();&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(seoul[i]&amp;nbsp;==&amp;nbsp;&quot;Kim&quot;)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&quot;김서방은&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;to_string(i)&amp;nbsp;+&amp;nbsp;&quot;에&amp;nbsp;있다&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&quot;&quot;; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 배열에서 하나씩 비교하는걸 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getter / setter를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getHP() &lt;br /&gt;getPower() &lt;br /&gt;getDefence() &lt;br /&gt;setHP()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;player-&amp;gt;getHP() &lt;br /&gt;player-&amp;gt;getPower() &lt;br /&gt;player-&amp;gt;getDefence() &lt;br /&gt;player-&amp;gt;setHP(...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전투루프 &lt;span&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;player&lt;/span&gt;&lt;span&gt;-&amp;gt;getHP() &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;monster&lt;/span&gt;&lt;span&gt;.getHP() &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getHP()와 setHP()를 헷갈립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;getHP()&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;값&amp;nbsp;읽기 &lt;br /&gt;setHP()&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;값&amp;nbsp;바꾸기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int&amp;nbsp;hp&amp;nbsp;=&amp;nbsp;player-&amp;gt;getHP();&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;읽기 &lt;br /&gt;player-&amp;gt;setHP(50);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Item으로 아이템 구조체만듦.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백터는 아이템이 몇 개 들어올지 모를 때 쓰기 좋은 동적배열입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vector&amp;lt;Item&amp;gt;&amp;nbsp;inventory;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;==&amp;gt; 아이템들을 여러개 저장할 수 잇는 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int&amp;nbsp;index&amp;nbsp;=&amp;nbsp;1; &lt;br /&gt;for&amp;nbsp;(const&amp;nbsp;Item&amp;amp;&amp;nbsp;item&amp;nbsp;:&amp;nbsp;inventory) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;index&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;.&amp;nbsp;&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item.PrintInfo(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;index++; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 인덱스는 진짜 인덱스가 아니고 화면에 보여줄 1. 2.이런 번호입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알면 좋은것들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;Item&amp;nbsp;구조체&amp;nbsp;정의 &lt;br /&gt;2.&amp;nbsp;vector&amp;lt;Item&amp;gt;&amp;nbsp;inventory&amp;nbsp;선언 &lt;br /&gt;3.&amp;nbsp;전투&amp;nbsp;승리 &lt;br /&gt;4.&amp;nbsp;droppedItem&amp;nbsp;생성 &lt;br /&gt;5.&amp;nbsp;inventory.push_back(droppedItem) &lt;br /&gt;6.&amp;nbsp;메인&amp;nbsp;메뉴&amp;nbsp;출력 &lt;br /&gt;7.&amp;nbsp;인벤토리&amp;nbsp;메뉴에서&amp;nbsp;저장된&amp;nbsp;아이템&amp;nbsp;출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step7&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스텝7은 스탭6의 확장버전같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if (recipe.potionName == name) 이름검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if (recipe.ingredient1 == ingredient || recipe.ingredient2 == ingredient) 재료검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;은 여태까지 만든걸 합친느낌입니다.&lt;/p&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/14</guid>
      <comments>https://baggu4402.tistory.com/14#entry14comment</comments>
      <pubDate>Wed, 29 Apr 2026 15:09:02 +0900</pubDate>
    </item>
    <item>
      <title>4/28 (코드카타,c++,과제1,과제2/step4)</title>
      <link>https://baggu4402.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;첫시간은 코드카타이고 오늘 푼 문제이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #263747; color: #b2c0cc; text-align: left;&quot;&gt;주어진 수가 6이라면 6 &amp;rarr; 3 &amp;rarr; 10 &amp;rarr; 5 &amp;rarr; 16 &amp;rarr; 8 &amp;rarr; 4 &amp;rarr; 2 &amp;rarr; 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 &amp;ndash;1을 반환해 주세요.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;&lt;br /&gt;using&amp;nbsp;namespace&amp;nbsp;std; &lt;br /&gt;&lt;br /&gt;using&amp;nbsp;namespace&amp;nbsp;std; &lt;br /&gt;&lt;br /&gt;int&amp;nbsp;solution(int&amp;nbsp;num)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long&amp;nbsp;long&amp;nbsp;n&amp;nbsp;=&amp;nbsp;num; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;count&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;count&amp;nbsp;&amp;lt;=&amp;nbsp;500;&amp;nbsp;count++)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;==&amp;nbsp;1)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;count; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;%&amp;nbsp;2&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n&amp;nbsp;/=&amp;nbsp;2; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n&amp;nbsp;=&amp;nbsp;n&amp;nbsp;*&amp;nbsp;3&amp;nbsp;+&amp;nbsp;1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1; &lt;br /&gt;}&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 c++에서 액터생성후 액터가 랜덤하게 이동하고 회전하도록 구연했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 이동 횟수,현재 좌표,이벤트 발생횟수,총 이동 거리 등을 화면에 출력하도록 하였고 git에 업로드까지 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억해야할점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cpp에 함수를 만들기전에 h에 함수선언을 해야한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BeginPlay()는 게임이 시작될때 한 번 실행되는 함수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작위치를 고정할때는 SetActorLocation&lt;span&gt;(&lt;/span&gt;&lt;span&gt;FVector&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0.0f&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0.0f&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;50.0f&lt;/span&gt;&lt;span&gt;));을 썼습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;언리얼에서 위치는 FVector로 표현합니다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위치를 가져올때는 GetActorLocation 변경할때는 SetActorLocation을 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 액터가 바라보는 방향으로 이동하게 만들기 위해서 GetActorFowardVector()를 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;FVector&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ForwardDirection&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;GetActorForwardVector&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 GetActorLocation와 비슷하게 GetActorRotation는 회전시킬때 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 c++에서 랜덤값을 만들때 FMath::RandRange()를 사용하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;float&amp;nbsp;RandomDistance&amp;nbsp;=&amp;nbsp;FMath::RandRange(50.0f,&amp;nbsp;200.0f);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이코드는 50~200사이의 값을 뽑아 오는거고 50%로 할때는 0과1을 사용하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 위치와 현재 위치 사이의 거리는 FVector::Dist()로 계산할수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과제에서 이동할 때마다 이동 거리를 누적해서 총 이동거리를 계산했고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토탈무브디스턴스에 추가 해주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면에 로그출력하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GEngine-&amp;gt;AddOnScreenDebugMessage(-1,&amp;nbsp;3.0f,&amp;nbsp;FColor::Green,&amp;nbsp;Message);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-1은 새 메세지로 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.0f는 3초동안 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글로 출력했다가 다 깨져서 영어로 출력하는게 안전하다고 경험했습니다 ㅜㅜ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 기억할것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;.h&amp;nbsp;파일에는&amp;nbsp;함수와&amp;nbsp;변수를&amp;nbsp;선언한다. &lt;br /&gt;2.&amp;nbsp;.cpp&amp;nbsp;파일에는&amp;nbsp;함수의&amp;nbsp;실제&amp;nbsp;동작을&amp;nbsp;구현한다. &lt;br /&gt;3.&amp;nbsp;AMyActor::Move()에서&amp;nbsp;::는&amp;nbsp;클래스&amp;nbsp;소속을&amp;nbsp;의미한다. &lt;br /&gt;4.&amp;nbsp;BeginPlay()는&amp;nbsp;게임&amp;nbsp;시작&amp;nbsp;시&amp;nbsp;한&amp;nbsp;번&amp;nbsp;실행된다. &lt;br /&gt;5.&amp;nbsp;위치는&amp;nbsp;FVector,&amp;nbsp;회전은&amp;nbsp;FRotator를&amp;nbsp;사용한다. &lt;br /&gt;6.&amp;nbsp;GetActorLocation()으로&amp;nbsp;현재&amp;nbsp;위치를&amp;nbsp;가져온다. &lt;br /&gt;7.&amp;nbsp;SetActorLocation()으로&amp;nbsp;위치를&amp;nbsp;바꾼다. &lt;br /&gt;8.&amp;nbsp;GetActorRotation()으로&amp;nbsp;현재&amp;nbsp;회전을&amp;nbsp;가져온다. &lt;br /&gt;9.&amp;nbsp;SetActorRotation()으로&amp;nbsp;회전을&amp;nbsp;바꾼다. &lt;br /&gt;10.&amp;nbsp;GetActorForwardVector()를&amp;nbsp;사용하면&amp;nbsp;Actor가&amp;nbsp;바라보는&amp;nbsp;방향으로&amp;nbsp;이동할&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;11.&amp;nbsp;FMath::RandRange()로&amp;nbsp;랜덤&amp;nbsp;값을&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;12. FVector::Dist()로 두 위치 사이의 거리를 계산할 수 있다.&lt;br /&gt;13. 언리얼 프로젝트를 GitHub에 올릴 때 Binaries, Intermediate, Saved 같은 자동 생성 폴더는 제외해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후 2번과제를 시작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번과제 step1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억해야할것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main이 시작점이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cout&amp;nbsp; 화면에 출력&lt;br /&gt;cin&amp;nbsp; &amp;nbsp; 키보드로 입력받기&lt;br /&gt;endl&amp;nbsp; 줄바꿈&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;cin&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;stat&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;stat&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;];&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;cin&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;stat&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;stat&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;];&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#include &amp;lt;string&amp;gt; 문자열을 사용하기 위해 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;using&amp;nbsp;namespace&amp;nbsp;std;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;==&amp;gt; std:: 생략가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억해야할것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심개념&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (조건)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(기존코드)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;HP와&amp;nbsp;MP를&amp;nbsp;입력해주세요:&amp;nbsp;&quot;; &lt;br /&gt;cin&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;stat[0]&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;stat[1];&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(바뀐코드)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;while&amp;nbsp;(true) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;HP와&amp;nbsp;MP를&amp;nbsp;입력해주세요:&amp;nbsp;&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cin&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;stat[0]&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;stat[1]; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(stat[0]&amp;nbsp;&amp;gt;=&amp;nbsp;50&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;stat[1]&amp;nbsp;&amp;gt;=&amp;nbsp;50) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;HP나&amp;nbsp;MP의&amp;nbsp;값이&amp;nbsp;너무&amp;nbsp;작습니다.&amp;nbsp;다시&amp;nbsp;입력해주세요.&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억해야할것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while&amp;nbsp;(!isGameStart) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;메뉴&amp;nbsp;출력 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;번호&amp;nbsp;입력 &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(choice) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;1: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HP&amp;nbsp;증가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;2: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MP&amp;nbsp;증가 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;0: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;isGameStart&amp;nbsp;=&amp;nbsp;true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;step4&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기억해야할것&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;protected 자식클래스에서 ㅈ버근할 수 있지만,클래스 밖에서는 직접 접근할 수 없음.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;순수 가상 함수&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;virtual&amp;nbsp;void&amp;nbsp;attack()&amp;nbsp;=&amp;nbsp;0;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ex)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Player는 attack()이라는 함수가 있어야 한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;그런데 Player 자체는 공격 방식을 정하지 않는다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;자식 클래스가 반드시 직접 정해야 한다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상속&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;class&amp;nbsp;Magician&amp;nbsp;:&amp;nbsp;public&amp;nbsp;Player&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자식 클래스 생성자&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Magician(string&amp;nbsp;name,&amp;nbsp;int&amp;nbsp;hp,&amp;nbsp;int&amp;nbsp;mp,&amp;nbsp;int&amp;nbsp;power,&amp;nbsp;int&amp;nbsp;defence) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;Player(name,&amp;nbsp;hp,&amp;nbsp;mp,&amp;nbsp;power,&amp;nbsp;defence) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;job&amp;nbsp;=&amp;nbsp;&quot;마법사&quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mp&amp;nbsp;+=&amp;nbsp;30; &lt;br /&gt;}&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;오버라이딩&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부모클래스의 함수를 자식 클래스에서 다시 정의하는것&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다형성&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Player&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;player&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;nullptr&lt;/span&gt;&lt;span&gt;; 이코드 하나로&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;player = new Warrior(...);/player = new Magician(...);모두 다룰수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어려운코드&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;virtual&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;attack&lt;/span&gt;&lt;span&gt;() = &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;순수가상함수인데 일반함수는 몸통이 있는것과 달리&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;몸통이없다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;==&amp;gt;뜻은&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Player에는&amp;nbsp;attack이라는&amp;nbsp;함수가&amp;nbsp;있어야&amp;nbsp;한다. &lt;br /&gt;하지만&amp;nbsp;Player가&amp;nbsp;직접&amp;nbsp;공격&amp;nbsp;방식을&amp;nbsp;정하지는&amp;nbsp;않는다. &lt;br /&gt;자식&amp;nbsp;클래스가&amp;nbsp;반드시&amp;nbsp;attack을&amp;nbsp;만들어야&amp;nbsp;한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;라고 생각하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;개념의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;순수 가상 함수&lt;/td&gt;
&lt;td&gt;부모가 자식에게 &amp;ldquo;이 함수 반드시 만들어라&amp;rdquo;라고 강제하는 함수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추상 클래스&lt;/td&gt;
&lt;td&gt;순수 가상 함수를 가진 클래스. 직접 객체 생성 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;오버라이딩&lt;/td&gt;
&lt;td&gt;부모의 함수를 자식이 자기 방식으로 다시 구현하는 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;다형성&lt;/td&gt;
&lt;td&gt;같은 player-&amp;gt;attack() 코드가 실제 객체에 따라 다르게 동작하는 것&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;new&lt;/td&gt;
&lt;td&gt;객체를 동적으로 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delete&lt;/td&gt;
&lt;td&gt;new로 만든 객체를 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/13</guid>
      <comments>https://baggu4402.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 28 Apr 2026 20:33:50 +0900</pubDate>
    </item>
    <item>
      <title>4/27(코드카타,발표)</title>
      <link>https://baggu4402.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;코드카타 22번 문제를 풀었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날이 갈수록 어려워 집니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #263747; color: #b2c0cc; text-align: left;&quot;&gt;두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #263747; color: #b2c0cc; text-align: left;&quot;&gt;예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 문제이고 밑은 답입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;long&amp;nbsp;long&amp;nbsp;solution(int&amp;nbsp;a,&amp;nbsp;int&amp;nbsp;b)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;long&amp;nbsp;long&amp;nbsp;answer&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(a&amp;nbsp;&amp;gt;&amp;nbsp;b)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;temp&amp;nbsp;=&amp;nbsp;a; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;b; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;temp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;a;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;b;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer&amp;nbsp;+=&amp;nbsp;i; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;answer; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a와b의 대소 관계는 정해지지 않았기 때문에 a와b의 대소를 맞춥니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후 for문을 이용해 그 사이의 것을 다 더합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 어려워 파악하는데 많은 시간을 썼습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후 미니발표시간에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 블루프린트 노드에 대해 발표하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후 깃에대해 배웠습니다.&lt;/p&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/12</guid>
      <comments>https://baggu4402.tistory.com/12#entry12comment</comments>
      <pubDate>Mon, 27 Apr 2026 20:32:08 +0900</pubDate>
    </item>
    <item>
      <title>4/24(코드카타,C++실시간강의,FPS강의)</title>
      <link>https://baggu4402.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;코드카타 21번문제를 풀었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#include&amp;nbsp;&amp;lt;string&amp;gt; &lt;br /&gt;#include&amp;nbsp;&amp;lt;vector&amp;gt; &lt;br /&gt;&lt;br /&gt;using&amp;nbsp;namespace&amp;nbsp;std; &lt;br /&gt;&lt;br /&gt;bool&amp;nbsp;solution(int&amp;nbsp;x)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool&amp;nbsp;answer&amp;nbsp;=&amp;nbsp;true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;sum&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;x;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;temp&amp;nbsp;=&amp;nbsp;x; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(;&amp;nbsp;temp&amp;nbsp;&amp;gt;&amp;nbsp;0;&amp;nbsp;temp&amp;nbsp;/=&amp;nbsp;10)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;+=&amp;nbsp;temp&amp;nbsp;%&amp;nbsp;10; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(x&amp;nbsp;%&amp;nbsp;sum&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer&amp;nbsp;=&amp;nbsp;true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer&amp;nbsp;=&amp;nbsp;false; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;answer; &lt;br /&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바깥의 for문은 beak때문에 사실상 한번만 실행된다고 볼수있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 temp는 왜 x를 안쓰냐 -&amp;gt; 마지막에 검수할때 x를 썼다면 판별을 할수 없기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복이 끝날 때 마다 temp를 10으로 나눔&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; for문 끝에서 % 10을 해서 나머지를 sum에 더하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 반복이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그후 참거짓을 판별하는 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 블루프린트 발표자료를 만들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c++실시간강의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열(Array)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료구조 중 가장 기초가 되는 자료구조.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용할 메모리 크기를 고정해서 선언하는 것이 특징입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선언된 후에는 절대 그 크기를 변경 불가합니다. 그래서 정적인 자료구조라고도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선언된 메모리는 연속적으로 할당됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;main(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;i; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;Array[4]&amp;nbsp;=&amp;nbsp;{&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4&amp;nbsp;}; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;for&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;4;&amp;nbsp;++i) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;%d&amp;nbsp;&quot;,&amp;nbsp;Array[i]); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 2차원 배열 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;main(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;i,&amp;nbsp;j; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;Array2D[4][3]&amp;nbsp;=&amp;nbsp;{&amp;nbsp;{&amp;nbsp;1,&amp;nbsp;&amp;nbsp;2,&amp;nbsp;&amp;nbsp;3,&amp;nbsp;}, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;4,&amp;nbsp;&amp;nbsp;5,&amp;nbsp;&amp;nbsp;6,&amp;nbsp;}, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;{&amp;nbsp;7,&amp;nbsp;&amp;nbsp;8,&amp;nbsp;&amp;nbsp;9,&amp;nbsp;}, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;{10,&amp;nbsp;11,&amp;nbsp;12,&amp;nbsp;}&amp;nbsp;}; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;for&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;4;&amp;nbsp;++i) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;for&amp;nbsp;(j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;3;&amp;nbsp;++j) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;%2d&amp;nbsp;&quot;,&amp;nbsp;Array2D[i][j]); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;\n&quot;); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt; &lt;br /&gt;함수(Function)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍 언어에서 함수란, 코드 뭉치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복되는 코드 뭉치가 있다면 해당 코드 뭉치를 함수로 만들어서 재사용성을 높힐 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 혹은 출력이 있는 경우 대부분 다 함수라고 봐도됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;반환자료형&amp;nbsp;함수명(매개변수자료형&amp;nbsp;매개변수명)&amp;nbsp;//&amp;nbsp;함수&amp;nbsp;선언(Declaration)이자,&amp;nbsp;정의(Definition) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;반환값; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;main(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;num&amp;nbsp;=&amp;nbsp;10;&amp;nbsp;&amp;nbsp;//&amp;nbsp;자료형&amp;nbsp;변수명&amp;nbsp;=&amp;nbsp;값; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;함수명(인자값);&amp;nbsp;//&amp;nbsp;함수&amp;nbsp;호출(Call) &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스코프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수나 함수 이름을 사용할 수 있는 범위를 뜻합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스코프의 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 블럭 스코프(Block Scope)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 파일 스코프(File Scope)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블럭스코프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중괄호 내부에 선언된 변수는 해당 중괄호 내부에서만 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문, 반복문 같은 문(statement)에 사용되는 중괄호 범위도 블럭 스코프라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블럭 스코프 안에 또 다른 블럭 스코프가 들어갈 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바깥쪽 블럭 스코프에서 안쪽 블럭 스코프에 선언된 지역 변수에 접근 불가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 바깥쪽 블럭 스코프에 선언된 지역 변수를 안쪽 블럭 스코프에서는 접근 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전방 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 원형(머리부분)만 따서 파일 스코프 상단에 두고 함수의 정의는 파일 스코프의 하단에 위치 시키는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수의 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수에는 지역 변수/전역 변수가 있습니다. 여기에 static이나 const, extern 같은 키워드가 붙어서 조금씩 뉘앙스가 달라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지역 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 하나의 마을이라고 생각해봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main() 마을에서는 Add() 마을에서 선언된 지역 변수 A를 접근할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Add() 함수가 종료되면, 지역 변수 A도 사라진다고 이해합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 지역 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지역 변수 앞에 static 키워드가 붙으면 데이터 섹션에 저장됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 함수 종료시 접근 불가한 스택메모리에 저장되는게 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가 종료되어도 값이 유지가 됩니다 이런 변수를 정적 지역 변수라고 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 스코프에 선언된 변수. 데이터 섹션에 저장됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const 키워드가 붙은 변수. 초기화 이후에 값을 변경할 수 없습니다. 초기화가 강제됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자료형&amp;nbsp;변수명&amp;nbsp;=&amp;nbsp;값; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;자료형*&amp;nbsp;변수명&amp;nbsp;=&amp;nbsp;메모리주소값;&amp;nbsp;//&amp;nbsp;자료형쪽에&amp;nbsp;Asterisk를&amp;nbsp;붙힙시다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;변수명쪽에&amp;nbsp;Asterisk를&amp;nbsp;붙히면&amp;nbsp;뒤에서&amp;nbsp;배울&amp;nbsp;역참조&amp;nbsp;연산자와&amp;nbsp;심히&amp;nbsp;헷갈립니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터를 선언할 때 자료형은 왜 필요할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 메모리 주소로 가서 얼마만큼의 크기로 읽어야 내 데이터인지 모르기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료형이 있어야 크기를 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 나아가서, 자료형 크기만큼 가면 다음 데이터를 얻을 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소 연산자와 역참조 연산자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역참조 연산자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피연산자로 포인터를 받아서, 해당 메모리 주소에 저장된 값을 읽거나 값을 수정할 때 사용하는 연산자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;main(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;X&amp;nbsp;=&amp;nbsp;10; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int*&amp;nbsp;PtrToX&amp;nbsp;=&amp;nbsp;&amp;amp;X; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;%d\n&quot;,&amp;nbsp;*PtrToX); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;*PtrToX&amp;nbsp;=&amp;nbsp;100; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;%d\n&quot;,&amp;nbsp;*PtrToX); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터의 단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큰 데이터들의 시작 메모리 주소만으로 가볍게 공유할 수 있다는 점은 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 공유 받은 사람이 착한 사람인지는 모릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 주소로 가서 들어있는 값을 마음대로 수정 할수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 강력한 기능임과 동시에 그만큼 잘못쓰면 큰일 날 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NULL 포인터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#define NULL ((void*)0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무것도 가르키지 않는 포인터.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료형이 정해지지 않은 포인터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #cf5148;&quot; data-token-index=&quot;1&quot;&gt;자료형&lt;/span&gt;* 변수명 = &lt;span style=&quot;color: #387dc9;&quot; data-token-index=&quot;3&quot;&gt;메모리주소값&lt;/span&gt;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NULL 포인터는 &lt;span style=&quot;color: #387dc9;&quot; data-token-index=&quot;5&quot;&gt;메모리주소값&lt;/span&gt;이 아직 정해지지 않았을 때 사용 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #cf5148;&quot; data-token-index=&quot;7&quot;&gt;자료형&lt;/span&gt;을 지금 바로 정할 수 없을 때도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void 포인터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범용 포인터라고도 부릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void* 변수명 = 메모리 주소 값;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 섹션과 데이터 섹션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 섹션: 우리가 작성한 소스코드들이 빌드된 결과물들이 저장되는 곳입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 섹션: 전역 변수와 정적 변수등이 저장되는 곳입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택 메모리의 단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택 메모리에 저장되는 지역 변수(배열 등)의 크기는 컴파일 타임에 고정됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;런타임에 더 필요해진다 해도 크기를 늘릴 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가 종료되면 해당 스택 프레임에 더이상 접근 불가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 지역변수의 수명은 함수의 수명과 함께합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 오래 보존하려면 전역변수 혹은 정적변수로 선언해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 이 변수들은 너무 또 극단적입니다. 프로그램의 수명과 함께합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙 메모리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택 메모리에 비교해 할당/해제 속도가 느립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택 메모리는 자료구조 스택의 특성상 할당 및 해제에 O(1) 시간이 걸립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙 메모리는 할당 받아오려면 사용중이지 않은 메모리이면서 크기가 맞는지 체크 후 제공됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 메모리 공간에 구멍(메모리 단편화)이 생길 수도 있어서 효율적인 메모리 관리가 어렵기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적 할당의 세 가지 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 메모리 할당(대여)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙 메모리 관리자에게 필요한 바이트만큼의 메모리를 달라고 요청합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙 메모리 관리자는 해당 크기의 연속된 메모리를 찾아서 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환된 값은 시작 메모리 주소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 메모리 사용 할당된 힙 메모리 시작 주소를 가지고 원하는 작업 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 할당된 메모리 속 데이터는 쓰레기값입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 메모리 해제(반납) 힙 메모리 관리자에게 해당 메모리 주소를 돌려주면서 다 썼다고 알립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙 메모리 관리자는 해당 메모리를 점유되지 않은 메모리 상태로 바꿉니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 주소를 돌려주지 않으면 메모리 누수(Memory leak) 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 누수란, 해당 메모리가 점유 상태를 벗어나지 못해 사용가능한 메모리가 줄어드는 현상입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;malloc() 함수와 free() 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#include&amp;nbsp;&amp;lt;stdlib.h&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;main(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;size_t&amp;nbsp;i; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int*&amp;nbsp;Nums&amp;nbsp;=&amp;nbsp;(int*)malloc(10&amp;nbsp;*&amp;nbsp;sizeof(int)); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;if&amp;nbsp;(NULL&amp;nbsp;==&amp;nbsp;Nums) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;//&amp;nbsp;Do&amp;nbsp;something.... &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;free(Nums); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Nums&amp;nbsp;=&amp;nbsp;NULL; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;if&amp;nbsp;(NULL&amp;nbsp;!=&amp;nbsp;Nums) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;//&amp;nbsp;TODO. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 여러 자료형의 변수들을 한데 묶어서 하나의 자료형처럼 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 인자로 구조체 변수 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;struct&amp;nbsp;Date &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;Year; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;Month; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;Day; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;void&amp;nbsp;PrintBirthday(struct&amp;nbsp;Date&amp;nbsp;InBirthday); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;main(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;struct&amp;nbsp;Date&amp;nbsp;Birthday; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Birthday.Year&amp;nbsp;=&amp;nbsp;2024; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Birthday.Month&amp;nbsp;=&amp;nbsp;1; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Birthday.Day&amp;nbsp;=&amp;nbsp;13; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;//&amp;nbsp;구조체&amp;nbsp;변수&amp;nbsp;Birthday는&amp;nbsp;어느&amp;nbsp;메모리에&amp;nbsp;저장&amp;nbsp;될까요?. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;//&amp;nbsp;당연하게도&amp;nbsp;스택&amp;nbsp;메모리입니다.&amp;nbsp;다른&amp;nbsp;기본&amp;nbsp;자료형과&amp;nbsp;마찬가지입니다. &lt;/b&gt;&lt;br /&gt;&lt;b&gt;//&amp;nbsp;초기화&amp;nbsp;하지&amp;nbsp;않으면&amp;nbsp;0이&amp;nbsp;아닌&amp;nbsp;쓰레기&amp;nbsp;값이&amp;nbsp;저장되어&amp;nbsp;있습니다. &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PrintBirthday(Birthday); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;void&amp;nbsp;PrintBirthday(struct&amp;nbsp;Date&amp;nbsp;InBirthday) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;%d/%d/%d\n&quot;,&amp;nbsp;InBirthday.Year,&amp;nbsp;InBirthday.Month,&amp;nbsp;InBirthday.Day); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조체와 객체지향 프로그래밍&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나만의 자료형처럼 만든다는 것은 OOP에서 하나의 물체를 정의하는 것과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나만의 자료형으로 물체(객체)를 정의하고, 동적할당을 이용해서 물체를 생성 후 원하는 때에 해당 물체를 제거합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 객체지향 프로그래밍과 유사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멤버 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;#include&amp;nbsp;&amp;lt;stdlib.h&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;struct&amp;nbsp;Human &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;float&amp;nbsp;Height; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;float&amp;nbsp;Weight; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;size_t&amp;nbsp;Age; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;void&amp;nbsp;SayHello(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;Hello!\n&quot;); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;void&amp;nbsp;SayMyInfo(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;My&amp;nbsp;Height&amp;nbsp;is&amp;nbsp;%.1f.\n&quot;,&amp;nbsp;Height); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;My&amp;nbsp;Weight&amp;nbsp;is&amp;nbsp;%.1f.\n&quot;,&amp;nbsp;Weight); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;My&amp;nbsp;age&amp;nbsp;is&amp;nbsp;%zu.\n\n&quot;,&amp;nbsp;Age); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;}; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;typedef&amp;nbsp;struct&amp;nbsp;Human&amp;nbsp;Human_t; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;main(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Human_t*&amp;nbsp;Park&amp;nbsp;=&amp;nbsp;(Human_t*)malloc(1&amp;nbsp;*&amp;nbsp;sizeof(Human_t)); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Park-&amp;gt;Height&amp;nbsp;=&amp;nbsp;173.f; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Park-&amp;gt;Weight&amp;nbsp;=&amp;nbsp;70.f; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Park-&amp;gt;Age&amp;nbsp;=&amp;nbsp;19; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Park-&amp;gt;SayHello(); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Park-&amp;gt;SayMyInfo(); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;free(Park); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Park&amp;nbsp;=&amp;nbsp;NULL; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열거형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수에 별명을 붙여서 소스코드를 이해하기 쉽게 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;enum&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;enum&amp;nbsp;EMonth &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;MONTH_JAN&amp;nbsp;=&amp;nbsp;1, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;MONTH_FEB&amp;nbsp;=&amp;nbsp;2, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;MONTH_MAR&amp;nbsp;=&amp;nbsp;3, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;MONTH_APR&amp;nbsp;=&amp;nbsp;4 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;enum&amp;nbsp;EASCII &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;ASCII_A&amp;nbsp;=&amp;nbsp;65, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;ASCII_B, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;ASCII_C, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;ASCII_D &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;main(void) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;This&amp;nbsp;month's(%d)&amp;nbsp;lucky&amp;nbsp;character&amp;nbsp;is&amp;nbsp;%c.&quot;,&amp;nbsp;3,&amp;nbsp;66); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;//&amp;nbsp;갑자기&amp;nbsp;숫자&amp;nbsp;3과&amp;nbsp;66이&amp;nbsp;튀어나오면&amp;nbsp;이해가&amp;nbsp;안될&amp;nbsp;수&amp;nbsp;있습니다. &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int&amp;nbsp;March&amp;nbsp;=&amp;nbsp;3,&amp;nbsp;B&amp;nbsp;=&amp;nbsp;66; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;This&amp;nbsp;month's(%d)&amp;nbsp;lucky&amp;nbsp;character&amp;nbsp;is&amp;nbsp;%c.&quot;,&amp;nbsp;March,&amp;nbsp;B); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;//&amp;nbsp;물론&amp;nbsp;위와&amp;nbsp;같이&amp;nbsp;하면&amp;nbsp;가독성이&amp;nbsp;좋아지긴&amp;nbsp;하나,&amp;nbsp;변수가&amp;nbsp;메모리&amp;nbsp;공간을&amp;nbsp;잡아먹음. &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;printf(&quot;This&amp;nbsp;month's(%d)&amp;nbsp;lucky&amp;nbsp;character&amp;nbsp;is&amp;nbsp;%c.&quot;,&amp;nbsp;MONTH_MAR,&amp;nbsp;ASCII_B); &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;return&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블루프린트 fps강의만들었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://youtu.be/FBxpE3OSPPI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/FBxpE3OSPPI&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>본캠프</category>
      <author>백구</author>
      <guid isPermaLink="true">https://baggu4402.tistory.com/11</guid>
      <comments>https://baggu4402.tistory.com/11#entry11comment</comments>
      <pubDate>Fri, 24 Apr 2026 15:14:21 +0900</pubDate>
    </item>
  </channel>
</rss>