<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>journey46110 님의 블로그</title>
    <link>https://journey46110.tistory.com/</link>
    <description>journey46110 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Sat, 25 Jul 2026 00:35:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>journey46110</managingEditor>
    <item>
      <title>개념 정리 - C++ (함수 오버로딩과 템플릿)</title>
      <link>https://journey46110.tistory.com/44</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;I. 함수 오버로딩&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 함수 오버로딩의 정의&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;300&quot; data-start=&quot;280&quot; data-ke-size=&quot;size16&quot;&gt;같은 이름의 함수를 여러 개 만들되, &lt;b&gt;매개변수가 달라야 하는 것&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784784951132&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Print(int n)
{
    cout &amp;lt;&amp;lt; n;
}

void Print(double d)
{
    cout &amp;lt;&amp;lt; d;
}

Print(10);      // int 버전
Print(3.14);    // double 버전&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;2) Name Mangling&lt;/b&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;① C에서 함수를 기억하는 방식&lt;/p&gt;
&lt;pre id=&quot;code_1784785924516&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Print(int a); //Print로 기억함&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;② C++에서 함수를 기억하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 Name Mangling이라고 함&lt;/p&gt;
&lt;pre id=&quot;code_1784786032318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Print(int a);
Print(double b);
Print(char c);

//컴파일러 내부에서 스스로 아래처럼 이름을 바꿔서 각각 다른 함수로 저장함
//Print_int, Print_double, Print_char&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;3) 오버로딩이 가능한 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 매개변수 타입이 다를 때&lt;/p&gt;
&lt;pre id=&quot;code_1784785007897&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Print(int a);
void Print(double a);&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_1784785025917&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Print(int a);
void Print(int a, int b);&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;4) 오버로딩이 불가능한 경우&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;pre id=&quot;code_1784786489950&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Print(int a);
void Print(double a);

Print('A'); //char는 int와 double로 각각 손실이 없는 변환이 가능함&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_1784786631515&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Print(int a, int b = 10);
void Print(int a);

Print(10); //int b = 10의 디폴트 매개변수로 인해서 두 함수 다 호출이 가능함&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_1784786741590&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Print(int* arr);
void Print(int arr[]);

Print(arr); //포인터와 배열은 같은 타입으로 취급됨 int* arr == int arr[]&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_1784785740930&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Add(int a, int b);
double Add(int a, int b);

Add(1, 2); //어느 함수를 호출해야할 지 애매모호함&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;5) 오버로딩 호출 우선 순위&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 순위: 정확히 일치 -&amp;gt; 승격 변환 -&amp;gt; 표준 변환 -&amp;gt; 사용자 정의 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 정확히 매개변수 타입이 일치&lt;/p&gt;
&lt;pre id=&quot;code_1784786162921&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Print(int a);
void Print(double a);

Print(10); //정확히 타입이 일치하는 int가 호출됨&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;pre id=&quot;code_1784786212579&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char &amp;rarr; int
short &amp;rarr; int
float &amp;rarr; double
bool &amp;rarr; int

void Print(int a);
void Print(char a);

short s = 10;
print(s); //int로 타입 승격 변환이 가능함&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;pre id=&quot;code_1784786252308&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int &amp;rarr; double
double &amp;rarr; int
double &amp;rarr; float

void Print(int a);
void Print(string a);

double num = 10.01;
Print(num); //int로 표준 타입 변환이 일어남&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;pre id=&quot;code_1784787747210&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Number {
public:
    operator int() const { return 67; }
};

void Print(int a);
void Print(double a);

Number num;
print(num);  //사용자 정의 변환을 통해 Number&amp;rarr;int로 변환됨&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;II. 템플릿&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 템플릿의 필요성&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;동작은 같지만 반환형과 매개변수의 자료형만 다른 함수들&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784805751004&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Add(int a, int b);
double Add(double a, double b);
float Add(float a, float b);&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;장점&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;④ STL(vector, list, map 등)의 기반 기술&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;b&gt;2) 사용법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 위에 이 문법을 적어줌&lt;/p&gt;
&lt;pre id=&quot;code_1784805909090&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;
혹은
template&amp;lt;class T&amp;gt;&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_1784805964763&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 Add(T a, T b)
{
    return a + b;
}

Add(10,20);      //30 출력
Add(1.5,2.3);    //3.8 출력
Add('A','B');    //AB출력&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 템플릿 클래스&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2846&quot; data-start=&quot;2839&quot; data-ke-size=&quot;size16&quot;&gt;함수뿐 아니라 클래스도 일반화할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1784809047911&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;
class Array
{
private:
    T data[100];
    int size;

public:
    Array()
    {
        size = 0;
    }
    void Add(T value)
    {
        data[size++] = value;
    }
};

Array&amp;lt;int&amp;gt; numbers;
Array&amp;lt;string&amp;gt; names;
Array&amp;lt;double&amp;gt; scores;&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 함수 오버로딩 vs 템플릿&lt;/b&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;템플릿&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;범용적이고 재사용성 높음&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;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언리얼 엔진/개념 정리</category>
      <author>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/44</guid>
      <comments>https://journey46110.tistory.com/44#entry44comment</comments>
      <pubDate>Thu, 23 Jul 2026 21:21:20 +0900</pubDate>
    </item>
    <item>
      <title>개념 정리 - C++ (메모리 관리)</title>
      <link>https://journey46110.tistory.com/43</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;I. C++의 메모리 관리&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 메모리의 종류&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 사용하는 메모리는 크게 &lt;b&gt;스택(Stack)&lt;/b&gt; 과 &lt;b&gt;힙(Heap)&lt;/b&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;스택 (Stack)&lt;/td&gt;
&lt;td&gt;힙 (Heap)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;관리&lt;/td&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;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;큼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;생명주기&lt;/td&gt;
&lt;td&gt;블록({}) 종료 시 자동 해제&lt;/td&gt;
&lt;td&gt;delete 할 때까지 유지&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;&lt;b&gt;2) 스택 (Stack)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 함수가 실행될 때 메모리의 모습&lt;/p&gt;
&lt;pre id=&quot;code_1784698524299&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Func()
{
    int a = 10;
}


Stack
┌────────┐
│ a = 10 │
└────────┘&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_1784698569669&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Stack
(비어 있음)&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;③ 특징&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 힙 (Heap)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 메모리를 빌리는 공간&lt;/p&gt;
&lt;pre id=&quot;code_1784698714716&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Player* player = new Warrior(...);

Stack
player
 │
 ▼
Heap
Warrior 객체&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가 종료되어도 객체가 살아있음&lt;/p&gt;
&lt;pre id=&quot;code_1784698757161&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete player;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 없어지지 않고, 직접 delete를 해줘야 함&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;pre id=&quot;code_1784698818303&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cin &amp;gt;&amp;gt; size;
int* arr = new int[size];&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;표준 C++에서는 int arr[size]; 불가능&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_1784698873345&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Player* CreatePlayer()
{
    return new Warrior(...);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수가 끝나도 Warrior 객체가 살아있음&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_1784698944469&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Player* player1 = new Warrior();
Player* player2 = new Magician();
Player* player3 = new Archer();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 함수를 이용해 override를 할 때 힙을 자주 이용함&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;b&gt;4) 메모리 누수 (Memory Leak)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784699084649&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Player* player = new Warrior(...);

//delete player;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delete를 안 했기에 메모리에 객체가 계속 남아 있음&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) Dangling Pointer&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리를 지웠는데, 포인터가 그대로 남아 있는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1784699200574&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Player* player = new Warrior();
delete player;

player-&amp;gt;attack();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없어진 메모리를 가리키는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1784699232207&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete player;
player = nullptr;&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6) Double Delete&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 지운 메모리를 또 지우는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1784699257913&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete player;
delete player;&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7) 스마트 포인터&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙을 쓸 때 직접 new와 delete를 쓰면 실수하기 쉬움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트 포인터는 자동으로 delete를 해줌&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;① unique_ptr&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;pre id=&quot;code_1784699420875&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;unique_ptr
      │
      ▼
    Warrior

unique_ptr&amp;lt;Player&amp;gt; p1 = make_unique&amp;lt;Warrior&amp;gt;();
unique_ptr&amp;lt;Player&amp;gt; p2 = p1; //복사 안 됨, 컴파일 에러 발생&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;move를 사용해서 소유권 이전만 가능, 이때 소유권이 없어진 쪽은 nullptr이 됨&lt;/p&gt;
&lt;pre id=&quot;code_1784699473843&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;unique_ptr&amp;lt;Player&amp;gt; p2 = move(p1);

p1
nullptr

p2
 │
 ▼
Warrior&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;② shared_ptr&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 포인터가 한 메모리를 같이 소유함&lt;/p&gt;
&lt;pre id=&quot;code_1784699749739&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;P1
 \
  \
   Warrior
  /
 /
P2

shared_ptr&amp;lt;Player&amp;gt; p1 = make_shared&amp;lt;Warrior&amp;gt;();
cout &amp;lt;&amp;lt; &quot;p1의 레퍼런스 카운트: &quot; &amp;lt;&amp;lt; p1.use_count() &amp;lt;&amp;lt; endl; //출력 1

shared_ptr&amp;lt;Player&amp;gt; p2 = p1;
cout &amp;lt;&amp;lt; &quot;p2 생성 후 레퍼런스 카운트: &quot; &amp;lt;&amp;lt; p1.use_count() &amp;lt;&amp;lt; endl; //출력 2

p2.reset();
cout &amp;lt;&amp;lt; &quot;p2 해제 후 레퍼런스 카운트: &quot; &amp;lt;&amp;lt; p1.use_count() &amp;lt;&amp;lt; endl; //출력 1

return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로 Reference Count를 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reset을 이용해 소유권을 해제할 수 있음&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;③ weak_ptr&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로를 shared_ptr로 참조하는 경우 레퍼런스 카운트가 0이 되지 않음, 이를 순환참조라고 함&lt;/p&gt;
&lt;pre id=&quot;code_1784700127812&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A
&amp;darr;
B
&amp;uarr;
A&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 한쪽을 weak_ptr으로 바꾸면 순환참조가 풀림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;weak_ptr은 레퍼런스 카운트에 영향을 미치지 않아서, lock으로 유효성을 검사해야 함&lt;/p&gt;
&lt;pre id=&quot;code_1784700818655&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;memory&amp;gt;
using namespace std;

class Monster {
public:
    void roar() {
        cout &amp;lt;&amp;lt; &quot;슬라임이 울부짖습니다!&quot; &amp;lt;&amp;lt; endl;
    }
};

class Stage {
public:
    weak_ptr&amp;lt;Monster&amp;gt; monster;

    void checkMonster() {
        if (auto currentMonster = monster.lock()) {
            currentMonster-&amp;gt;roar();
        }
        else {
            cout &amp;lt;&amp;lt; &quot;몬스터가 이미 사라졌습니다.&quot; &amp;lt;&amp;lt; endl;
        }
    }
};

int main() {
    shared_ptr&amp;lt;Stage&amp;gt; stage = make_shared&amp;lt;Stage&amp;gt;();

    {
        shared_ptr&amp;lt;Monster&amp;gt; slime = make_shared&amp;lt;Monster&amp;gt;();

        stage-&amp;gt;monster = slime;

        stage-&amp;gt;checkMonster();   // 몬스터 존재
    }

    // slime 소멸

    stage-&amp;gt;checkMonster();       // 몬스터 없음
}&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_1784701061055&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;shared_ptr&amp;lt;Monster&amp;gt; slime = make_shared&amp;lt;Monster&amp;gt;();
slime(shared_ptr)
      │
      ▼
   Monster
   
stage-&amp;gt;monster = slime;
slime(shared_ptr)
      │
      ▼
   Monster
      ▲
      │
monster(weak_ptr)

auto currentMonster = monster.lock();
slime(shared_ptr)
      │
      ▼
   Monster
      ▲
      │
currentMonster(shared_ptr)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중괄호를 벗어나서 slime이 해제될 때, monster(weak_ptr)도 같이 해제됨&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;b&gt;8) 얕은 복사와 깊은 복사&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;pre id=&quot;code_1784715072041&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int* a = new int(10);
int* b = a;

delete a;
cout &amp;lt;&amp;lt; *b; // b -&amp;gt; dangling pointer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 같은 메모리를 가리킴&lt;br /&gt;하나를 삭제하면, 나머지 하나는 dangling pointer가 됨&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;pre id=&quot;code_1784715225106&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int* a = new int(10);
int* b = new int(*a);

delete a;
cout &amp;lt;&amp;lt; *b; //아무 문제 없음&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;II. 언리얼 엔진의 메모리 관리&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 가비지 컬렉션 (Garbage Collection)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;언리얼 엔진 내부에서는 new와 delete를 직접 쓰지 않음&lt;br /&gt;대신에 Garbage Collection을 주로 사용함&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;작동 방식 - Mark &amp;amp; Sweep 알고리즘&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;주기적으로 실행됨&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;더 이상 프로그램에서 사용하지 않는다고 판단되는 객체를 메모리에서 제거함&lt;/span&gt;&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;span&gt;&lt;span&gt;① 루트셋 (Root Set)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;루트셋에 포함된 객체를 식별&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;플레이 중에 항상 존재해야되는 객체를 포함함&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&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;span&gt;&lt;span&gt;② Mark 단계&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;루트셋의 객체에서 직간접적으로 참조할 수 있는 객체에 표시를 함&lt;/span&gt;&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;③ Sweep 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mark 단계에서 표시되지 않은 객체를 메모리에서 제거함&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;b&gt;2) 리플렉션 시스템&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;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;역할&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UCLASS()&lt;/td&gt;
&lt;td&gt;클래스 등록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USTRUCT()&lt;/td&gt;
&lt;td&gt;구조체 등록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UPROPERTY()&lt;/td&gt;
&lt;td&gt;멤버 변수 등록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UFUNCTION()&lt;/td&gt;
&lt;td&gt;함수 등록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GENERATED_BODY()&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;예시&lt;/p&gt;
&lt;pre id=&quot;code_1784716045614&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UCLASS(Blueprintable, BlueprintType)
class YOURPROJECT_API UPlayerData : public UObject
{
    GENERATED_BODY()

public:
    UPlayerData();

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Player&quot;)
    int32 Level = 1;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Player&quot;)
    float HP = 100.f;

    UFUNCTION(BlueprintCallable, Category = &quot;Player&quot;)
    void LevelUp();
};&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언리얼 엔진/개념 정리</category>
      <author>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/43</guid>
      <comments>https://journey46110.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 22 Jul 2026 19:27:32 +0900</pubDate>
    </item>
    <item>
      <title>개념 정리 - C++ (상속, 다형성)</title>
      <link>https://journey46110.tistory.com/42</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;I. 상속 (Inheritance)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 상속의 필요성&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; 비슷한 클래스가 여러 개 있을 때 공통 코드를 재사용하기 위해 사용함&lt;/span&gt;&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;span&gt;&lt;span&gt;예시 - 자동차, 자전거, 트럭은 색깔과 속도라는 공통 부분이 있음&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784178447424&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Bicycle
{
    string color;
    int speed;
};

class Truck
{
    string color;
    int speed;
};&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;pre id=&quot;code_1784178464843&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        Vehicle
      /         \
 Bicycle       Truck&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 상속 문법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784178547631&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Vehicle
{
};

class Bicycle : public Vehicle
{
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bicycle은 Vehicle을 상속받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bicycle의 기능과 Vehicle의 기능을 모두 가짐&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;b&gt;3) Is-A 관계&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;Bicycle은 Vehicle이다. (O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Truck은 Vehicle이다. (O)&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;잘못된 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Engine은 Vehicle이다. (X)&lt;br /&gt;Vehicle은 Engine을 가진다. (O)&lt;br /&gt;-&amp;gt; 이런 경우 포함(Composition)에 해당함&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;b&gt;4) 부모 생성자 호출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 클래스(파생 클래스) 생성 시 부모 클래스가 먼저 생성되어야 함&lt;/p&gt;
&lt;pre id=&quot;code_1784178772946&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Vehicle
{
public:
    Vehicle(string color, int speed)
    {
    }
};

class Bicycle : public Vehicle
{
public:
    Bicycle(string color, int speed)
        : Vehicle(color, speed)
    {
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서: Vehicle 생성 -&amp;gt; Bicycle 생성&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;b&gt;5) 멤버 초기화 리스트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자보다 먼저 실행됨&lt;/p&gt;
&lt;pre id=&quot;code_1784178823511&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Person(string n)
    : name(n)
{
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 쓰던 name=n; 보다 효율적&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;b&gt;6) 상속 활용 예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784178993153&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;string&amp;gt;

using namespace std;

// 부모 클래스
class Vehicle {
protected:
    string color;
    int speed;

public:
    Vehicle(string c, int s) : color(c), speed(s) {}

    void move() {
        cout &amp;lt;&amp;lt; color &amp;lt;&amp;lt; &quot; vehicle is moving at &quot;
             &amp;lt;&amp;lt; speed &amp;lt;&amp;lt; &quot; km/h.&quot; &amp;lt;&amp;lt; endl;
    }

    void stop() {
        cout &amp;lt;&amp;lt; &quot;The vehicle has stopped.&quot; &amp;lt;&amp;lt; endl;
    }

    string getColor() {
        return color;
    }
};

// 자전거
class Bicycle : public Vehicle {
private:
    bool hasBasket;

public:
    Bicycle(string c, int s, bool basket)
        : Vehicle(c, s), hasBasket(basket) {}

    void ringBell() {
        cout &amp;lt;&amp;lt; &quot;Ring Ring!&quot; &amp;lt;&amp;lt; endl;
    }

    void showBasket() {
        if (hasBasket)
            cout &amp;lt;&amp;lt; &quot;This bicycle has a basket.&quot; &amp;lt;&amp;lt; endl;
        else
            cout &amp;lt;&amp;lt; &quot;This bicycle doesn't have a basket.&quot; &amp;lt;&amp;lt; endl;
    }
};

// 자동차
class Car : public Vehicle {
private:
    int doorCount;

public:
    Car(string c, int s, int door)
        : Vehicle(c, s), doorCount(door) {}

    void openDoor() {
        cout &amp;lt;&amp;lt; doorCount &amp;lt;&amp;lt; &quot; doors are available.&quot; &amp;lt;&amp;lt; endl;
    }
};

// 비행기
class Airplane : public Vehicle {
private:
    int altitude;

public:
    Airplane(string c, int s, int alt)
        : Vehicle(c, s), altitude(alt) {}

    void fly() {
        cout &amp;lt;&amp;lt; &quot;Flying at &quot; &amp;lt;&amp;lt; altitude &amp;lt;&amp;lt; &quot; meters.&quot; &amp;lt;&amp;lt; endl;
    }
};

int main() {
    Bicycle bicycle(&quot;Yellow&quot;, 20, true);
    Car car(&quot;Black&quot;, 100, 4);
    Airplane airplane(&quot;White&quot;, 800, 10000);

    bicycle.move();
    bicycle.ringBell();
    bicycle.showBasket();

    cout &amp;lt;&amp;lt; endl;

    car.move();
    car.openDoor();

    cout &amp;lt;&amp;lt; endl;

    airplane.move();
    airplane.fly();

    cout &amp;lt;&amp;lt; endl;

    bicycle.stop();
    car.stop();
    airplane.stop();

    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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;II. 다형성 (Polymorphism)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 다형성의 필요성&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;① 다형성을 적용하지 않은 코드&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784280160860&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Lion
{
public:
	void bark() { cout &amp;lt;&amp;lt; &quot;Lion 아아아아아아&quot; &amp;lt;&amp;lt; endl; }
};

class Wolf
{
public:
	void bark() { cout &amp;lt;&amp;lt; &quot;Wolf 아우우우우우우&quot; &amp;lt;&amp;lt; endl; }
};

void print(Lion lion)
{
	lion.bark();
}

void print(Wolf wolf)
{
	wolf.bark();
}

int main()
{
	Lion lion();
	Wolf wolf();

	print(lion);
	print(wolf);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class가 더 늘어나면 print 함수도 새로 더 만들어줘야 함 -&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;/p&gt;
&lt;pre id=&quot;code_1784281553944&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal
{
public:
	Animal() {}
	virtual void bark() {};
};

class Lion : public Animal
{
public:
	void bark() { cout &amp;lt;&amp;lt; &quot;Lion 아아아아아아&quot; &amp;lt;&amp;lt; endl; }
};

class Wolf : public Animal
{
public:
	void bark() { cout &amp;lt;&amp;lt; &quot;Wolf 아우우우우우우&quot; &amp;lt;&amp;lt; endl; }
};

class Dog : public Animal
{
public:
	void bark() { cout &amp;lt;&amp;lt; &quot;Dog 멍멍&quot; &amp;lt;&amp;lt; endl; }
};

void print(Animal* animal)
{
	animal-&amp;gt;bark();
}

int main()
{
	Lion lion();
	Wolf wolf();
	Dog dog();

	print(&amp;amp;lion);
	print(&amp;amp;wolf);
	print(&amp;amp;dog);

	return 0;
}&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 가상 함수 (Virtual Function)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다형성에서 가장 중요한 키워드&lt;/p&gt;
&lt;pre id=&quot;code_1784280374543&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;virtual void bark()
{
}&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;① virtual을 사용하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적 바인딩: 실행 중에 실체 객체가 무엇인지 확인 후 해당 함수 호출하는 기능&lt;/p&gt;
&lt;pre id=&quot;code_1784280403297&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Animal*
&amp;darr;
동적 바인딩
(실제 객체 확인
&amp;darr;
Dog인가?
&amp;darr;
Dog::bark() 호출)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dog::bark()가 호출됨&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;② virtual을 사용하지 않는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1784280422271&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Animal* animal;
Dog dog;

animal = &amp;amp;dog;

animal-&amp;gt;bark();
&amp;darr;
Animal::bark() 호출&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dog의 주소를 가리켜도 Animal::bark()가 호출됨&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;b&gt;3) 재정의 (Override)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모의 함수를 자식에서 다시 구현하는 것&lt;/p&gt;
&lt;pre id=&quot;code_1784280563797&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal
{
public:
    virtual void sound()
    {
        cout &amp;lt;&amp;lt; &quot;Animal&quot;;
    }
};

class Dog : public Animal
{
public:
    void sound() override
    {
        cout &amp;lt;&amp;lt; &quot;멍멍&quot;;
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;override는 부모 함수를 재정의하는 것이 맞는지 컴파일러가 확인해주는 역할&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;b&gt;4) 순수 가상 함수 (Pure Virtual Function)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 클래스가 함수를 아예 구현하지 않음&lt;/p&gt;
&lt;pre id=&quot;code_1784282694259&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;virtual void sound() = 0;&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;일반 가상 함수는 구현을 하고, 재정의는 자식 클래스에서 여부를 선택함&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 추상 클래스 (Abstract Class)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수 가상 함수가 하나라도 있으면 추상 클래스임&lt;/p&gt;
&lt;pre id=&quot;code_1784282770227&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Animal
{
public:
    virtual void sound() = 0;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1784282857014&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Animal animal; (불가능)

Animal *animal;
animal = &amp;amp;dog; (가능)&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;Animal은 인터페이스만 있을 뿐 이제 더 이상 인스턴스화가 될 수 없음&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;b&gt;6) 추상 클래스 활용 예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784283193213&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;

// 기본 클래스 (추상 클래스)
class Skill {
public:
    virtual void use() = 0;
};

// 파생 클래스 : Fireball
class Fireball : public Skill {
public:
    void use() override {
        cout &amp;lt;&amp;lt; &quot;Fireball! Deal 100 fire damage.&quot; &amp;lt;&amp;lt; endl;
    }
};

// 파생 클래스 : Heal
class Heal : public Skill {
public:
    void use() override {
        cout &amp;lt;&amp;lt; &quot;Heal! Recover 80 HP.&quot; &amp;lt;&amp;lt; endl;
    }
};

// 파생 클래스 : Dash
class Dash : public Skill {
public:
    void use() override {
        cout &amp;lt;&amp;lt; &quot;Dash! Move quickly forward.&quot; &amp;lt;&amp;lt; endl;
    }
};

int main() {
    Skill* skill;

    Fireball fireball;
    Heal heal;
    Dash dash;

    skill = &amp;amp;fireball;
    skill-&amp;gt;use();

    skill = &amp;amp;heal;
    skill-&amp;gt;use();

    skill = &amp;amp;dash;
    skill-&amp;gt;use();

    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언리얼 엔진/개념 정리</category>
      <author>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/42</guid>
      <comments>https://journey46110.tistory.com/42#entry42comment</comments>
      <pubDate>Fri, 17 Jul 2026 19:17:52 +0900</pubDate>
    </item>
    <item>
      <title>개념 정리 - C++(클래스)</title>
      <link>https://journey46110.tistory.com/41</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;클래스 (Class)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 클래스가 필요한 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스가 없을 때의 예시 - 학생의 성적을 관리하는 프로그램&lt;/p&gt;
&lt;pre id=&quot;code_1783667791222&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int korean = 90;
int english = 80;
int math = 100;

float GetAverage(int kor, int eng, int math);
int GetMax(int kor, int eng, int math);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과목 추가 -&amp;gt; 함수의 매개 변수 수정 필요&lt;br /&gt;학생이 여러 명 -&amp;gt; 변수가 많아짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점수를 아무 곳에서나 수정할 수 있음&lt;br /&gt;&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;&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;/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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 클래스의 구성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783668185979&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Student
{
private:
    int korean;
    int english;
    int math;

public:
    float GetAverage();
    int GetMaxScore();
};&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;① 멤버 변수 (Member Variable)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터&lt;/p&gt;
&lt;pre id=&quot;code_1783668407787&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int korean;
int english;
int 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;② 멤버 함수 (Member Function)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동작&lt;/p&gt;
&lt;pre id=&quot;code_1783668464196&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GetAverage();
GetMaxScore();&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;4) 객체 (Object)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클래스는 설계도에 해당함&lt;/p&gt;
&lt;pre id=&quot;code_1783668561375&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student s1;
Student s2;
Student s3;&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 멤버 접근 연산자 (.)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 객체 안의 변수나 함수는 . 으로 접근함&lt;/p&gt;
&lt;pre id=&quot;code_1783668622497&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student s;

s.GetAverage();&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;6) 접근 제어자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① public&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 누구나 접근 가능함&lt;/p&gt;
&lt;pre id=&quot;code_1783668693979&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public:
    void Print();&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;② private&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;pre id=&quot;code_1783668735728&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private:
    int score;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1783668762298&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student s;

s.score = 100; //에러 발생&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;7) Getter / Setter&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;- 값을 가져오는 함수&lt;/p&gt;
&lt;pre id=&quot;code_1783669730668&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int GetScore()
{
    return score;
}&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;② Setter&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;pre id=&quot;code_1783669863647&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void SetScore(int s)
{
    if(s &amp;gt;= 0 &amp;amp;&amp;amp; s &amp;lt;= 100)
        score = s;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- private를 사용하는 가장 큰 이유&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;b&gt;8) 생성자 (Constructor)&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 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;pre id=&quot;code_1783669943346&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student()
{
}&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;pre id=&quot;code_1783669973258&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student()
{
    score = 0;
}

Student s;&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;- 매개변수를 지정하지 않으면 에러가 발생함&lt;/p&gt;
&lt;pre id=&quot;code_1783670019373&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student(int s)
{
    score = s;
}

Student s(100);&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;pre id=&quot;code_1783670071075&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student(int s = 100)
{
    score = s;
}

Student s1;
Student s2(50);&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;9) 클래스 내부 구현과 외부 구현&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;- 함수를 클래스 내부에서 구현함&lt;/p&gt;
&lt;pre id=&quot;code_1783670226004&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Student
{
public:

    void Print()
    {
        cout &amp;lt;&amp;lt; &quot;Hello&quot;;
    }
};&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;- 헤더(.h)와 cpp를 분리하고, cpp에서 함수를 구현함&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;pre id=&quot;code_1783670254986&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Student
{
public:
    void Print();
};&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;cpp 파일&lt;/p&gt;
&lt;pre id=&quot;code_1783670339710&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;Student.h&quot;

void Student::Print()
{
    cout &amp;lt;&amp;lt; &quot;Hello&quot;;
}&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;main 함수&lt;/p&gt;
&lt;pre id=&quot;code_1783670353860&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;Student.h&quot;

int main()
{
    Student s;
    s.Print();
}&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;10) include Guard&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 헤더가 여러 번 include되는 것을 막음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한 번 정의하는 과정을 거친 클래스는 다음에 정의하는 과정을 무시함&lt;/p&gt;
&lt;pre id=&quot;code_1783670560730&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#ifndef STUDENT_H
#define STUDENT_H

class Student
{
};

#endif&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;11) 클래스의 특성&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;pre id=&quot;code_1783670963742&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student
├── score
├── name
├── GetAverage()
└── Print()&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;pre id=&quot;code_1783670982304&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public
&amp;darr;
사용 가능

private
&amp;darr;
숨김&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;pre id=&quot;code_1783671020408&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Student a;
Student b;
Student c;
Student d;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;11) 배터리 관리 클래스 만들기&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;- 배터리 잔량의 기본값은 100&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 0보다 작은 숫자와 100보다 큰 숫자의 예외처리를 함&lt;/p&gt;
&lt;pre id=&quot;code_1783681981170&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Battery(int initialCharge = 100) {
    charge = initialCharge;

    if (charge &amp;lt; 0) {
        charge = 0;
    }
    else if (charge &amp;gt; 100) {
        charge = 100;
    }&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_1783682047357&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; int getCharge() const {
     return charge;
 }&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;- 한 번 사용할 때마다 5씩 감소함&lt;/p&gt;
&lt;pre id=&quot;code_1783682095268&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; void useBattery() {
     if (charge &amp;gt;= 5) {
         charge -= 5;
     }
     else {
         charge = 0;
     }
     std::cout &amp;lt;&amp;lt; &quot;Battery used. Current charge: &quot; &amp;lt;&amp;lt; charge &amp;lt;&amp;lt; &quot;%\n&quot;;
 }&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;- 한 번 충전할 때마다 7씩 증가함&lt;/p&gt;
&lt;pre id=&quot;code_1783682124685&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void chargeBattery() {
    if (charge &amp;lt;= 93) {
        charge += 7;
    }
    else {
        charge = 100;
    }
    std::cout &amp;lt;&amp;lt; &quot;Battery charged. Current charge: &quot; &amp;lt;&amp;lt; charge &amp;lt;&amp;lt; &quot;%\n&quot;;
}&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_1783682161750&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;

class Battery {
private:
    int charge; // 배터리 잔량

public:
    // 생성자: 기본값은 100으로 설정
    Battery(int initialCharge = 100) {
        charge = initialCharge;

        if (charge &amp;lt; 0) {
            charge = 0;
        }
        else if (charge &amp;gt; 100) {
            charge = 100;
        }
    }

    // 배터리 잔량 반환
    int getCharge() const {
        return charge;
    }

    // 배터리를 사용하여 잔량 감소
    void useBattery() {
        if (charge &amp;gt;= 5) {
            charge -= 5;
        }
        else {
            charge = 0;
        }
        std::cout &amp;lt;&amp;lt; &quot;Battery used. Current charge: &quot; &amp;lt;&amp;lt; charge &amp;lt;&amp;lt; &quot;%\n&quot;;
    }

    // 배터리를 충전하여 잔량 증가
    void chargeBattery() {
        if (charge &amp;lt;= 93) {
            charge += 7;
        }
        else {
            charge = 100;
        }
        std::cout &amp;lt;&amp;lt; &quot;Battery charged. Current charge: &quot; &amp;lt;&amp;lt; charge &amp;lt;&amp;lt; &quot;%\n&quot;;
    }
};

void usingbattery() {
    // 배터리 객체 생성 (초기 잔량 100)
    Battery battery;

    std::cout &amp;lt;&amp;lt; &quot;Initial charge: &quot; &amp;lt;&amp;lt; battery.getCharge() &amp;lt;&amp;lt; &quot;%\n&quot;;

    // 배터리 사용 및 충전 테스트
    battery.useBattery(); // 잔량 95%
    battery.useBattery(); // 잔량 90%
    battery.chargeBattery(); // 잔량 97%
    battery.useBattery(); // 잔량 92%
}&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;12) 두 분수의 곱셉을 할 수 있는 클래스 만들기&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;- 분자의 기본값은 0, 분모의 기본값은 1임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 분모에 0이 들어오면 1로 바꿔줌&lt;/p&gt;
&lt;pre id=&quot;code_1783682478556&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Fraction(int num = 0, int denom = 1) {
    numerator = num;
    denominator = (denom != 0) ? denom : 1; // 분모가 0이면 1로 설정
}&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_1783682554806&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int gcd(int a, int b) const {
    while (b != 0) {
        int temp = b; // 현재 b 값을 저장
        b = a % b;    // a를 b로 나눈 나머지를 새로운 b로 설정
        a = temp;     // 이전 b 값을 새로운 a로 설정
    }
    return a; // b가 0이 되었을 때 a가 최대공약수
}&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_1783682593995&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void simplify() {
    int gcdValue = gcd(numerator, denominator); // 분자와 분모의 최대공약수 계산
    numerator /= gcdValue;   // 분자를 최대공약수로 나누기
    denominator /= gcdValue; // 분모를 최대공약수로 나누기
}&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_1783682646470&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Fraction multiply(const Fraction&amp;amp; other) const {
    // 새로운 분자 = 현재 분수의 분자 * 다른 분수의 분자
    int newNumerator = numerator * other.numerator;

    // 새로운 분모 = 현재 분수의 분모 * 다른 분수의 분모
    int newDenominator = denominator * other.denominator;

    // 새로운 Fraction 객체 생성
    Fraction result(newNumerator, newDenominator);

    // 결과를 간단히 만들기
    result.simplify();

    return result;
}&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_1783682745635&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void display() const {
    cout &amp;lt;&amp;lt; numerator &amp;lt;&amp;lt; &quot;/&quot; &amp;lt;&amp;lt; denominator;
}&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_1783682762751&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;

// Fraction 클래스 정의
// 분수를 표현하고 곱셈 및 단순화 기능을 제공합니다.
class Fraction {
private:
    int numerator;   // 분자
    int denominator; // 분모

    // 최대공약수를 계산하는 유클리드 호제법 구현
    // gcd 함수는 Fraction 클래스 내부에서만 사용되므로 private으로 설정
    int gcd(int a, int b) const {
        while (b != 0) {
            int temp = b; // 현재 b 값을 저장
            b = a % b;    // a를 b로 나눈 나머지를 새로운 b로 설정
            a = temp;     // 이전 b 값을 새로운 a로 설정
        }
        return a; // b가 0이 되었을 때 a가 최대공약수
    }

public:
    // 매개변수가 있는 생성자
    // 사용자로부터 분자와 분모를 입력받아 초기화합니다.
    // 분모가 0일 경우 자동으로 1로 설정합니다. (분모가 0이면 정의되지 않음)
    Fraction(int num = 0, int denom = 1) {
        numerator = num;
        denominator = (denom != 0) ? denom : 1; // 분모가 0이면 1로 설정
    }

    // 분수를 간단한 형태로 변환하는 함수
    // 최대공약수(gcd)를 이용해 분자와 분모를 나눕니다.
    void simplify() {
        int gcdValue = gcd(numerator, denominator); // 분자와 분모의 최대공약수 계산
        numerator /= gcdValue;   // 분자를 최대공약수로 나누기
        denominator /= gcdValue; // 분모를 최대공약수로 나누기
    }

    // 두 분수를 곱하는 함수
    // 두 분수를 곱한 새로운 분수를 반환합니다.
    Fraction multiply(const Fraction&amp;amp; other) const {
        // 새로운 분자 = 현재 분수의 분자 * 다른 분수의 분자
        int newNumerator = numerator * other.numerator;

        // 새로운 분모 = 현재 분수의 분모 * 다른 분수의 분모
        int newDenominator = denominator * other.denominator;

        // 새로운 Fraction 객체 생성
        Fraction result(newNumerator, newDenominator);

        // 결과를 간단히 만들기
        result.simplify();

        return result;
    }

    // 분수를 출력하는 함수
    // 분자를 '/' 기호와 함께 출력합니다.
    void display() const {
        cout &amp;lt;&amp;lt; numerator &amp;lt;&amp;lt; &quot;/&quot; &amp;lt;&amp;lt; denominator;
    }
};

void fraction(void) {
    // 두 분수 생성
    Fraction f1(1, 2); // 첫 번째 분수: 1/2
    Fraction f2(3, 4); // 두 번째 분수: 3/4

    // 두 분수를 곱하기
    Fraction product = f1.multiply(f2); // f1 * f2

    // 결과 출력
    cout &amp;lt;&amp;lt; &quot;곱한 결과: &quot;;
    product.display(); // 결과 분수 출력
    cout &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언리얼 엔진/개념 정리</category>
      <author>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/41</guid>
      <comments>https://journey46110.tistory.com/41#entry41comment</comments>
      <pubDate>Fri, 10 Jul 2026 20:27:28 +0900</pubDate>
    </item>
    <item>
      <title>개념 정리 - C++(포인터와 레퍼런스)</title>
      <link>https://journey46110.tistory.com/40</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;I. 포인터 (Pointer)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 포인터의 정의&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수의 메모리 주소를 저장하는 변수&lt;/p&gt;
&lt;pre id=&quot;code_1783561177373&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = 10;
int* ptr = &amp;amp;num;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ptr에는 num의 주소가 들어 있음&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;b&gt;2) 포인터를 사용하는 이유&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;pre id=&quot;code_1783561292105&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int       &amp;rarr; 4Byte
double    &amp;rarr; 8Byte
char      &amp;rarr; 1Byte&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- int arr[1000000]; 과 같이 큰 배열을 복사하면 매우 비효율적임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포인터는 주소 하나(8Byte)만 전달하면 되어서 매우 빠름&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_1783561385313&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = 10;
int* ptr = &amp;amp;num;

*ptr = 20;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과: num == 20&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;b&gt;3) 주소 연산자 (&amp;amp;)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수의 주소를 얻음&lt;/p&gt;
&lt;pre id=&quot;code_1783561440477&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = 10;

cout &amp;lt;&amp;lt; &amp;amp;num;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과: num의 주소가 출력됨&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;b&gt;4) 역참조 연산자 (*)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포인터가 가리키는 실제 값을 읽거나 수정함&lt;/p&gt;
&lt;pre id=&quot;code_1783561491749&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = 10;

int* ptr = &amp;amp;num;

cout &amp;lt;&amp;lt; *ptr;

*ptr = 30;

cout &amp;lt;&amp;lt; *ptr;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과: 각각 10, 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 포인터 선언과 초기화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포인터 타입은 가리키는 변수의 타입을 의미함&lt;/p&gt;
&lt;pre id=&quot;code_1783561540263&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int* p;     //4Byte
char* p;    //1Byte
double* p;  //8Byte&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포인터 타입을 알고 있어야 주소에서 몇 byte를 읽을 지 알 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1783561790283&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int* ptr = nullptr;     //아무 것도 가리키지 않음을 의미함&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;- 반드시 nullptr로 초기화하는 습관이 중요함&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;b&gt;6) 포인터의 크기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포인터의 크기는 타입과 관계없이 모두 동일함&lt;/p&gt;
&lt;pre id=&quot;code_1783561680163&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sizeof(int*)
sizeof(char*)
sizeof(double*)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모두 8Byte (64bit 운영체제 기준, 32bit 운영체제에서는 4Byte)&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;b&gt;7) 배열과 포인터의 유사성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 배열 이름은 첫 번째 원소의 주소를 의미함&lt;/p&gt;
&lt;pre id=&quot;code_1783562008659&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int arr[3];

// arr == &amp;amp;arr[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;pre id=&quot;code_1783562053299&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr[2] == *(arr + 2)

arr[i] == *(arr + i)&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_1783562144977&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr = other; //불가능&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;- 배열 이름이 바뀌게 되면 원소에 임의접근 할 수 없음&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;b&gt;8) 포인터 연산&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 포인터는 주소를 이동함&lt;/p&gt;
&lt;pre id=&quot;code_1783562288515&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ptr + 1               //주소 이동

int* -&amp;gt; 4Byte 이동
char* -&amp;gt; 1Byte 이동
double* -&amp;gt; 8Byte 이동&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;9) 포인터 배열과 배열 포인터&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;pre id=&quot;code_1783562464627&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int a = 10, b = 20, c = 30;
int* ptrArr[3] = {&amp;amp;a, &amp;amp;b, &amp;amp;c};

cout &amp;lt;&amp;lt; *ptrArr[0] &amp;lt;&amp;lt; endl;       //10 출력
cout &amp;lt;&amp;lt; *ptrArr[1] &amp;lt;&amp;lt; endl;       //20 출력
cout &amp;lt;&amp;lt; *ptrArr[2] &amp;lt;&amp;lt; endl;       //30 출력&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;a&amp;nbsp;=&amp;nbsp;10 &lt;br /&gt;b&amp;nbsp;=&amp;nbsp;20 &lt;br /&gt;c = 30&lt;br /&gt;┌──────┐ &lt;br /&gt;│&amp;nbsp; &amp;nbsp; &amp;nbsp; 10&amp;nbsp; &amp;nbsp; &amp;nbsp; │&amp;nbsp;&amp;nbsp;&amp;larr; a &lt;br /&gt;└──────┘&lt;br /&gt;┌──────┐ &lt;br /&gt;│&amp;nbsp; &amp;nbsp; &amp;nbsp; 20&amp;nbsp; &amp;nbsp; &amp;nbsp; │&amp;nbsp;&amp;nbsp;&amp;larr; b &lt;br /&gt;└──────┘&lt;br /&gt;┌──────┐ &lt;br /&gt;│&amp;nbsp; &amp;nbsp; &amp;nbsp; 30&amp;nbsp; &amp;nbsp; &amp;nbsp; │&amp;nbsp;&amp;nbsp;&amp;larr; c &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;ptrArr&lt;br /&gt;┌────────┐ &lt;br /&gt;│&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;a&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;amp;b&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;amp;c&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;/p&gt;
&lt;pre id=&quot;code_1783562619234&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int arr[3] = { 100, 200, 300 };
int (*ptr)[3] = &amp;amp;arr; // 배열 포인터 선언

cout &amp;lt;&amp;lt; (*ptr)[0] &amp;lt;&amp;lt; endl;    //100 출력
cout &amp;lt;&amp;lt; (*ptr)[1] &amp;lt;&amp;lt; endl;    //200 출력
cout &amp;lt;&amp;lt; (*ptr)[2] &amp;lt;&amp;lt; endl;    //300 출력&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;arr&lt;br /&gt;┌──────┬──────┬──────┐ &lt;br /&gt;│&amp;nbsp; &amp;nbsp; &amp;nbsp;100&amp;nbsp; &amp;nbsp; &amp;nbsp;│&amp;nbsp; &amp;nbsp; &amp;nbsp;200&amp;nbsp; &amp;nbsp; &amp;nbsp;│&amp;nbsp; &amp;nbsp; 300&amp;nbsp; &amp;nbsp; &amp;nbsp;│ &lt;br /&gt;└──────┴──────┴──────┘ &lt;br /&gt;^ &lt;br /&gt;| &lt;br /&gt;ptr&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_1783563157688&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int arr[3][4];

int (*ptr)[4] = arr;&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;10) 포인터 사용 정리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 일반 변수를 포인터로 가리킬 때&lt;/p&gt;
&lt;pre id=&quot;code_1783577057246&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int a = 5;
int* ptr = &amp;amp;a;

*ptr = 10;        // a == 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ptr -&amp;gt; 주소&lt;br /&gt;*ptr -&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;/p&gt;
&lt;pre id=&quot;code_1783577120830&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int arr[3] = {1, 2, 3};

int* ptr = arr;       // ptr[i] == *(ptr + i)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arr은 &amp;amp;arr[0]으로 ptr에 주소를 전달하고 있음&lt;br /&gt;ptr[0]은 이미 내부적으로 *가 들어있음 -&amp;gt; *ptr[0]을 하면, *(*(ptr+0))이 되어서 오류가 발생함&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_1783577208438&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int a = 10;
int b = 20;
int c = 30;

int* ptr[3] = {&amp;amp;a, &amp;amp;b, &amp;amp;c};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ptr&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]의 타입은 int*&lt;br /&gt;ptr[i] -&amp;gt; 주소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;*ptr[i] -&amp;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;pre id=&quot;code_1783577823817&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int arr[3] = {1,2,3};

int (*ptr)[3] = &amp;amp;arr;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ptr은 배열 전체를 가리키는 포인터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*ptr은 arr이 됨 -&amp;gt; (*ptr)[i]는 arr[i]이 됨&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;arr과 &amp;amp;arr의 차이&lt;/p&gt;
&lt;pre id=&quot;code_1783578567030&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int arr = {1, 10, 100};

&amp;amp;arr[0] + 1 == 10을 가지는 주소를 가리킴 //int*라면 4byte만큼 이동함
&amp;amp;arr + 1 == 배열 밖의 주소를 가리킴      //int*라면 4byte * 3 해서 12byte만큼 이동함&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;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;II. 레퍼런스 (Reference)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 레퍼런스의 정의&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;- 기존 변수의 별명(Alias)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;- 선언과 동시에 무조건 초기화해야함&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783578999276&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = 10;

int&amp;amp; ref = num;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;num과 ref는 같음&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;b&gt;2) 값 변경&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783579049948&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ref = 30;

cout &amp;lt;&amp;lt; num &amp;lt;&amp;lt; endl;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 포인터와 레퍼런스의 차이&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 49.3023%; text-align: center;&quot;&gt;포인터&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 50.6977%; text-align: center;&quot;&gt;레퍼런스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 49.3023%;&quot;&gt;주소 저장&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 50.6977%;&quot;&gt;변수의 별명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 49.3023%;&quot;&gt;재연결 가능&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 50.6977%;&quot;&gt;재연결 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 49.3023%;&quot;&gt;nullptr 가능&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 50.6977%;&quot;&gt;nullptr 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; width: 49.3023%;&quot;&gt;*,&amp;amp; 사용&lt;/td&gt;
&lt;td style=&quot;height: 21px; width: 50.6977%;&quot;&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;포인터&lt;/p&gt;
&lt;pre id=&quot;code_1783579135932&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = 10;

int* ptr = &amp;amp;num;

*ptr = 20;&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_1783579144242&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = 10;

int&amp;amp; ref = num;

ref = 20;&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) 상수 레퍼런스 (const reference)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 읽기만 가능하고 수정은 불가능함&lt;/p&gt;
&lt;pre id=&quot;code_1783579245516&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const int&amp;amp; ref = num;

cout &amp;lt;&amp;lt; ref;          // 가능
ref = 30;             // 불가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복사 비용 없이 데이터를 읽을 때 사용함&lt;/p&gt;</description>
      <category>언리얼 엔진/개념 정리</category>
      <author>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/40</guid>
      <comments>https://journey46110.tistory.com/40#entry40comment</comments>
      <pubDate>Thu, 9 Jul 2026 15:44:38 +0900</pubDate>
    </item>
    <item>
      <title>개념 정리 - C++(조건문과 반복문)</title>
      <link>https://journey46110.tistory.com/39</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;I. 조건문 (Conditional Statement)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 조건문의 정의&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조건의 참(true) / 거짓(false)에 따라 실행할 코드를 결정하는 문법&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) if문&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783507361919&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (score &amp;gt;= 60)   //조건식
{
    cout &amp;lt;&amp;lt; &quot;합격&quot;;
}&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;&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;3) if-else문&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783507430725&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (num % 2 == 0)
{
    cout &amp;lt;&amp;lt; &quot;짝수&quot;;
}
else
{
    cout &amp;lt;&amp;lt; &quot;홀수&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조건식이 참이면 if의 실행문을 작동함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 거짓이면 else의 실행문을 작동함&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) if-else if-else문&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783507508852&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (score &amp;gt;= 90)
    cout &amp;lt;&amp;lt; &quot;A&quot;;
else if (score &amp;gt;= 80)
    cout &amp;lt;&amp;lt; &quot;B&quot;;
else if (score &amp;gt;= 70)
    cout &amp;lt;&amp;lt; &quot;C&quot;;
else
    cout &amp;lt;&amp;lt; &quot;F&quot;;&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;- 가장 먼저 참이 되는 조건의 실행문을 작동함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 불필요한 else를 줄이고, else if를 사용하면 가독성이 좋아짐&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;b&gt;5) 복합 조건&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① AND (&amp;amp;&amp;amp;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 조건이 참이어야 참으로 판단&lt;/p&gt;
&lt;pre id=&quot;code_1783507695951&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (score &amp;gt;= 60 &amp;amp;&amp;amp; attendance &amp;gt;= 80)&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;② OR (||)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하나의 조건만 참이어도 참으로 판단&lt;/p&gt;
&lt;pre id=&quot;code_1783507727314&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (age &amp;lt; 8 || age &amp;gt;= 65)&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;6) switch문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하나의 &lt;b&gt;변수나 식의 값&lt;/b&gt;에 따라 여러 경우(case) 중 하나를 선택하여 실행하는 조건문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- if-else if를 대신하여 &lt;b&gt;값을 비교하는 경우&lt;/b&gt;에 많이 사용함&lt;/p&gt;
&lt;pre id=&quot;code_1783509592344&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char op = '+';

switch (op)
{
    case '+':
        cout &amp;lt;&amp;lt; &quot;덧셈&quot;;
        break;

    case '-':
        cout &amp;lt;&amp;lt; &quot;뺄셈&quot;;
        break;

    case '*':
        cout &amp;lt;&amp;lt; &quot;곱셈&quot;;
        break;

    case '/':
        cout &amp;lt;&amp;lt; &quot;나눗셈&quot;;
        break;

    default:
        cout &amp;lt;&amp;lt; &quot;잘못된 연산자&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;switch의 값 확인 -&amp;gt; 일치하는 case 확인 -&amp;gt; 해당 case부터 실행 -&amp;gt; break를 만나면 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- default는 else와 똑같은 역할을 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일부러 break를 쓰지 않는 경우도 있음 (fall-through)&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;II. 반복문 (Loop)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 반복문의 정의&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;- 같은 작업을 여러 번 반복할 때 사용하는 문법&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대표적으로 for, while이 있음&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;b&gt;2) for문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주로 반복 횟수가 명확할 때 사용함&lt;/p&gt;
&lt;pre id=&quot;code_1783509011820&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 1; i &amp;lt;= 5; ++i) //--i도 가능
{
    cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl;
}

for (int i = 1; i &amp;lt;= 20; ++i)
{
    if (i % 3 == 0)
        cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기화 -&amp;gt; 조건 검사 -&amp;gt; 실행 -&amp;gt; 증감 -&amp;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 중첩 반복문&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;pre id=&quot;code_1783509124556&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;

void printDiamond() {
    int num;

    do {
        cout &amp;lt;&amp;lt; &quot;입력: &quot;;
        cin &amp;gt;&amp;gt; num;

        if (num &amp;lt;= 1) {
            cout &amp;lt;&amp;lt; &quot;2 이상의 수를 입력하세요&quot; &amp;lt;&amp;lt; endl;
        }
    } while (num &amp;lt;= 1);

    for (int row = 1; row &amp;lt;= num; ++row) { //중첩 반복문
        for (int space = 1; space &amp;lt;= num - row; ++space) cout &amp;lt;&amp;lt; &quot; &quot;;
        for (int star = 1; star &amp;lt;= 2 * row - 1; ++star) cout &amp;lt;&amp;lt; &quot;*&quot;;
        cout &amp;lt;&amp;lt; endl;
    }

    for (int row = num - 1; row &amp;gt;= 1; row--) { //중첩 반복문
        for (int space = 1; space &amp;lt;= num - row; ++space) cout &amp;lt;&amp;lt; &quot; &quot;;
        for (int star = 1; star &amp;lt;= 2 * row - 1; ++star) cout &amp;lt;&amp;lt; &quot;*&quot;;
        cout &amp;lt;&amp;lt; endl;
    }
}&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;4) while문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주로 반복 횟수를 모를 때 사용함&lt;/p&gt;
&lt;pre id=&quot;code_1783509220112&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (num != 0)
{
    cin &amp;gt;&amp;gt; num;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건 검사 -&amp;gt; 실행 -&amp;gt; 조건 검사 -&amp;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;무한 반복&lt;/p&gt;
&lt;pre id=&quot;code_1783509263260&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (true)
{
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- break나 return으로 탈출 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- break는 해당 반복문만 종료시키고, return은 해당 함수를 종료시킴&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;b&gt;5) do-while문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실행문을 일단 한 번 실행을 한 후 조건을 검사함&lt;/p&gt;
&lt;pre id=&quot;code_1783509409110&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;

void gradeArray(void) {
	const int studentCount = 5;
	double score[studentCount] = {};
	double totalScore = 0;                                          //총합
	double avgScore;                                                //평균

	for (int i = 0; i &amp;lt; studentCount; i++) {
		do {                                //do-while문, 실행 한 번을 먼저함
			cout &amp;lt;&amp;lt; i + 1 &amp;lt;&amp;lt; &quot;번째 학생 점수를 입력하세요 (0~100): &quot;;
			cin &amp;gt;&amp;gt; score[i];

			if (score[i] &amp;lt; 0 || score[i] &amp;gt; 100)
				cout &amp;lt;&amp;lt; &quot;잘못된 점수입니다. 0~100 사이의 점수를 입력하세요&quot; &amp;lt;&amp;lt; endl;
		} while (score[i] &amp;lt; 0 || score[i] &amp;gt; 100);
		totalScore += score[i];
	}

	avgScore = totalScore / studentCount;

	cout &amp;lt;&amp;lt; &quot;총점: &quot; &amp;lt;&amp;lt; totalScore &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;평균: &quot; &amp;lt;&amp;lt; avgScore &amp;lt;&amp;lt; endl;
}&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;gt; 조건 검사 -&amp;gt; 실행 -&amp;gt; ... 의 순서로 실행됨&lt;/p&gt;</description>
      <category>언리얼 엔진/개념 정리</category>
      <author>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/39</guid>
      <comments>https://journey46110.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 8 Jul 2026 20:23:35 +0900</pubDate>
    </item>
    <item>
      <title>개념 정리 - C++(배열과 함수)</title>
      <link>https://journey46110.tistory.com/38</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;I. 배열 (Array)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 배열의 정의&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;- 같은 자료형의 여러 데이터를 하나의 이름으로 관리하는 자료구조&lt;/span&gt;&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;span&gt;&lt;span&gt;배열을 사용하지 않을 때&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783488693306&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int score1;
int score2;
int score3;
int score4;
int score5;&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_1783488714775&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int score[5];&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;&lt;b&gt;2) 배열의 구조&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783488781490&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int score[5];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자료형 int&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 이름 score&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원소 개수 [5]&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;score&lt;br /&gt;┌────┬────┬────┬────┬────┐ &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; &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;br /&gt;└────┴────┴────┴────┴────┘ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4&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;b&gt;3) 인덱스 (Index)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배열은 0부터 시작함&lt;/p&gt;
&lt;pre id=&quot;code_1783488931620&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;score[0] = 90;
score[1] = 85;
score[2] = 100;
score[3] = 70;
score[4] = 95;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 번째 점수가 100이 됨&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;b&gt;4) 임의 접근&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배열은 원하는 위치로 바로 접근할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1783489077558&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;score[4]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 5번째 점수를 불러올 수 있음&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;b&gt;5) 배열의 초기화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 선언과 동시에 초기화&lt;/p&gt;
&lt;pre id=&quot;code_1783489190966&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int score[5] = {90,80,70,60,50};&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;② 전부 0으로 초기화&lt;/p&gt;
&lt;pre id=&quot;code_1783489206003&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int score[5] = {};&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;6) 배열의 입출력&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;불가능&lt;/p&gt;
&lt;pre id=&quot;code_1783489582261&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int score1[2] = {80, 90};

int score2[2];

score2 = score1; //불가능&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_1783489244835&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;5;i++)
{
    cin &amp;gt;&amp;gt; score[i];
}&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_1783489268683&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;5;i++)
{
    cout &amp;lt;&amp;lt; score[i] &amp;lt;&amp;lt; endl;
}&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;7) 배열의 길이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배열의 크기는 자료형의 크기 x 인덱스의 개수임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배열의 크기를 인덱스 하나의 크기로 나누면 배열의 길이가 됨&lt;/p&gt;
&lt;pre id=&quot;code_1783489289637&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sizeof(score) / sizeof(score[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;pre id=&quot;code_1783489405727&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int scoreLength = sizeof(score) / sizeof(score[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;&lt;b&gt;8) 성적 관리 프로그램 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 변수 선언&lt;/p&gt;
&lt;pre id=&quot;code_1783490566444&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;double score[5];&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_1783490617306&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cin &amp;gt;&amp;gt; score[0];
cin &amp;gt;&amp;gt; score[1];
cin &amp;gt;&amp;gt; score[2];
cin &amp;gt;&amp;gt; score[3];
cin &amp;gt;&amp;gt; score[4];&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_1783490727775&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;totalScore += score[0];
totalScore += score[1];
totalScore += score[2];
totalScore += score[3];
totalScore += score[4];

avgScore = totalScore / 5&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_1783490768887&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cout &amp;lt;&amp;lt; &quot;총점: &quot; &amp;lt;&amp;lt; totalScore &amp;lt;&amp;lt; endl;
cout &amp;lt;&amp;lt; &quot;평균: &quot; &amp;lt;&amp;lt; avgScore &amp;lt;&amp;lt; endl;&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_1783490790425&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;

void gradeArray(void) {
	const int studentCount = 5;
	double score[studentCount] = {};
	double totalScore = 0;            //총합
	double avgScore;                  //평균

	for (int i = 0; i &amp;lt; studentCount; i++) {
		do {
			cout &amp;lt;&amp;lt; i + 1 &amp;lt;&amp;lt; &quot;번째 학생 점수를 입력하세요 (0~100): &quot;;
			cin &amp;gt;&amp;gt; score[i];

			if (score[i] &amp;lt; 0 || score[i] &amp;gt; 100)
				cout &amp;lt;&amp;lt; &quot;잘못된 점수입니다. 0~100 사이의 점수를 입력하세요&quot; &amp;lt;&amp;lt; endl;
		} while (score[i] &amp;lt; 0 || score[i] &amp;gt; 100);
		totalScore += score[i];
	}

	avgScore = totalScore / studentCount;

	cout &amp;lt;&amp;lt; &quot;총점: &quot; &amp;lt;&amp;lt; totalScore &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; &quot;평균: &quot; &amp;lt;&amp;lt; avgScore &amp;lt;&amp;lt; endl;
}&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;II. 함수 (Function)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) 함수의 정의&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&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;pre id=&quot;code_1783494221958&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int add(int a, int b)
{
    return a+b;
}&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_1783494234201&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;add(3, 5);&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;2) 함수를 사용하는 이유&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;① 코드 재사용 가능&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 함수의 구성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783494348021&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int add(int num1, int num2)
{
    return num1 + num2;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반환형 int&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 이름 add&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수(Parameter) int num1, int num2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 코드 { return num1 + num2; }&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;b&gt;4) 함수 호출&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783494446103&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int result = add(3,5);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3과 5를 인자로 add 함수를 호출해서 8을 return함&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;b&gt;5) 반환값이 없는 함수&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1783494505227&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Print()
{
    cout&amp;lt;&amp;lt;&quot;Hello&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 반환형이 void인 함수는 아무 것도 반환하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- return 생략&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;b&gt;6) 값 전달 방식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 값 전달 (Call by Value) - 원본 변경 X&lt;/p&gt;
&lt;pre id=&quot;code_1783494620033&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void AddOne(int x)
{
    x++;
}

int num=10;

AddOne(num);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 num = 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인자로 변수를 넘겨주면 값을 복사해서 전달하는 방식이라 num이 변하지 않음&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;② 주소 전달 (Call by Address) - 원본 변경 O&lt;/p&gt;
&lt;pre id=&quot;code_1783494695621&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void AddOne(int* x)
{
    (*x)++;
}

int num = 10;

AddOne(&amp;amp;num);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 num = 11&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;③ 배열 전달 - 원본 변경 O&lt;/p&gt;
&lt;pre id=&quot;code_1783494858719&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void Print(int* ptr)
{
    ptr[0] = 4;
}

int arr[4] = {1, 2, 3, 4};

Print(arr);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 arr[0] = 4&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;④ 참조 전달 (Call by Reference) - 원본 변경 O&lt;/p&gt;
&lt;pre id=&quot;code_1783495100022&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void AddOne(int&amp;amp; x)
{
    x++;
}

int num = 10;

AddOne(num);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과 num = 11&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>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/38</guid>
      <comments>https://journey46110.tistory.com/38#entry38comment</comments>
      <pubDate>Wed, 8 Jul 2026 16:23:13 +0900</pubDate>
    </item>
    <item>
      <title>개념 정리 - C++(변수와 입출력)</title>
      <link>https://journey46110.tistory.com/37</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;변수와 입출력&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1) C++ 프로그램의 기본 구조&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 C++ 프로그램은 main() 함수에서 시작됨&lt;/p&gt;
&lt;pre id=&quot;code_1783476315741&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() {
    cout &amp;lt;&amp;lt; &quot;Hello, World!&quot; &amp;lt;&amp;lt; endl;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 101.163%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6194%; text-align: center;&quot;&gt;구성&lt;/td&gt;
&lt;td style=&quot;width: 77.3805%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6194%;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.3805%;&quot;&gt;입출력 기능(cin, cout)을 사용하기 위한 헤더&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6194%;&quot;&gt;using namespace std;&lt;/td&gt;
&lt;td style=&quot;width: 77.3805%;&quot;&gt;std::를 생략하기 위해 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6194%;&quot;&gt;int main()&lt;/td&gt;
&lt;td style=&quot;width: 77.3805%;&quot;&gt;프로그램의 시작점(진입점)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 44.6194%;&quot;&gt;return 0;&lt;/td&gt;
&lt;td style=&quot;width: 77.3805%;&quot;&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;&lt;b&gt;2) 변수 (Variable)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터를 저장하기 위해 메모리에 이름을 붙여 놓은 공간&lt;/p&gt;
&lt;pre id=&quot;code_1783476489597&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int age = 20;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시) 메모리에는 정수 하나가 저장되고, 그 공간의 이름이 age가 됨&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_1783476573277&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int score;
char grade;
double average;&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;3) 자료형 (Data Type)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 저장할 데이터의 종류와 메모리 크기를 결정함&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.114%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 20.5448%;&quot;&gt;자료형&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 24.0981%;&quot;&gt;저장 데이터&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 24.5185%;&quot;&gt;저장 공간&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 93.7483%;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5448%;&quot;&gt;int&lt;/td&gt;
&lt;td style=&quot;width: 24.0981%;&quot;&gt;정수&lt;/td&gt;
&lt;td style=&quot;width: 24.5185%;&quot;&gt;4 byte&lt;/td&gt;
&lt;td style=&quot;width: 93.7483%;&quot;&gt;10, -5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5448%;&quot;&gt;float&lt;/td&gt;
&lt;td style=&quot;width: 24.0981%;&quot;&gt;실수(단정밀도)&lt;/td&gt;
&lt;td style=&quot;width: 24.5185%;&quot;&gt;4 byte&lt;/td&gt;
&lt;td style=&quot;width: 93.7483%;&quot;&gt;3.14f&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5448%;&quot;&gt;double&lt;/td&gt;
&lt;td style=&quot;width: 24.0981%;&quot;&gt;실수(배정밀도)&lt;/td&gt;
&lt;td style=&quot;width: 24.5185%;&quot;&gt;8 byte&lt;/td&gt;
&lt;td style=&quot;width: 93.7483%;&quot;&gt;3.141592&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5448%;&quot;&gt;char&lt;/td&gt;
&lt;td style=&quot;width: 24.0981%;&quot;&gt;문자 1개&lt;/td&gt;
&lt;td style=&quot;width: 24.5185%;&quot;&gt;1 byte&lt;/td&gt;
&lt;td style=&quot;width: 93.7483%;&quot;&gt;'A'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5448%;&quot;&gt;bool&lt;/td&gt;
&lt;td style=&quot;width: 24.0981%;&quot;&gt;참/거짓&lt;/td&gt;
&lt;td style=&quot;width: 24.5185%;&quot;&gt;1 byte&lt;/td&gt;
&lt;td style=&quot;width: 93.7483%;&quot;&gt;true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5448%;&quot;&gt;string&lt;/td&gt;
&lt;td style=&quot;width: 24.0981%;&quot;&gt;문자열&lt;/td&gt;
&lt;td style=&quot;width: 24.5185%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 93.7483%;&quot;&gt;&quot;Hello&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5448%;&quot;&gt;unsigned int&lt;/td&gt;
&lt;td style=&quot;width: 24.0981%;&quot;&gt;양의 정수&lt;/td&gt;
&lt;td style=&quot;width: 24.5185%;&quot;&gt;4 byte&lt;/td&gt;
&lt;td style=&quot;width: 93.7483%;&quot;&gt;0 ~ 큰 양수&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;- unsigned는 부호 비트를 사용하지 않고 모든 비트를 숫자 표현에 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 따라서, 음수는 표현할 수 없지만, 양수(0 포함)의 표현 범위가 signed보다 약 2배 넓어진다.&lt;/p&gt;
&lt;pre id=&quot;code_1783477385172&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int
-2,147,483,648
~
2,147,483,647

unsigned int
0
~
4,294,967,295&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;4) 변수 선언과 초기화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 선언을 통해 메모리만 확보하고, 나중에 값을 대입하는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1783476847272&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num;
num = 10;&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_1783476908703&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = 10;&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;5) 출력과 입력&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 출력 cout&lt;/p&gt;
&lt;pre id=&quot;code_1783477159404&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cout &amp;lt;&amp;lt; &quot;점수 : &quot; &amp;lt;&amp;lt; score &amp;lt;&amp;lt; endl;&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;② 입력 cin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 입력한 값을 변수에 저장&lt;/p&gt;
&lt;pre id=&quot;code_1783477210582&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cin &amp;gt;&amp;gt; score;&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;6) 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① sizeof 연산자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수나 자료형의 메모리 크기를 알려줌&lt;/p&gt;
&lt;pre id=&quot;code_1783477932000&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num;

cout &amp;lt;&amp;lt; sizeof(num);&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_1783477975104&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sizeof(int)
sizeof(num)&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;table style=&quot;border-collapse: collapse; width: 101.046%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.4029%; text-align: center;&quot;&gt;연산자&lt;/td&gt;
&lt;td style=&quot;width: 353.754%; text-align: center;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.4029%;&quot;&gt;+&lt;/td&gt;
&lt;td style=&quot;width: 353.754%;&quot;&gt;덧셈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.4029%;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;width: 353.754%;&quot;&gt;뺄셈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.4029%;&quot;&gt;*&lt;/td&gt;
&lt;td style=&quot;width: 353.754%;&quot;&gt;곱셈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.4029%;&quot;&gt;/&lt;/td&gt;
&lt;td style=&quot;width: 353.754%;&quot;&gt;나눗셈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.4029%;&quot;&gt;%&lt;/td&gt;
&lt;td style=&quot;width: 353.754%;&quot;&gt;나머지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1783478076508&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int a = 10;
int b = 3;

a + b   //13
a - b   //7
a * b   //30
a / b   //3, 정수끼리 나누면 몫만 남고 소수점은 버림
a % b   //1&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;- 비교 결과는 항상 true 아니면 false임&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 98.2502%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center; width: 47.7484%;&quot;&gt;연산자&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 325.917%;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.7484%;&quot;&gt;==&lt;/td&gt;
&lt;td style=&quot;width: 325.917%;&quot;&gt;같다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.7484%;&quot;&gt;!=&lt;/td&gt;
&lt;td style=&quot;width: 325.917%;&quot;&gt;다르다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.7484%;&quot;&gt;&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 325.917%;&quot;&gt;크다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.7484%;&quot;&gt;&amp;lt;&lt;/td&gt;
&lt;td style=&quot;width: 325.917%;&quot;&gt;작다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.7484%;&quot;&gt;&amp;gt;=&lt;/td&gt;
&lt;td style=&quot;width: 325.917%;&quot;&gt;이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 47.7484%;&quot;&gt;&amp;lt;=&lt;/td&gt;
&lt;td style=&quot;width: 325.917%;&quot;&gt;이하&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1783478264312&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;5 == 5&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;pre id=&quot;code_1783478327009&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = 10;&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_1783478379453&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a += 3;
a -= 3;
a *= 3;
a /= 3;
a %= 3;

&amp;darr;

a = a + 3;
a = a - 3;
a = a * 3;
a = a / 3;
a = a % 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;p data-ke-size=&quot;size16&quot;&gt;- 후위 증가, 변수를 대입한 후 증감함&lt;/p&gt;
&lt;pre id=&quot;code_1783478440416&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int a = 5;
int b = a++;

&amp;darr;

a = 6
b = 5&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_1783478469116&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int a = 5;
int b = ++a;

&amp;darr;

a = 6
b = 6&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;7) 계산기 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 변수 선언&lt;/p&gt;
&lt;pre id=&quot;code_1783481465288&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num1;
int num2;&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_1783481508731&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cin &amp;gt;&amp;gt; num1;
cin &amp;gt;&amp;gt; num2;&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_1783481574893&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;num1 + num2
num1 - num2
num1 * num2
num1 / num2
num1 % num2&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_1783481609205&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cout &amp;lt;&amp;lt; num1 + num2 &amp;lt;&amp;lt; endl;&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_1783481745093&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;

void Calculate(void) {
	int num1;
	int num2;
	char op;
	char menu;

	while (true) {
		cout &amp;lt;&amp;lt; &quot;첫 번째 수 입력: &quot;;
		cin &amp;gt;&amp;gt; num1;
		cout &amp;lt;&amp;lt; &quot;두 번째 수 입력: &quot;;
		cin &amp;gt;&amp;gt; num2;
		cout &amp;lt;&amp;lt; &quot;연산자 입력: &quot;;
		cin &amp;gt;&amp;gt; op;

		switch (op) {
			case '+':
				cout &amp;lt;&amp;lt; num1 &amp;lt;&amp;lt; &quot; + &quot; &amp;lt;&amp;lt; num2 &amp;lt;&amp;lt; &quot; = &quot; &amp;lt;&amp;lt; num1 + num2 &amp;lt;&amp;lt; endl;
				break;
			case '-':
				cout &amp;lt;&amp;lt; num1 &amp;lt;&amp;lt; &quot; - &quot; &amp;lt;&amp;lt; num2 &amp;lt;&amp;lt; &quot; = &quot; &amp;lt;&amp;lt; num1 - num2 &amp;lt;&amp;lt; endl;
				break;
			case '*':
				cout &amp;lt;&amp;lt; num1 &amp;lt;&amp;lt; &quot; * &quot; &amp;lt;&amp;lt; num2 &amp;lt;&amp;lt; &quot; = &quot; &amp;lt;&amp;lt; num1 * num2 &amp;lt;&amp;lt; endl;
				break;
			case '/':
				if (num2 == 0) {
					cout &amp;lt;&amp;lt; &quot;0으로 나눌 수 없습니다&quot; &amp;lt;&amp;lt; endl;
				}
				else {
					cout &amp;lt;&amp;lt; num1 &amp;lt;&amp;lt; &quot; / &quot; &amp;lt;&amp;lt; num2 &amp;lt;&amp;lt; &quot; = &quot; &amp;lt;&amp;lt; (double)num1 / num2 &amp;lt;&amp;lt; endl;
				}
				break;
			case '%':
				if (num2 == 0) {
					cout &amp;lt;&amp;lt; &quot;0으로 나눌 수 없습니다&quot; &amp;lt;&amp;lt; endl;
				}
				else {
					cout &amp;lt;&amp;lt; num1 &amp;lt;&amp;lt; &quot; % &quot; &amp;lt;&amp;lt; num2 &amp;lt;&amp;lt; &quot; = &quot; &amp;lt;&amp;lt; num1 % num2 &amp;lt;&amp;lt; endl;
				}
				break;
			default:
				cout &amp;lt;&amp;lt; &quot;잘못된 연산자 입력입니다&quot; &amp;lt;&amp;lt; endl;
		}

		while (true)
		{
			cout &amp;lt;&amp;lt; &quot;=====================&quot; &amp;lt;&amp;lt; endl;
			cout &amp;lt;&amp;lt; &quot;1. 계산&quot; &amp;lt;&amp;lt; endl;
			cout &amp;lt;&amp;lt; &quot;2. 종료&quot; &amp;lt;&amp;lt; endl;
			cout &amp;lt;&amp;lt; &quot;=====================&quot; &amp;lt;&amp;lt; endl;
			cout &amp;lt;&amp;lt; &quot;선택 : &quot;;

			cin &amp;gt;&amp;gt; menu;

			if (menu == '1')
				break;

			if (menu == '2')
				return;

			cout &amp;lt;&amp;lt; &quot;잘못된 입력입니다.\n&quot;;
		}
	}
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>언리얼 엔진/개념 정리</category>
      <author>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/37</guid>
      <comments>https://journey46110.tistory.com/37#entry37comment</comments>
      <pubDate>Wed, 8 Jul 2026 12:41:23 +0900</pubDate>
    </item>
    <item>
      <title>TIL - 본캠프 6일차</title>
      <link>https://journey46110.tistory.com/36</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;I. Blueprint - FPS 슈팅 게임 개발 프로젝트 기능 추가 및 개선 &lt;/b&gt;&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;198&quot; data-start=&quot;120&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 FPS 프로젝트에 플레이 경험을 개선하는 기능들을 추가하고, 기존 시스템의 동작 방식을 조금 더 자연스럽게 수정하는 작업을 진행했다.&lt;/p&gt;
&lt;p data-end=&quot;198&quot; data-start=&quot;120&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;307&quot; data-start=&quot;200&quot; data-ke-size=&quot;size16&quot;&gt;플레이어의 이동(앉기, 달리기), 총알 및 재장전 시스템, 아이템 획득 조건, UI 개선 등을 구현하면서 게임의 완성도를 높였고, 중복되는 블루프린트 로직을 정리하는 리팩터링도 함께 진행했다.&lt;/p&gt;
&lt;p data-end=&quot;307&quot; data-start=&quot;200&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;구현 과정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 힐링 포션 획득 조건 수정 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;389&quot; data-start=&quot;344&quot; data-ke-size=&quot;size16&quot;&gt;기존에는 플레이어의 체력이 최대 체력이어도 힐링 포션을 획득하면 포션이 사라졌다.&lt;/p&gt;
&lt;p data-end=&quot;389&quot; data-start=&quot;344&quot; data-ke-size=&quot;size16&quot;&gt;이를 최대 체력이 아닐 때만 획득할 수 있도록 수정하여 불필요한 아이템 소모가 발생하지 않도록 변경했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Sm93/dJMcaixaEtx/6eGyklpGN2AK0RGhkTi6lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Sm93/dJMcaixaEtx/6eGyklpGN2AK0RGhkTi6lk/img.png&quot; data-alt=&quot;Health &amp;amp;lt; Max Health일 때만 포션 획득 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Sm93/dJMcaixaEtx/6eGyklpGN2AK0RGhkTi6lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Sm93%2FdJMcaixaEtx%2F6eGyklpGN2AK0RGhkTi6lk%2Fimg.png&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;700&quot; height=&quot;297&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Health &amp;lt; Max Health일 때만 포션 획득 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;566&quot; data-start=&quot;451&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;566&quot; data-start=&quot;451&quot; data-ke-size=&quot;size16&quot;&gt;또한, 최대 체력일 때는 포션을 획득할 수 없기 때문에 플레이어의 이동을 방해하지 않도록 Static Mesh의 Collision을 NoCollision으로 변경하여 자연스럽게 통과할 수 있도록 수정했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baotGU/dJMcaiKDckK/z1yg1dIKEGC95dMs1Hh5gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baotGU/dJMcaiKDckK/z1yg1dIKEGC95dMs1Hh5gk/img.png&quot; data-alt=&quot;콜리전 프리셋 - NoCollision&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baotGU/dJMcaiKDckK/z1yg1dIKEGC95dMs1Hh5gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaotGU%2FdJMcaiKDckK%2Fz1yg1dIKEGC95dMs1Hh5gk%2Fimg.png&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;500&quot; height=&quot;725&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;콜리전 프리셋 - NoCollision&lt;/figcaption&gt;
&lt;/figure&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;2)&lt;span&gt; 총알 시스템 개선&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;630&quot; data-start=&quot;588&quot; data-ke-size=&quot;size16&quot;&gt;기존 총알 아이템은 현재 장전되어 있는 탄창의 총알을 증가시키는 방식이었다. 실제 FPS 게임의 방식에 맞게 총알 아이템을 획득하면 &lt;b&gt;예비탄(Reserve Ammo)&lt;/b&gt; 이 증가하도록 수정하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3s5hw/dJMcaiX8RSb/a1OlyLhpP2wvcfvIgBhjk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3s5hw/dJMcaiX8RSb/a1OlyLhpP2wvcfvIgBhjk1/img.png&quot; data-alt=&quot;총알 획득 시 ReserveAmmo 증가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3s5hw/dJMcaiX8RSb/a1OlyLhpP2wvcfvIgBhjk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3s5hw%2FdJMcaiX8RSb%2Fa1OlyLhpP2wvcfvIgBhjk1%2Fimg.png&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;700&quot; height=&quot;214&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;총알 획득 시 ReserveAmmo 증가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;742&quot; data-start=&quot;701&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;742&quot; data-start=&quot;701&quot; data-ke-size=&quot;size16&quot;&gt;또한, 게임 시작 시 현재 총알을 최대 총알 수로 설정하던 방식을 변경하여, 현재 총알(Current Ammo)은 탄창 크기(Magazine Size)를 따로 추가하고, 최대 총알(Max Ammo)은 예비탄(Reserve Ammo)으로 바꾸고 역할을 분리했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TXfYv/dJMcabxZCyw/5XskQgn2RD2k9J6o7lBiTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TXfYv/dJMcabxZCyw/5XskQgn2RD2k9J6o7lBiTk/img.png&quot; data-alt=&quot;Set CurrentAmmo = MagazineSize&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TXfYv/dJMcabxZCyw/5XskQgn2RD2k9J6o7lBiTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTXfYv%2FdJMcabxZCyw%2F5XskQgn2RD2k9J6o7lBiTk%2Fimg.png&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;300&quot; height=&quot;229&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set CurrentAmmo = MagazineSize&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;880&quot; data-start=&quot;841&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 이후 재장전 시스템을 구현하기 위한 구조를 만들 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;880&quot; data-start=&quot;841&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;880&quot; data-start=&quot;841&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 재장전 기능 구현 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;947&quot; data-start=&quot;902&quot; data-ke-size=&quot;size16&quot;&gt;R 키 입력 시 예비탄에서 현재 탄창으로 총알을 옮기는 재장전 기능을 구현하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0v4NI/dJMcaiKDgdA/c0aZ64QOOrQqitHXLATPmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0v4NI/dJMcaiKDgdA/c0aZ64QOOrQqitHXLATPmk/img.png&quot; data-alt=&quot;IA_Reload, Reload 커스텀 이벤트 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0v4NI/dJMcaiKDgdA/c0aZ64QOOrQqitHXLATPmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0v4NI%2FdJMcaiKDgdA%2Fc0aZ64QOOrQqitHXLATPmk%2Fimg.png&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;500&quot; height=&quot;259&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IA_Reload, Reload 커스텀 이벤트 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;956&quot; data-start=&quot;949&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;956&quot; data-start=&quot;949&quot; data-ke-size=&quot;size16&quot;&gt;재장전 시에는&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJXfSd/dJMcadP4Ze8/s8pKDpvLQv7YvZq3gCVA40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJXfSd/dJMcadP4Ze8/s8pKDpvLQv7YvZq3gCVA40/img.png&quot; data-alt=&quot;Reload 커스텀 이벤트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJXfSd/dJMcadP4Ze8/s8pKDpvLQv7YvZq3gCVA40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJXfSd%2FdJMcadP4Ze8%2Fs8pKDpvLQv7YvZq3gCVA40%2Fimg.png&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;860&quot; height=&quot;221&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Reload 커스텀 이벤트&lt;/figcaption&gt;
&lt;/figure&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;4) 앉기(Crouch) 기능 구현 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1099&quot; data-start=&quot;1070&quot; data-ke-size=&quot;size16&quot;&gt;Ctrl 키 입력을 이용하여 앉기 기능을 추가하였다.&lt;/p&gt;
&lt;p data-end=&quot;1104&quot; data-start=&quot;1101&quot; data-ke-size=&quot;size16&quot;&gt;앉으면 이동 속도를 500에서 250으로 감소시키고, IsCrouched 변수를 true로 변경하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WWDfu/dJMb99NGps8/0CpXLkFb4jMDgoYblAQQc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WWDfu/dJMb99NGps8/0CpXLkFb4jMDgoYblAQQc0/img.png&quot; data-alt=&quot;Set MaxWalkSpeed 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WWDfu/dJMb99NGps8/0CpXLkFb4jMDgoYblAQQc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWWDfu%2FdJMb99NGps8%2F0CpXLkFb4jMDgoYblAQQc0%2Fimg.png&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;700&quot; height=&quot;341&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set MaxWalkSpeed 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1223&quot; data-start=&quot;1166&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1223&quot; data-start=&quot;1166&quot; data-ke-size=&quot;size16&quot;&gt;키를 떼면 다시 기본 이동 속도로 복귀하고 IsCrouched를 false로 변경하도록 구현하였다.&lt;/p&gt;
&lt;p data-end=&quot;1279&quot; data-start=&quot;1225&quot; data-ke-size=&quot;size16&quot;&gt;이후 다른 이동 기능과의 상태를 판단하기 위해 IsCrouched 변수를 추가하여 관리하였다.&lt;/p&gt;
&lt;p data-end=&quot;1279&quot; data-start=&quot;1225&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1279&quot; data-start=&quot;1225&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 달리기(Sprint) 기능 구현 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1341&quot; data-start=&quot;1309&quot; data-ke-size=&quot;size16&quot;&gt;Shift 입력 시 플레이어가 달릴 수 있도록 구현하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdEPQ6/dJMcacDLz42/ggfZdG8xMwlMY7kppvdKwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdEPQ6/dJMcacDLz42/ggfZdG8xMwlMY7kppvdKwK/img.png&quot; data-alt=&quot;Set MaxWalkSpeed 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdEPQ6/dJMcacDLz42/ggfZdG8xMwlMY7kppvdKwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdEPQ6%2FdJMcacDLz42%2FggfZdG8xMwlMY7kppvdKwK%2Fimg.png&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;700&quot; height=&quot;377&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set MaxWalkSpeed 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1394&quot; data-start=&quot;1343&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1394&quot; data-start=&quot;1343&quot; data-ke-size=&quot;size16&quot;&gt;달리는 동안 이동 속도는 800으로 증가하며 Shift를 놓으면 다시 기본 속도로 복귀한다.&lt;/p&gt;
&lt;p data-end=&quot;1457&quot; data-start=&quot;1396&quot; data-ke-size=&quot;size16&quot;&gt;또한, 앉은 상태에서는 달리기를 사용할 수 없도록 조건을 추가하여 두 상태가 동시에 적용되지 않도록 처리하였다.&lt;/p&gt;
&lt;p data-end=&quot;1457&quot; data-start=&quot;1396&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1457&quot; data-start=&quot;1396&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6) 이동 상태 간 제약 조건 추가 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1522&quot; data-start=&quot;1486&quot; 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-end=&quot;1671&quot; data-start=&quot;1588&quot; data-ke-size=&quot;size16&quot;&gt;이를 위해 IsAiming, IsCrouched, IsSprinting 변수를 이용하여 각각의 입력이 가능한 상황을 조건문으로 제어하였다.&lt;/p&gt;
&lt;p data-end=&quot;1725&quot; data-start=&quot;1673&quot; data-ke-size=&quot;size16&quot;&gt;덕분에 여러 입력이 동시에 발생하더라도 의도하지 않은 동작이 발생하지 않도록 만들 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;1725&quot; data-start=&quot;1673&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1725&quot; data-start=&quot;1673&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7) 탄약 UI 개선 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1768&quot; data-start=&quot;1746&quot; data-ke-size=&quot;size16&quot;&gt;기존 UI는 현재 총알 수만 표시하였다.&lt;/p&gt;
&lt;p data-end=&quot;1793&quot; data-start=&quot;1770&quot; data-ke-size=&quot;size16&quot;&gt;이를 FPS 게임에서 많이 사용하는 형태인 탄창 / 예비탄 형태로 변경했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baBySX/dJMcadbsf9z/dKYk9iRTtEcxC6EZVzfjXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baBySX/dJMcadbsf9z/dKYk9iRTtEcxC6EZVzfjXK/img.png&quot; data-alt=&quot;탄창 / 예비탄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baBySX/dJMcadbsf9z/dKYk9iRTtEcxC6EZVzfjXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaBySX%2FdJMcadbsf9z%2FdKYk9iRTtEcxC6EZVzfjXK%2Fimg.png&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;200&quot; height=&quot;83&quot; data-origin-width=&quot;217&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;탄창 / 예비탄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1870&quot; data-start=&quot;1810&quot; data-ke-size=&quot;size16&quot;&gt;이제 플레이어가 현재 사용할 수 있는 탄약과 남은 예비탄을 한 번에 확인할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;1870&quot; data-start=&quot;1810&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1870&quot; data-start=&quot;1810&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8) 블루프린트 최적화 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1952&quot; data-start=&quot;1892&quot; data-ke-size=&quot;size16&quot;&gt;기존 For Each Loop에서는 Loop Body 안에서 반복마다 Visibility를 변경하고 있었다.&lt;/p&gt;
&lt;p data-end=&quot;2005&quot; data-start=&quot;1954&quot; data-ke-size=&quot;size16&quot;&gt;이를 Completed 핀으로 이동하여 반복이 모두 끝난 뒤 한 번만 실행하도록 변경하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDfmv/dJMcadWT8hx/xneyjSkOdTLToZEzJdtP9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDfmv/dJMcadWT8hx/xneyjSkOdTLToZEzJdtP9K/img.png&quot; data-alt=&quot;Completed에 Set Visibility 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDfmv/dJMcadWT8hx/xneyjSkOdTLToZEzJdtP9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDfmv%2FdJMcadWT8hx%2FxneyjSkOdTLToZEzJdtP9K%2Fimg.png&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;700&quot; height=&quot;339&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Completed에 Set Visibility 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;2064&quot; data-start=&quot;2007&quot; data-ke-size=&quot;size16&quot;&gt;반복 중 불필요하게 실행되던 노드를 제거하여 블루프린트의 흐름을 조금 더 효율적으로 정리할 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;2064&quot; data-start=&quot;2007&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2064&quot; data-start=&quot;2007&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9) 중복 로직 리팩터링 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2130&quot; data-start=&quot;2087&quot; data-ke-size=&quot;size16&quot;&gt;게임 승리와 패배 처리에서는 동일한 종료 로직이 여러 곳에서 반복되고 있었다.&lt;/p&gt;
&lt;p data-end=&quot;2136&quot; data-start=&quot;2132&quot; data-ke-size=&quot;size16&quot;&gt;중복되던 텍스트 출력, 마우스 커서 표시, 입력 제한 등의 종료 처리를 하나의 &lt;b&gt;Custom Event(EndGame)&lt;/b&gt; 로 분리하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zGm23/dJMcaiDVSfe/giN5c93eKhKffiGcSj0p60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zGm23/dJMcaiDVSfe/giN5c93eKhKffiGcSj0p60/img.png&quot; data-alt=&quot;커스텀 이벤트 EndGame 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zGm23/dJMcaiDVSfe/giN5c93eKhKffiGcSj0p60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzGm23%2FdJMcaiDVSfe%2FgiN5c93eKhKffiGcSj0p60%2Fimg.png&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;700&quot; height=&quot;346&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커스텀 이벤트 EndGame 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;2283&quot; data-start=&quot;2218&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 중복 코드를 제거하고 이후 종료 로직을 수정해야 하는 경우에도 한 곳만 수정하면 되도록 구조를 개선하였다.&lt;/p&gt;
&lt;p data-end=&quot;2283&quot; data-start=&quot;2218&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2462&quot; data-start=&quot;2297&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 새로운 기능을 추가하는 것뿐만 아니라, 여러 기능이 함께 동작할 때 발생할 수 있는 충돌을 고려하는 작업이 많았다. 특히 앉기, 달리기, 조준처럼 플레이어의 상태에 따라 사용할 수 있는 기능을 제한하면서 단순히 기능을 구현하는 것보다 상태를 어떻게 관리할지가 중요하다는 점을 다시 느꼈다.&lt;/p&gt;
&lt;p data-end=&quot;2562&quot; data-start=&quot;2464&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2562&quot; data-start=&quot;2464&quot; data-ke-size=&quot;size16&quot;&gt;또한, 총알 시스템도 단순히 발사 횟수를 관리하는 수준에서 벗어나 &lt;b&gt;탄창과 예비탄을 분리하고 재장전 과정을 추가&lt;/b&gt;하면서 실제 FPS 게임과 유사한 구조로 발전시킬 수 있었다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2719&quot; data-start=&quot;2564&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2719&quot; data-start=&quot;2564&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로, 기능 구현뿐 아니라 중복되는 블루프린트를 Custom Event로 분리하고, 반복문의 실행 흐름을 정리하는 등 유지보수를 고려한 리팩터링도 함께 진행했다. 프로젝트 규모가 커질수록 이러한 구조적인 정리가 개발 효율에 큰 영향을 준다는 점을 다시 한번 느낄 수 있었다.&lt;/p&gt;</description>
      <category>언리얼 엔진/TIL</category>
      <author>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/36</guid>
      <comments>https://journey46110.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 3 Jul 2026 17:58:54 +0900</pubDate>
    </item>
    <item>
      <title>TIL - 본캠프 5일차</title>
      <link>https://journey46110.tistory.com/35</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;I. Blueprint - FPS 슈팅 게임 개발 세션 (5회차)&lt;/b&gt;&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 FPS 프로젝트에 게임 플레이 요소를 더욱 풍부하게 만들기 위해 회복 아이템과 탄약 아이템을 추가하고, 게임 진행 상태를 관리하는 GameMode와 MainHUD를 구현하였다. 또한 제한 시간과 남은 적 수를 화면에 표시하고, 승리와 패배 조건을 설정하여 게임의 시작부터 종료까지 하나의 흐름으로 완성하였다. 마지막으로 게임 종료 시 플레이어와 적의 동작을 모두 멈추도록 개선하여 보다 자연스러운 게임 종료 화면을 구현하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;구현 과정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 회복 아이템(Healing Potion) 구현&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 151744.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO8thn/dJMcajpaGxU/zo39DBuWK6orvKMCtSThIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO8thn/dJMcajpaGxU/zo39DBuWK6orvKMCtSThIK/img.png&quot; data-alt=&quot;힐링 포션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO8thn/dJMcajpaGxU/zo39DBuWK6orvKMCtSThIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO8thn%2FdJMcajpaGxU%2Fzo39DBuWK6orvKMCtSThIK%2Fimg.png&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;500&quot; height=&quot;314&quot; data-filename=&quot;스크린샷 2026-07-02 151744.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;힐링 포션&lt;/figcaption&gt;
&lt;/figure&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;① Fab에서 빨간색 힐링 포션 메시를 프로젝트에 임포트하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;② Actor를 상속받는 포션 블루프린트를 생성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;③ Static Mesh를 추가하여 포션 메시를 적용하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;④ Sphere Collision을 추가하고 충돌 범위와 메시 위치를 조정하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 151943.png&quot; data-origin-width=&quot;2557&quot; data-origin-height=&quot;1524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2rrT0/dJMcabxYyVJ/hFpTUKrGlvVGeIl9zenVN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2rrT0/dJMcabxYyVJ/hFpTUKrGlvVGeIl9zenVN1/img.png&quot; data-alt=&quot;힐링 포션 디테일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2rrT0/dJMcabxYyVJ/hFpTUKrGlvVGeIl9zenVN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2rrT0%2FdJMcabxYyVJ%2FhFpTUKrGlvVGeIl9zenVN1%2Fimg.png&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;700&quot; height=&quot;417&quot; data-filename=&quot;스크린샷 2026-07-02 151943.png&quot; data-origin-width=&quot;2557&quot; data-origin-height=&quot;1524&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;힐링 포션 디테일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;⑤ BP_Character에 &lt;/span&gt;&lt;span&gt;AddHealth&lt;/span&gt;&lt;span&gt; 함수를 생성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 152026.png&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ncg8p/dJMcaaFVUaV/qg9qyGTVFsN7lNkign20Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ncg8p/dJMcaaFVUaV/qg9qyGTVFsN7lNkign20Jk/img.png&quot; data-alt=&quot;AddHealth 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ncg8p/dJMcaaFVUaV/qg9qyGTVFsN7lNkign20Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNcg8p%2FdJMcaaFVUaV%2Fqg9qyGTVFsN7lNkign20Jk%2Fimg.png&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;700&quot; height=&quot;196&quot; data-filename=&quot;스크린샷 2026-07-02 152026.png&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AddHealth 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Heal Amount를 현재 체력에 더한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Min&lt;/span&gt;&lt;span&gt; 노드를 이용하여 최대 체력을 넘지 않도록 제한한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Health를 갱신한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- Health / MaxHealth&lt;/span&gt;&lt;span&gt; 값을 이용하여 HP Progress Bar를 갱신한다.&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;⑥ 포션 블루프린트에서는 BeginOverlap 발생 시&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 152100.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/df3aMw/dJMcaiw9yLc/6ZgjVqku8xK3kjeEYtsCuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/df3aMw/dJMcaiw9yLc/6ZgjVqku8xK3kjeEYtsCuk/img.png&quot; data-alt=&quot;BeginOverlap 이벤트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/df3aMw/dJMcaiw9yLc/6ZgjVqku8xK3kjeEYtsCuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdf3aMw%2FdJMcaiw9yLc%2F6ZgjVqku8xK3kjeEYtsCuk%2Fimg.png&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;700&quot; height=&quot;189&quot; data-filename=&quot;스크린샷 2026-07-02 152100.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BeginOverlap 이벤트&lt;/figcaption&gt;
&lt;/figure&gt;
&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;- AddHealth&lt;/span&gt;&lt;span&gt;를 호출한다.&lt;/span&gt;&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;- 포션을 제거한다.&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageslideblock alignCenter&quot; data-image=&quot;[{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/vXJl6/dJMcagTDCZK/76H74dszgPfnpjtHWPZzr1/img.png&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/bbx3Z1/dJMcaijBufP/ioOgOFaSofuo3ZX6krb5Qk/img.png&amp;quot;}]&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span class=&quot;image-wrap selected&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vXJl6/dJMcagTDCZK/76H74dszgPfnpjtHWPZzr1/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/vXJl6/dJMcagTDCZK/76H74dszgPfnpjtHWPZzr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vXJl6/dJMcagTDCZK/76H74dszgPfnpjtHWPZzr1/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvXJl6%2FdJMcagTDCZK%2F76H74dszgPfnpjtHWPZzr1%2Fimg.png&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; data-origin-width=&quot;1006&quot; data-origin-height=&quot;129&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbx3Z1/dJMcaijBufP/ioOgOFaSofuo3ZX6krb5Qk/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/bbx3Z1/dJMcaijBufP/ioOgOFaSofuo3ZX6krb5Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbx3Z1/dJMcaijBufP/ioOgOFaSofuo3ZX6krb5Qk/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbx3Z1%2FdJMcaijBufP%2FioOgOFaSofuo3ZX6krb5Qk%2Fimg.png&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; data-origin-width=&quot;1006&quot; data-origin-height=&quot;129&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;button class=&quot;btn btn-prev&quot;&gt;&lt;span class=&quot;ico-prev&quot;&gt;이전&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;btn btn-next&quot;&gt;&lt;span class=&quot;ico-next&quot;&gt;다음&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
  &lt;div class=&quot;mark&quot;&gt;&lt;span data-index=&quot;0&quot;&gt;0&lt;/span&gt;&lt;span data-index=&quot;1&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Health 회복 전/후&lt;/figcaption&gt;
&lt;/figure&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;2) 탄약 아이템 구현&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 152428.png&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UYDAB/dJMcagMU5br/4d4MdHR1LkitpDM4ZLPku1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UYDAB/dJMcagMU5br/4d4MdHR1LkitpDM4ZLPku1/img.png&quot; data-alt=&quot;탄약 아이템&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UYDAB/dJMcagMU5br/4d4MdHR1LkitpDM4ZLPku1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUYDAB%2FdJMcagMU5br%2F4d4MdHR1LkitpDM4ZLPku1%2Fimg.png&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;500&quot; height=&quot;197&quot; data-filename=&quot;스크린샷 2026-07-02 152428.png&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;탄약 아이템&lt;/figcaption&gt;
&lt;/figure&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;① Fab에서 가져온 총알 메시를 사용하여 힐링포션과 비슷하게 탄약 아이템을 제작하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;② BP_Character에 &lt;/span&gt;&lt;span&gt;AddAmmo&lt;/span&gt;&lt;span&gt; 함수를 생성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 152552.png&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/leQVz/dJMcafN06xG/NQyMai61MfRhY7eJeZ8tm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/leQVz/dJMcafN06xG/NQyMai61MfRhY7eJeZ8tm1/img.png&quot; data-alt=&quot;AddAmmo 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/leQVz/dJMcafN06xG/NQyMai61MfRhY7eJeZ8tm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FleQVz%2FdJMcafN06xG%2FNQyMai61MfRhY7eJeZ8tm1%2Fimg.png&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;700&quot; height=&quot;245&quot; data-filename=&quot;스크린샷 2026-07-02 152552.png&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AddAmmo 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 탄약을 증가시킨 뒤 HUD의 탄약 개수를 즉시 갱신하도록 구현하였다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 152631.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck5Qnt/dJMcaaFVUyp/SJhMSVoZIE2WavQi1kUJhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck5Qnt/dJMcaaFVUyp/SJhMSVoZIE2WavQi1kUJhk/img.png&quot; data-alt=&quot;BeginOverlap 이벤트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck5Qnt/dJMcaaFVUyp/SJhMSVoZIE2WavQi1kUJhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck5Qnt%2FdJMcaaFVUyp%2FSJhMSVoZIE2WavQi1kUJhk%2Fimg.png&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;700&quot; height=&quot;194&quot; data-filename=&quot;스크린샷 2026-07-02 152631.png&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BeginOverlap 이벤트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;- AddAmmo&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;- 효과음을 재생한다.&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;- 총알 아이템을 제거한다.&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;span&gt;④ 결과&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageslideblock alignCenter&quot; data-image=&quot;[{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/Kpw6S/dJMcagMU5n8/vlfWLTdyx0Ts0KGrPY7flk/img.png&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/xkUnq/dJMcagMU5n4/KfCh7lJouc533QNNi5WFHK/img.png&amp;quot;}]&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span class=&quot;image-wrap selected&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kpw6S/dJMcagMU5n8/vlfWLTdyx0Ts0KGrPY7flk/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/Kpw6S/dJMcagMU5n8/vlfWLTdyx0Ts0KGrPY7flk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kpw6S/dJMcagMU5n8/vlfWLTdyx0Ts0KGrPY7flk/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKpw6S%2FdJMcagMU5n8%2FvlfWLTdyx0Ts0KGrPY7flk%2Fimg.png&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; data-is-animation=&quot;false&quot; data-origin-height=&quot;148&quot; data-origin-width=&quot;330&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xkUnq/dJMcagMU5n4/KfCh7lJouc533QNNi5WFHK/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/xkUnq/dJMcagMU5n4/KfCh7lJouc533QNNi5WFHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xkUnq/dJMcagMU5n4/KfCh7lJouc533QNNi5WFHK/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxkUnq%2FdJMcagMU5n4%2FKfCh7lJouc533QNNi5WFHK%2Fimg.png&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; data-is-animation=&quot;false&quot; data-origin-height=&quot;148&quot; data-origin-width=&quot;330&quot;/&gt;&lt;/span&gt;&lt;button class=&quot;btn btn-prev&quot;&gt;&lt;span class=&quot;ico-prev&quot;&gt;이전&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;btn btn-next&quot;&gt;&lt;span class=&quot;ico-next&quot;&gt;다음&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
  &lt;div class=&quot;mark&quot;&gt;&lt;span data-index=&quot;0&quot;&gt;0&lt;/span&gt;&lt;span data-index=&quot;1&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;총알 획득 전/후&lt;/figcaption&gt;
&lt;/figure&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;3) 전투 시스템 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 개미 BP에 체력을 저장하는 Health 변수를 생성하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eCoobZ/dJMcacwVQ75/qQXQlHSGEo1Nue8VZWniM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eCoobZ/dJMcacwVQ75/qQXQlHSGEo1Nue8VZWniM1/img.png&quot; data-alt=&quot;개미 Health 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eCoobZ/dJMcacwVQ75/qQXQlHSGEo1Nue8VZWniM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeCoobZ%2FdJMcacwVQ75%2FqQXQlHSGEo1Nue8VZWniM1%2Fimg.png&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;200&quot; height=&quot;235&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개미 Health 설정&lt;/figcaption&gt;
&lt;/figure&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;② 플레이어의 Fire 함수에서 Line Trace가 적을 맞추면 Apply Damage 노드를 호출하도록 구현하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEhEAR/dJMcadvJlYg/N6xWScaxzTsfU8hPngO9vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEhEAR/dJMcadvJlYg/N6xWScaxzTsfU8hPngO9vk/img.png&quot; data-alt=&quot;Break Hit Result의 Hit Actor 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEhEAR/dJMcadvJlYg/N6xWScaxzTsfU8hPngO9vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEhEAR%2FdJMcadvJlYg%2FN6xWScaxzTsfU8hPngO9vk%2Fimg.png&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;700&quot; height=&quot;667&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Break Hit Result의 Hit Actor 사용&lt;/figcaption&gt;
&lt;/figure&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;③ 개미 BP에서는 Event AnyDamage를 이용하여 전달받은 데미지만큼 체력을 감소시켰다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qdvGn/dJMcaglK29p/MHERm5TGrakXuQfuT421Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qdvGn/dJMcaglK29p/MHERm5TGrakXuQfuT421Y0/img.png&quot; data-alt=&quot;데미지 받을 시 Health 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qdvGn/dJMcaglK29p/MHERm5TGrakXuQfuT421Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqdvGn%2FdJMcaglK29p%2FMHERm5TGrakXuQfuT421Y0%2Fimg.png&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;700&quot; height=&quot;341&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데미지 받을 시 Health 변경&lt;/figcaption&gt;
&lt;/figure&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;④ Health가 0 이하가 되면 적이 제거(Destroy)되도록 구현하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wgS30/dJMcahkK4Py/6kUUd4FLOapRJ1tEVCZ1U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wgS30/dJMcahkK4Py/6kUUd4FLOapRJ1tEVCZ1U0/img.png&quot; data-alt=&quot;Destroy 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wgS30/dJMcahkK4Py/6kUUd4FLOapRJ1tEVCZ1U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwgS30%2FdJMcahkK4Py%2F6kUUd4FLOapRJ1tEVCZ1U0%2Fimg.png&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;700&quot; height=&quot;213&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Destroy 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Beginoverlap(ExplosionSphere) 이벤트 뒤에서 적 제거와 관련된 로직을 하나의 Destroy 함수로 분리하여 재사용할 수 있도록 구성하였다.&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;4) 개미 Animation Blueprint 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 개미의 Animation Blueprint를 생성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 개미 Skeletal Mesh의 Anim Class에 생성한 Animation Blueprint를 적용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ Blend Space를 새롭게 생성하여 이동 속도에 따라 애니메이션이 자연스럽게 변경되도록 구성하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 170835.png&quot; data-origin-width=&quot;2557&quot; data-origin-height=&quot;1381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xm3PL/dJMcahStflr/DGob6XtHevkjgQC06xXcrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xm3PL/dJMcahStflr/DGob6XtHevkjgQC06xXcrK/img.png&quot; data-alt=&quot;블렌드스페이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xm3PL/dJMcahStflr/DGob6XtHevkjgQC06xXcrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXm3PL%2FdJMcahStflr%2FDGob6XtHevkjgQC06xXcrK%2Fimg.png&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;500&quot; height=&quot;270&quot; data-filename=&quot;스크린샷 2026-07-02 170835.png&quot; data-origin-width=&quot;2557&quot; data-origin-height=&quot;1381&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;블렌드스페이스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Idle, Walk, Run 세 가지 애니메이션 시퀀스를 배치하였다.&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;④ Blend Space의 가로 축 이름을 &lt;b&gt;Speed&lt;/b&gt;로 설정하고 최대값은 &lt;b&gt;600&lt;/b&gt;으로 지정하고, Grid Snap을 이용하여 각 애니메이션이 적절한 속도 구간에서 재생되도록 배치하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑤ Anim Graph에서 BS_Ant를 Output Pose에 연결하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 171250.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RBbeh/dJMcadCto82/0wUKZ5dLDKYAMMA9KUlhc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RBbeh/dJMcadCto82/0wUKZ5dLDKYAMMA9KUlhc0/img.png&quot; data-alt=&quot;AnimGraph&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RBbeh/dJMcadCto82/0wUKZ5dLDKYAMMA9KUlhc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRBbeh%2FdJMcadCto82%2F0wUKZ5dLDKYAMMA9KUlhc0%2Fimg.png&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;500&quot; height=&quot;239&quot; data-filename=&quot;스크린샷 2026-07-02 171250.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AnimGraph&lt;/figcaption&gt;
&lt;/figure&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;⑥ Event Graph에서는 기존 플레이어 Animation Blueprint와 동일한 방식으로 현재 이동 속도를 계산하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xTXUt/dJMcaccBNpv/RN6FFL0ndkbDmpm7UKtlwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xTXUt/dJMcaccBNpv/RN6FFL0ndkbDmpm7UKtlwk/img.png&quot; data-alt=&quot;ABP의 이벤트그래프&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xTXUt/dJMcaccBNpv/RN6FFL0ndkbDmpm7UKtlwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxTXUt%2FdJMcaccBNpv%2FRN6FFL0ndkbDmpm7UKtlwk%2Fimg.png&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;700&quot; height=&quot;246&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ABP의 이벤트그래프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑦ 계산한 Speed 변수를 Blend Space의 Speed 입력값에 연결하였다.&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;5) 개미 AI 랜덤 순찰 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 개미가 일정한 위치만 이동하지 않고 맵을 자유롭게 순찰하도록 MoveRandom Custom Event를 구현하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNHg3x/dJMcajpaLr8/vYZRw0FJiI4PFQ0ZGOoiiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNHg3x/dJMcajpaLr8/vYZRw0FJiI4PFQ0ZGOoiiK/img.png&quot; data-alt=&quot;MoveRandom&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNHg3x/dJMcajpaLr8/vYZRw0FJiI4PFQ0ZGOoiiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNHg3x%2FdJMcajpaLr8%2FvYZRw0FJiI4PFQ0ZGOoiiK%2Fimg.png&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;700&quot; height=&quot;210&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MoveRandom&lt;/figcaption&gt;
&lt;/figure&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;② AI Move To 노드를 사용하여 목적지를 설정하고,&amp;nbsp;Destination에는 Get Random Reachable Point in Radius를 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 이동이 끝난 후에는 Delay 노드를 사용하여 0~3초 사이의 랜덤한 시간만큼 대기하도록 구성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ 대기가 끝나면 MoveRandom을 다시 호출하여 랜덤 이동을 반복하도록 구현하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑤ MoveRandom과 StartChase의 AIMoveTo가 겹치지 않도록, Bool타입의 IsChasing 변수를 생성하여 Branch로 관리한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6) 적 이동 속도 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 평소 이동 속도와 플레이어를 추적할 때의 속도를 float형 변수로 관리한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 153022.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xc9gW/dJMcaiqlLRc/3fQp1aKckKENUf58fEk5Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xc9gW/dJMcaiqlLRc/3fQp1aKckKENUf58fEk5Lk/img.png&quot; data-alt=&quot;기본 속도 / 추적 속도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xc9gW/dJMcaiqlLRc/3fQp1aKckKENUf58fEk5Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXc9gW%2FdJMcaiqlLRc%2F3fQp1aKckKENUf58fEk5Lk%2Fimg.png&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;300&quot; height=&quot;63&quot; data-filename=&quot;스크린샷 2026-07-02 153022.png&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 속도 / 추적 속도&lt;/figcaption&gt;
&lt;/figure&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;② 개미가 평소 이동할 때는 &lt;/span&gt;&lt;span&gt;Max Walk Speed&lt;/span&gt;&lt;span&gt;를 300으로 설정하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bp_Ant의 MoveRandom 커스텀 이벤트 내부에 Set MaxWalkSpeed를 추가하고, BaseSpeed(float,300.0)을 연결했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 153129.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OGj7T/dJMcaftCYQI/SR1nmNc4dKe76d3xNwXR10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OGj7T/dJMcaftCYQI/SR1nmNc4dKe76d3xNwXR10/img.png&quot; data-alt=&quot;Set MaxWalkSpeed 300.0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OGj7T/dJMcaftCYQI/SR1nmNc4dKe76d3xNwXR10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOGj7T%2FdJMcaftCYQI%2FSR1nmNc4dKe76d3xNwXR10%2Fimg.png&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;500&quot; height=&quot;219&quot; data-filename=&quot;스크린샷 2026-07-02 153129.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set MaxWalkSpeed 300.0&lt;/figcaption&gt;
&lt;/figure&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;span&gt;Max Walk Speed&lt;/span&gt;&lt;span&gt;를 600으로 변경하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;StartChase 커스텀 이벤트 내부에 Set MaxWalkSpeed를 추가하고, ChaseSpeed(float,600.0)을 연결했다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 153214.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RW7rW/dJMcaaZ9LFG/dO4qqH0Vw9ERvIiF52mWgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RW7rW/dJMcaaZ9LFG/dO4qqH0Vw9ERvIiF52mWgK/img.png&quot; data-alt=&quot;Set MaxWalkSpeed 600.0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RW7rW/dJMcaaZ9LFG/dO4qqH0Vw9ERvIiF52mWgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRW7rW%2FdJMcaaZ9LFG%2FdO4qqH0Vw9ERvIiF52mWgK%2Fimg.png&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;500&quot; height=&quot;229&quot; data-filename=&quot;스크린샷 2026-07-02 153214.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set MaxWalkSpeed 600.0&lt;/figcaption&gt;
&lt;/figure&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;④ AIMoveTo 비동기 오류 해결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AIMoveTo는 비동기로 작동한다. 기존의 StartChase는 적을 공격했을 때와 적의 탐지 범위에 overlap 됐을 때 작동했다. 만약, 개미를 공격하고 Chase 중일 때, 탐지 범위에 overlap 되면 AIMoveTo가 실패로 간주되어 MoveRandom이 작동되어 늘어난 개미의 이동 속도가 다시 300으로 초기화 되는 버그가 일어난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 153626.png&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccLI6s/dJMcab5QPcM/7qWJMk3dDF1YJe2VbOQGn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccLI6s/dJMcab5QPcM/7qWJMk3dDF1YJe2VbOQGn1/img.png&quot; data-alt=&quot;비동기 오류를 조건문으로 해결 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccLI6s/dJMcab5QPcM/7qWJMk3dDF1YJe2VbOQGn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccLI6s%2FdJMcab5QPcM%2F7qWJMk3dDF1YJe2VbOQGn1%2Fimg.png&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;500&quot; height=&quot;171&quot; data-filename=&quot;스크린샷 2026-07-02 153626.png&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비동기 오류를 조건문으로 해결 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 154037.png&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lPYbB/dJMcajpaHGj/pBvaJ22M8IK6TCWOkn33JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lPYbB/dJMcajpaHGj/pBvaJ22M8IK6TCWOkn33JK/img.png&quot; data-alt=&quot;비동기 오류를 조건문으로 해결 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lPYbB/dJMcajpaHGj/pBvaJ22M8IK6TCWOkn33JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlPYbB%2FdJMcajpaHGj%2FpBvaJ22M8IK6TCWOkn33JK%2Fimg.png&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;500&quot; height=&quot;353&quot; data-filename=&quot;스크린샷 2026-07-02 154037.png&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비동기 오류를 조건문으로 해결 2&lt;/figcaption&gt;
&lt;/figure&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;그렇기에, Chase와 Update Health 부분에 IsChasing이 false일 때만 StartChase 이벤트가 호출되게 변경하여 AIMoveTo 비동기 오류를 해결했다.&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;7) MainHUD 제작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;① 게임 진행을 표시할 MainHUD를 생성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPnjnn/dJMcahLKMRK/Qj1Sk5gEsKGUKwV7sRbNAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPnjnn/dJMcahLKMRK/Qj1Sk5gEsKGUKwV7sRbNAk/img.png&quot; data-alt=&quot;MainHUD&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPnjnn/dJMcahLKMRK/Qj1Sk5gEsKGUKwV7sRbNAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPnjnn%2FdJMcahLKMRK%2FQj1Sk5gEsKGUKwV7sRbNAk%2Fimg.png&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;700&quot; height=&quot;412&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MainHUD&lt;/figcaption&gt;
&lt;/figure&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;② Canvas Panel 위에 &lt;/span&gt;&lt;span&gt;남은 시간,&amp;nbsp;&lt;/span&gt;&lt;span&gt;남은 적 수,&amp;nbsp;&lt;/span&gt;&lt;span&gt;Result, 재시작&lt;/span&gt;&lt;span&gt; 버튼, 종료&lt;/span&gt;&lt;span&gt; 버튼&lt;/span&gt;&lt;span&gt;을 배치하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;③ Result와 버튼들은 처음에는 보이지 않도록 Visibility를 Collapsed로 설정하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 154419.png&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcAkT5/dJMcaiRq9jX/avXVwZyxEVFWZAyF0akbC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcAkT5/dJMcaiRq9jX/avXVwZyxEVFWZAyF0akbC1/img.png&quot; data-alt=&quot;Visibility - Collapsed&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcAkT5/dJMcaiRq9jX/avXVwZyxEVFWZAyF0akbC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcAkT5%2FdJMcaiRq9jX%2FavXVwZyxEVFWZAyF0akbC1%2Fimg.png&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;500&quot; height=&quot;111&quot; data-filename=&quot;스크린샷 2026-07-02 154419.png&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Visibility - Collapsed&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;④ GameMode BeginPlay에서&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 154455.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH9qpx/dJMcabkw3CD/ovkp5zzkikSjxEKjFEbBbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH9qpx/dJMcabkw3CD/ovkp5zzkikSjxEKjFEbBbk/img.png&quot; data-alt=&quot;MainHUD 화면에 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH9qpx/dJMcabkw3CD/ovkp5zzkikSjxEKjFEbBbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH9qpx%2FdJMcabkw3CD%2Fovkp5zzkikSjxEKjFEbBbk%2Fimg.png&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;700&quot; height=&quot;213&quot; data-filename=&quot;스크린샷 2026-07-02 154455.png&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MainHUD 화면에 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Create Widget, &lt;/span&gt;&lt;span&gt;MainHUD 변수 저장, &lt;/span&gt;&lt;span&gt;Add To Viewport &lt;/span&gt;&lt;span&gt;순으로 HUD를 생성하였다.&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;⑤ World Settings에서 새 GameMode를 적용하고 Default Pawn을 BP_Character로 변경하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AD7j2/dJMcaicTUkQ/iYXE72ybbBIXVjhGo5EZ4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AD7j2/dJMcaicTUkQ/iYXE72ybbBIXVjhGo5EZ4k/img.png&quot; data-alt=&quot;오버라이드와 디폴트 폰 클래스 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AD7j2/dJMcaicTUkQ/iYXE72ybbBIXVjhGo5EZ4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAD7j2%2FdJMcaicTUkQ%2FiYXE72ybbBIXVjhGo5EZ4k%2Fimg.png&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;500&quot; height=&quot;586&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;오버라이드와 디폴트 폰 클래스 변경&lt;/figcaption&gt;
&lt;/figure&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;8) 제한 시간 시스템 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;① GameMode에 float 타입 &lt;/span&gt;&lt;span&gt;TimeRemaining&lt;/span&gt;&lt;span&gt; 변수를 생성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;② UpdateRemainingTime&lt;/span&gt;&lt;span&gt; Custom Event를 생성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xMD8O/dJMcaglKYM0/JC1j2ctzGtf4VNRkdTjwH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xMD8O/dJMcaglKYM0/JC1j2ctzGtf4VNRkdTjwH1/img.png&quot; data-alt=&quot;UpdateRemainingTime&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xMD8O/dJMcaglKYM0/JC1j2ctzGtf4VNRkdTjwH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxMD8O%2FdJMcaglKYM0%2FJC1j2ctzGtf4VNRkdTjwH1%2Fimg.png&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;700&quot; height=&quot;292&quot; data-origin-width=&quot;1327&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;UpdateRemainingTime&lt;/figcaption&gt;
&lt;/figure&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;③ Event Tick의 Delta Seconds를 전달하여 시간을 감소시켰다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYA4JM/dJMcabLC195/F0PHkO4udxLR5SmF09v2Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYA4JM/dJMcabLC195/F0PHkO4udxLR5SmF09v2Zk/img.png&quot; data-alt=&quot;Delta Seconds 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYA4JM/dJMcabLC195/F0PHkO4udxLR5SmF09v2Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYA4JM%2FdJMcabLC195%2FF0PHkO4udxLR5SmF09v2Zk%2Fimg.png&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;500&quot; height=&quot;189&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Delta Seconds 사용&lt;/figcaption&gt;
&lt;/figure&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;④ HUD의 Time Text를 계속 갱신하도록 연결하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uBjBz/dJMcajv3tHP/ubzisAZx8igaY3yuKldUI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uBjBz/dJMcajv3tHP/ubzisAZx8igaY3yuKldUI0/img.png&quot; data-alt=&quot;Set Text(MainHUD - Time)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uBjBz/dJMcajv3tHP/ubzisAZx8igaY3yuKldUI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuBjBz%2FdJMcajv3tHP%2FubzisAZx8igaY3yuKldUI0%2Fimg.png&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;300&quot; height=&quot;249&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set Text(MainHUD - Time)&lt;/figcaption&gt;
&lt;/figure&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;⑤ Format Text&lt;/span&gt;&lt;span&gt;를 이용하여 시간을 &lt;/span&gt;&lt;span&gt;분 : 초&lt;/span&gt;&lt;span&gt; 형식으로 출력하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 분 = RemainingTime / 60&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 초 = RemainingTime % 60&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;각각 Floor To Integer를 사용하였다.&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&gt;&lt;figure class=&quot;imageslideblock alignCenter&quot; data-image=&quot;[{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/o4U2R/dJMcajivAvv/uLW2drDK7cEl3YVEwJockk/img.png&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/pVOD8/dJMcadvJhSM/ec2MDO7jkkjq3KfCu5Q1B0/img.png&amp;quot;}]&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span class=&quot;image-wrap selected&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o4U2R/dJMcajivAvv/uLW2drDK7cEl3YVEwJockk/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/o4U2R/dJMcajivAvv/uLW2drDK7cEl3YVEwJockk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o4U2R/dJMcajivAvv/uLW2drDK7cEl3YVEwJockk/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo4U2R%2FdJMcajivAvv%2FuLW2drDK7cEl3YVEwJockk%2Fimg.png&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; data-origin-width=&quot;135&quot; data-origin-height=&quot;73&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pVOD8/dJMcadvJhSM/ec2MDO7jkkjq3KfCu5Q1B0/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/pVOD8/dJMcadvJhSM/ec2MDO7jkkjq3KfCu5Q1B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pVOD8/dJMcadvJhSM/ec2MDO7jkkjq3KfCu5Q1B0/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpVOD8%2FdJMcadvJhSM%2Fec2MDO7jkkjq3KfCu5Q1B0%2Fimg.png&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; data-origin-width=&quot;135&quot; data-origin-height=&quot;73&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;button class=&quot;btn btn-prev&quot;&gt;&lt;span class=&quot;ico-prev&quot;&gt;이전&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;btn btn-next&quot;&gt;&lt;span class=&quot;ico-next&quot;&gt;다음&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
  &lt;div class=&quot;mark&quot;&gt;&lt;span data-index=&quot;0&quot;&gt;0&lt;/span&gt;&lt;span data-index=&quot;1&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;남은 시간 표시&lt;/figcaption&gt;
&lt;/figure&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;9) 시간 초과 시 게임 패배 구현 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;① RemainingTime이 0 이하인지 Branch로 검사하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;② 시간이 모두 소진되면 &lt;/span&gt;&lt;span&gt;시간을 0으로 고정하고,&amp;nbsp;&lt;/span&gt;&lt;span&gt;Result를 &quot;게임 패배&quot;로 변경한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sb40n/dJMcafAqnfF/WK0kT0jxkAwchN2tnLmZGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sb40n/dJMcafAqnfF/WK0kT0jxkAwchN2tnLmZGk/img.png&quot; data-alt=&quot;시간 0 고정 및 게임 패배 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sb40n/dJMcafAqnfF/WK0kT0jxkAwchN2tnLmZGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsb40n%2FdJMcafAqnfF%2FWK0kT0jxkAwchN2tnLmZGk%2Fimg.png&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;700&quot; height=&quot;215&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시간 0 고정 및 게임 패배 출력&lt;/figcaption&gt;
&lt;/figure&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;③ Result와 버튼들의 Visibility를 Visible로 변경한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPS9L6/dJMcagTDEZj/519FcSbnsjskP8d4xmkKMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPS9L6/dJMcagTDEZj/519FcSbnsjskP8d4xmkKMk/img.png&quot; data-alt=&quot;Set Visibility - Visible&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPS9L6/dJMcagTDEZj/519FcSbnsjskP8d4xmkKMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPS9L6%2FdJMcagTDEZj%2F519FcSbnsjskP8d4xmkKMk%2Fimg.png&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;700&quot; height=&quot;214&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set Visibility - Visible&lt;/figcaption&gt;
&lt;/figure&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;span style=&quot;letter-spacing: 0px;&quot;&gt;Input Mode를 UI Only로 변경한다. 그리고, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;마우스 커서를 표시한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-07-02 160730.png&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7wbr/dJMcaijBwxP/4585Vv1BrLHz74ltmcv5i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7wbr/dJMcaijBwxP/4585Vv1BrLHz74ltmcv5i1/img.png&quot; data-alt=&quot;입력 비활성화, UI 활성화, 마우스 커서 활성화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7wbr/dJMcaijBwxP/4585Vv1BrLHz74ltmcv5i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7wbr%2FdJMcaijBwxP%2F4585Vv1BrLHz74ltmcv5i1%2Fimg.png&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;700&quot; height=&quot;248&quot; data-filename=&quot;스크린샷 2026-07-02 160730.png&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;입력 비활성화, UI 활성화, 마우스 커서 활성화&lt;/figcaption&gt;
&lt;/figure&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;⑤ Tick에서 계속 실행되지 않도록 &lt;/span&gt;&lt;span&gt;Do Once&lt;/span&gt;&lt;span&gt;를 추가하였다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;⑥ 결과&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageslideblock alignCenter&quot; data-image=&quot;[{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/5F0aA/dJMcabLC22E/fSJkoKxwh0JAFPKVIu7Vz1/img.png&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/kLp6Z/dJMcabLC22z/VwgZwffiKIlx6qNUWOMBI1/img.png&amp;quot;}]&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span class=&quot;image-wrap selected&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5F0aA/dJMcabLC22E/fSJkoKxwh0JAFPKVIu7Vz1/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/5F0aA/dJMcabLC22E/fSJkoKxwh0JAFPKVIu7Vz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5F0aA/dJMcabLC22E/fSJkoKxwh0JAFPKVIu7Vz1/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5F0aA%2FdJMcabLC22E%2FfSJkoKxwh0JAFPKVIu7Vz1%2Fimg.png&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; data-origin-width=&quot;2032&quot; data-origin-height=&quot;1318&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLp6Z/dJMcabLC22z/VwgZwffiKIlx6qNUWOMBI1/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/kLp6Z/dJMcabLC22z/VwgZwffiKIlx6qNUWOMBI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLp6Z/dJMcabLC22z/VwgZwffiKIlx6qNUWOMBI1/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLp6Z%2FdJMcabLC22z%2FVwgZwffiKIlx6qNUWOMBI1%2Fimg.png&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; data-origin-width=&quot;2032&quot; data-origin-height=&quot;1318&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;button class=&quot;btn btn-prev&quot;&gt;&lt;span class=&quot;ico-prev&quot;&gt;이전&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;btn btn-next&quot;&gt;&lt;span class=&quot;ico-next&quot;&gt;다음&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
  &lt;div class=&quot;mark&quot;&gt;&lt;span data-index=&quot;0&quot;&gt;0&lt;/span&gt;&lt;span data-index=&quot;1&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;시간 초과로 게임 패배&lt;/figcaption&gt;
&lt;/figure&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;10) 게임 재시작 및 종료 버튼 구현&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lb7GM/dJMcag0kCf6/ZKTWrqrZkdY6bAij4WrpYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lb7GM/dJMcag0kCf6/ZKTWrqrZkdY6bAij4WrpYk/img.png&quot; data-alt=&quot;게임 재시작 / 종료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lb7GM/dJMcag0kCf6/ZKTWrqrZkdY6bAij4WrpYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLb7GM%2FdJMcag0kCf6%2FZKTWrqrZkdY6bAij4WrpYk%2Fimg.png&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;700&quot; height=&quot;399&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;게임 재시작 / 종료&lt;/figcaption&gt;
&lt;/figure&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;① Restart 버튼의 OnClicked 이벤트에서 Open Level을 호출하도록 설정하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;재시작 시에는 Input Mode를 다시 UI Only에서 Game Only로 바꾼다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;② Quit 버튼의 OnClicked 이벤트에서 Quit Game을 호출하도록 설정하였다.&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;span&gt;11) 남은 적 수 관리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y22Gh/dJMcacKvYx1/KYkzWy9Y8J4kK0uwWfxOgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y22Gh/dJMcacKvYx1/KYkzWy9Y8J4kK0uwWfxOgK/img.png&quot; data-alt=&quot;남은 개미의 수를 배열에 저장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y22Gh/dJMcacKvYx1/KYkzWy9Y8J4kK0uwWfxOgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy22Gh%2FdJMcacKvYx1%2FKYkzWy9Y8J4kK0uwWfxOgK%2Fimg.png&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;700&quot; height=&quot;205&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;남은 개미의 수를 배열에 저장&lt;/figcaption&gt;
&lt;/figure&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;① GameMode BeginPlay에서 &lt;/span&gt;&lt;span&gt;Get All Actors Of Class(BP_Ant)&lt;/span&gt;&lt;span&gt;를 이용하여 모든 개미를 가져왔다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;② For Each Loop를 이용하여 Ant 배열에 저장하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;③ 배열의 Length를 Integer 타입의 RemainingAnts 변수에 저장하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;④ HUD의 남은 적 수를 RemainingAnts 값으로 표시하였다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;12) 적 처치 이벤트 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;① GameMode에 &lt;/span&gt;&lt;span&gt;OnAntKilled&lt;/span&gt;&lt;span&gt; Custom Event를 생성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi6ACb/dJMcaa6Zz57/s2Qq8kEzKnpB5GJZDJfKuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi6ACb/dJMcaa6Zz57/s2Qq8kEzKnpB5GJZDJfKuK/img.png&quot; data-alt=&quot;OnAntKilled&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi6ACb/dJMcaa6Zz57/s2Qq8kEzKnpB5GJZDJfKuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi6ACb%2FdJMcaa6Zz57%2Fs2Qq8kEzKnpB5GJZDJfKuK%2Fimg.png&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;700&quot; height=&quot;231&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OnAntKilled&lt;/figcaption&gt;
&lt;/figure&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;span style=&quot;letter-spacing: 0px;&quot;&gt;RemainingAnts를 1 감소시키고, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;HUD를 갱신한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;③ RemainingAnts가 0 이하가 되면 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;IsWin을 True로 변경하고, 게임 승리 HUD가 표시된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;span&gt;④ BP_Ant의 BeginPlay에서 GameMode를 캐스팅하여 변수로 저장하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUmsqZ/dJMcabdDzdT/w70GwDDKQSqakkswjCIVg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUmsqZ/dJMcabdDzdT/w70GwDDKQSqakkswjCIVg0/img.png&quot; data-alt=&quot;GameMode 변수 저장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUmsqZ/dJMcabdDzdT/w70GwDDKQSqakkswjCIVg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUmsqZ%2FdJMcabdDzdT%2Fw70GwDDKQSqakkswjCIVg0%2Fimg.png&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;500&quot; height=&quot;244&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GameMode 변수 저장&lt;/figcaption&gt;
&lt;/figure&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;span&gt;OnAntKilled&lt;/span&gt;&lt;span&gt;를 호출하도록 Destroy 함수 내부에서 호출하고 연결하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/02P6c/dJMcaaMDRQI/BKXAFQkVojNuqBKPW3PiOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/02P6c/dJMcaaMDRQI/BKXAFQkVojNuqBKPW3PiOK/img.png&quot; data-alt=&quot;Destroy 함수 내부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/02P6c/dJMcaaMDRQI/BKXAFQkVojNuqBKPW3PiOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F02P6c%2FdJMcaaMDRQI%2FBKXAFQkVojNuqBKPW3PiOK%2Fimg.png&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;700&quot; height=&quot;198&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Destroy 함수 내부&lt;/figcaption&gt;
&lt;/figure&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&gt;&lt;figure class=&quot;imageslideblock alignCenter&quot; data-image=&quot;[{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/qQuld/dJMcagTDGaN/QlPPl8872JxpsVjLYKqjN0/img.png&amp;quot;},{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/nZLd5/dJMcagTDGat/pKQCmyacv3z67W95BnQTH0/img.png&amp;quot;}]&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span class=&quot;image-wrap selected&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQuld/dJMcagTDGaN/QlPPl8872JxpsVjLYKqjN0/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/qQuld/dJMcagTDGaN/QlPPl8872JxpsVjLYKqjN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQuld/dJMcagTDGaN/QlPPl8872JxpsVjLYKqjN0/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQuld%2FdJMcagTDGaN%2FQlPPl8872JxpsVjLYKqjN0%2Fimg.png&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; data-origin-width=&quot;2032&quot; data-origin-height=&quot;1324&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;span class=&quot;image-wrap &quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nZLd5/dJMcagTDGat/pKQCmyacv3z67W95BnQTH0/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/nZLd5/dJMcagTDGat/pKQCmyacv3z67W95BnQTH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nZLd5/dJMcagTDGat/pKQCmyacv3z67W95BnQTH0/img.png&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnZLd5%2FdJMcagTDGat%2FpKQCmyacv3z67W95BnQTH0%2Fimg.png&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; data-origin-width=&quot;2032&quot; data-origin-height=&quot;1324&quot; data-is-animation=&quot;false&quot;/&gt;&lt;/span&gt;&lt;button class=&quot;btn btn-prev&quot;&gt;&lt;span class=&quot;ico-prev&quot;&gt;이전&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;btn btn-next&quot;&gt;&lt;span class=&quot;ico-next&quot;&gt;다음&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
  &lt;div class=&quot;mark&quot;&gt;&lt;span data-index=&quot;0&quot;&gt;0&lt;/span&gt;&lt;span data-index=&quot;1&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;몬스터 처치 전 / 후&lt;/figcaption&gt;
&lt;/figure&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;13) 게임 종료 시 플레이어와 적 제어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;① 게임 종료 시 플레이어의 &lt;/span&gt;&lt;span&gt;IsFiring&lt;/span&gt;&lt;span&gt;을 False로 변경하여 사격을 중지하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE4wrY/dJMcaiX7NUp/MKJzchvGeRwLnKtZwU9e6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE4wrY/dJMcaiX7NUp/MKJzchvGeRwLnKtZwU9e6k/img.png&quot; data-alt=&quot;Set IsFiring flase&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE4wrY/dJMcaiX7NUp/MKJzchvGeRwLnKtZwU9e6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE4wrY%2FdJMcaiX7NUp%2FMKJzchvGeRwLnKtZwU9e6k%2Fimg.png&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;500&quot; height=&quot;272&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set IsFiring flase&lt;/figcaption&gt;
&lt;/figure&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;② BP_Ant에 &lt;/span&gt;&lt;span&gt;CanMove&lt;/span&gt;&lt;span&gt; 변수를 추가하고, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Move Random과 Start Chase에서 CanMove를 검사하도록 수정하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;211&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nenxe/dJMcabY8a0a/aLN5kyHn64k4SLMPkin7Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nenxe/dJMcabY8a0a/aLN5kyHn64k4SLMPkin7Y1/img.png&quot; data-alt=&quot;true이면 동작 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nenxe/dJMcabY8a0a/aLN5kyHn64k4SLMPkin7Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnenxe%2FdJMcabY8a0a%2FaLN5kyHn64k4SLMPkin7Y1%2Fimg.png&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;200&quot; height=&quot;137&quot; data-origin-width=&quot;211&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;true이면 동작 가능&lt;/figcaption&gt;
&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCwVbC/dJMcadoZzld/9vfz9sqpshX5uKSPvUB1lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCwVbC/dJMcadoZzld/9vfz9sqpshX5uKSPvUB1lk/img.png&quot; data-alt=&quot;개미 움직임 제어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCwVbC/dJMcadoZzld/9vfz9sqpshX5uKSPvUB1lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCwVbC%2FdJMcadoZzld%2F9vfz9sqpshX5uKSPvUB1lk%2Fimg.png&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;700&quot; height=&quot;170&quot; data-origin-width=&quot;1332&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개미 움직임 제어&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Ant 배열을 For Each Loop로 순회하고, &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;모든 개미의 CanMove를 False로 변경한다. 그 후, 개미&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;의 Movement Mode를 None으로 변경하여 이동을 완전히 중지시켰다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; &lt;span&gt;Completed 핀을 사용하여 &lt;/span&gt;&lt;span&gt;게임 종료 UI가 한 번만 실행되도록 수정하였다.&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;14) 체력이 모두 소진되었을 때 게임 패배 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;① Update Health and HUD에서 Health가 0 이하인지 검사하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AeyIF/dJMb99UtTmo/Bw9IlCeLdDvEi7Bhzb0oBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AeyIF/dJMb99UtTmo/Bw9IlCeLdDvEi7Bhzb0oBK/img.png&quot; data-alt=&quot;Health 조건 검사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AeyIF/dJMb99UtTmo/Bw9IlCeLdDvEi7Bhzb0oBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAeyIF%2FdJMb99UtTmo%2FBw9IlCeLdDvEi7Bhzb0oBK%2Fimg.png&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;500&quot; height=&quot;287&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Health 조건 검사&lt;/figcaption&gt;
&lt;/figure&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;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;② Health가 0 이하가 되면 &lt;/span&gt;&lt;span&gt;OnHealthDepleted&lt;/span&gt;&lt;span&gt;를 호출하도록 연결하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;③ OnHealthDepleted는 다른 게임 종료 방식과 구성이 같다.&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;gt; 승리/혹은 패배 문구 출력 -&amp;gt; For Each Loop로 적 움직임 제어 -&amp;gt; HUD Visible -&amp;gt; IsFiring false로 변경, Disable Input -&amp;gt; Set Input Mode UI Only -&amp;gt; 마우스 커서 보임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;453&quot; data-start=&quot;260&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 아이템 시스템부터 GameMode를 이용한 게임 진행 관리, 승리 및 패배 조건, UI 제어까지 게임의 전체 흐름을 구현하는 방법을 학습하였다. 특히, GameMode가 게임 전체의 상태를 관리하는 중심 역할을 한다는 점을 이해할 수 있었으며, 플레이어와 적, HUD가 서로 연결되어 하나의 게임 시스템을 구성하는 과정을 경험할 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;453&quot; data-start=&quot;260&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;629&quot; data-start=&quot;458&quot; data-ke-size=&quot;size16&quot;&gt;이전까지는 총 발사, AI, HUD 등 각각의 기능을 개별적으로 구현하는 데 집중했다면, 오늘은 이러한 기능들을 하나로 연결하여 실제 게임처럼 동작하는 구조를 만드는 과정을 경험할 수 있었다. 기능 간의 연결 관계를 이해하면서 게임을 구성하는 전체적인 흐름을 조금 더 넓은 시각에서 바라볼 수 있게 되었다.&lt;/p&gt;
&lt;p data-end=&quot;629&quot; data-start=&quot;458&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;881&quot; data-start=&quot;634&quot; data-ke-size=&quot;size16&quot;&gt;또한, 게임 종료 시 Do Once를 사용하여 이벤트의 중복 실행을 방지하고, IsFiring, CanMove, Movement Mode를 활용해 플레이어와 적의 행동을 모두 멈추도록 구현하면서 게임의 완성도를 높일 수 있었다. 이번 실습을 통해 단순히 기능을 구현하는 것을 넘어 게임의 시작부터 종료까지 전체 흐름을 설계하는 방법을 익힐 수 있었고, 이후 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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;II. C언어 세션 (5회차)&lt;/b&gt;&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;269&quot; data-start=&quot;212&quot; data-ke-size=&quot;size16&quot;&gt;오늘 학습은 C언어의 두 핵심 축인 &lt;b&gt;함수 호출 방식과 포인터의 동작 원리&lt;/b&gt;를 중심으로 진행되었다.&lt;/p&gt;
&lt;p data-end=&quot;308&quot; data-start=&quot;271&quot; data-ke-size=&quot;size16&quot;&gt;단순히 &amp;ldquo;포인터 문법&amp;rdquo;이나 &amp;ldquo;함수 사용법&amp;rdquo;을 익히는 단계가 아니라,&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;amp; 같은 기호가 왜 헷갈리는지&lt;/p&gt;
&lt;p data-end=&quot;453&quot; data-start=&quot;401&quot; data-ke-size=&quot;size16&quot;&gt;이러한 문제들의 &lt;b&gt;근본 원인(메모리 구조 + 값 전달 방식)&lt;/b&gt;을 기준으로 다시 정리했다.&lt;/p&gt;
&lt;p data-end=&quot;453&quot; data-start=&quot;401&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;학습 내용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 함수에서 값이 안 바뀌는 이유 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;518&quot; data-start=&quot;493&quot; data-ke-size=&quot;size16&quot;&gt;함수에 넣으면 그냥 원본이 들어간다고 착각하기 쉽지만, 실제로는 그냥 복사본이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;void func(int x) {
    x = 100;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;624&quot; data-start=&quot;591&quot; data-ke-size=&quot;size16&quot;&gt;이 코드는 겉으로 보면 x를 바꾸는 것 같지만 실제로는 main의 변수와는 다른 &amp;ldquo;복사된 x&amp;rdquo;를 수정한다.&lt;/p&gt;
&lt;p data-end=&quot;698&quot; data-start=&quot;659&quot; data-ke-size=&quot;size16&quot;&gt;즉, C는 기본적으로 &lt;b&gt;값 전달(call by value)&lt;/b&gt; 구조다. 그래서 원본을 바꾸려면 *를 써야 한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;void func(int *x) {
    *x = 100;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;800&quot; data-start=&quot;761&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) return의 진짜 역할 (값 반환 + 함수 종료) &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;873&quot; data-start=&quot;845&quot; data-ke-size=&quot;size16&quot;&gt;return은 단순히 값을 돌려주는 게 아니라 함수 즉시 종료, 이후 코드 실행 차단 두 가지 역할을 한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;if (x &amp;lt; 0) return -1;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;977&quot; data-start=&quot;933&quot; data-ke-size=&quot;size16&quot;&gt;이 구조가 가능한 이유는 return이 흐름 종료 장치이기 때문이다.&lt;/p&gt;
&lt;p data-end=&quot;977&quot; data-start=&quot;933&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;977&quot; data-start=&quot;933&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 포인터&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int x = 10;
int *p = &amp;amp;x;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x &amp;rarr; 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;amp;x &amp;rarr; 주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p &amp;rarr; 주소 저장 변수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*p &amp;rarr; 그 주소에 있는 값&lt;/p&gt;
&lt;p data-end=&quot;1188&quot; data-start=&quot;1158&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1188&quot; data-start=&quot;1158&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) &amp;amp; 와 *의 역할이 헷갈리는 이유 &lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1241&quot; data-start=&quot;1223&quot; data-ke-size=&quot;size16&quot;&gt;이게 제일 헷갈리는 부분이다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1345&quot; data-start=&quot;1243&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1345&quot; data-start=&quot;1283&quot;&gt;
&lt;tr data-end=&quot;1304&quot; data-start=&quot;1283&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1287&quot; data-start=&quot;1283&quot;&gt;&amp;amp;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1294&quot; data-start=&quot;1287&quot;&gt;변수 앞&lt;/td&gt;
&lt;td data-end=&quot;1304&quot; data-start=&quot;1294&quot; data-col-size=&quot;sm&quot;&gt;주소 꺼내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1324&quot; data-start=&quot;1305&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1309&quot; data-start=&quot;1305&quot;&gt;*&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1314&quot; data-start=&quot;1309&quot;&gt;선언&lt;/td&gt;
&lt;td data-end=&quot;1324&quot; data-start=&quot;1314&quot; data-col-size=&quot;sm&quot;&gt;포인터 선언&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1345&quot; data-start=&quot;1325&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1329&quot; data-start=&quot;1325&quot;&gt;*&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1334&quot; data-start=&quot;1329&quot;&gt;사용&lt;/td&gt;
&lt;td data-end=&quot;1345&quot; data-start=&quot;1334&quot; data-col-size=&quot;sm&quot;&gt;주소 따라가기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;int *p = &amp;amp;x;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1382&quot; data-start=&quot;1370&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*p = &amp;amp;x (잘못된 해석)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p = &amp;amp;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;&lt;b&gt;5) 배열과 포인터의 관계 &lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int arr[5];
int *p = arr;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1631&quot; data-start=&quot;1523&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;배열&lt;/td&gt;
&lt;td&gt;포인터&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1595&quot; data-start=&quot;1566&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1571&quot; data-start=&quot;1566&quot;&gt;크기&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1582&quot; data-start=&quot;1571&quot;&gt;전체 크기 존재&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1595&quot; data-start=&quot;1582&quot;&gt;주소 크기만 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1613&quot; data-start=&quot;1596&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1601&quot; data-start=&quot;1596&quot;&gt;대입&lt;/td&gt;
&lt;td data-end=&quot;1607&quot; data-start=&quot;1601&quot; data-col-size=&quot;sm&quot;&gt;불가능&lt;/td&gt;
&lt;td data-end=&quot;1613&quot; data-start=&quot;1607&quot; data-col-size=&quot;sm&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1631&quot; data-start=&quot;1614&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1619&quot; data-start=&quot;1614&quot;&gt;이동&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1625&quot; data-start=&quot;1619&quot;&gt;불가능&lt;/td&gt;
&lt;td data-end=&quot;1631&quot; data-start=&quot;1625&quot; data-col-size=&quot;sm&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1782999281409&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sizeof(arr);   // 전체 크기, 20
sizeof(p);     // 포인터 크기, 8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1675&quot; data-start=&quot;1633&quot; data-ke-size=&quot;size16&quot;&gt;둘은 확실히 차이난다. 배열은 고정된 메모리 공간이고, 포인터는 이동 가능한 주소 변수이다.&lt;/p&gt;
&lt;p data-end=&quot;1675&quot; data-start=&quot;1633&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1675&quot; data-start=&quot;1633&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6) 함수에 배열을 넘기면 크기가 사라진다 &lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;void func(int arr[])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1755&quot; data-start=&quot;1743&quot; data-ke-size=&quot;size16&quot;&gt;이건 사실 내부적으로 아래처럼 바뀐다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;void func(int *arr)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1793&quot; data-start=&quot;1787&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1805&quot; data-start=&quot;1795&quot; data-ke-size=&quot;size16&quot;&gt;즉, 함수 안에서는 배열의 크기를 알 수 없고, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;항상 size를 따로 넘겨야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-end=&quot;1805&quot; data-start=&quot;1795&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1805&quot; data-start=&quot;1795&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7) 포인터 연산은 바이트 이동이 아니다&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;p + 1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1909&quot; data-start=&quot;1895&quot; data-ke-size=&quot;size16&quot;&gt;이건 단순 +1이 아니라 타입 크기만큼 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int &amp;rarr; 4바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;double &amp;rarr; 8바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;char &amp;rarr; 1바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1994&quot; data-start=&quot;1969&quot; data-ke-size=&quot;size16&quot;&gt;포인터는 타입 기반 주소 이동 시스템이다.&lt;/p&gt;
&lt;p data-end=&quot;1994&quot; data-start=&quot;1969&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1994&quot; data-start=&quot;1969&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8) NULL로 초기화&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;int *p;
*p = 10; // 위험&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2060&quot; data-start=&quot;2057&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기화 안 된 포인터는 쓰레기 주소이고, 접근하면 undefined behavior를 일으킨다.&lt;/p&gt;
&lt;p data-end=&quot;2118&quot; data-start=&quot;2111&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2118&quot; data-start=&quot;2111&quot; data-ke-size=&quot;size16&quot;&gt;안전하게 쓸려 이렇게 NULL로 초기화해줘야 한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;int *p = NULL;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2179&quot; data-start=&quot;2145&quot; data-ke-size=&quot;size16&quot;&gt;포인터는 반드시 어디를 가리키는지 확실해야 사용 가능하다.&lt;/p&gt;
&lt;p data-end=&quot;2179&quot; data-start=&quot;2145&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2179&quot; data-start=&quot;2145&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9) 지역 변수와 생명주기 문제&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;int* func() {
    int x = 10;
    return &amp;amp;x;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2277&quot; data-start=&quot;2267&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x는 함수 끝나면 사라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소만 남음 (댕글링 포인터)&lt;/p&gt;
&lt;p data-end=&quot;2339&quot; data-start=&quot;2315&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2339&quot; data-start=&quot;2315&quot; data-ke-size=&quot;size16&quot;&gt;주소는 남아도 값은 사라질 수 있다&lt;/p&gt;
&lt;p data-end=&quot;2339&quot; data-start=&quot;2315&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2339&quot; data-start=&quot;2315&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;10) 포인터의 포인터 (**)를 쓰는 이유&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;int **pp;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2417&quot; data-start=&quot;2396&quot; data-ke-size=&quot;size16&quot;&gt;이건 단순 확장이 아니라 포인터 자체를 바꾸고 싶을 때 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &amp;rarr; 값 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** &amp;rarr; 주소 자체 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;후기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2744&quot; data-start=&quot;2726&quot; data-ke-size=&quot;size16&quot;&gt;오늘 내용은 새로운 개념이라기보다는, 이미 알고 있던 것들을 다시 한 번 &amp;ldquo;왜 그렇게 동작하는지&amp;rdquo; 기준으로 정리한 느낌이었다. 특히, 함수 호출과 포인터 전달 구조는 이미 알고 있었지만, 값 전달 vs 주소 전달이 실제로 코드에서 어떻게 구분되는지 다시 보면서 정리가 됐다.&lt;/p&gt;
&lt;p data-end=&quot;2744&quot; data-start=&quot;2726&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;361&quot; data-start=&quot;346&quot; data-ke-size=&quot;size16&quot;&gt;그리고 포인터 자체보다는 *가 선언과 역참조에서 의미가 달라지는 지점, 배열이 포인터로 decay되는 순간의 차이, 함수 매개변수에서 타입 정보가 사라지는 구조 등 이런 언어가 설계된 방식 쪽이 다시 정리된 게 핵심이었다. 결국, 오늘은 새로 배웠다기보다는&lt;br /&gt;흩어져 있던 C의 메모리 모델을 다시 한 번 구조로 묶어본 날이었다.&lt;/p&gt;</description>
      <category>언리얼 엔진/TIL</category>
      <author>journey46110</author>
      <guid isPermaLink="true">https://journey46110.tistory.com/35</guid>
      <comments>https://journey46110.tistory.com/35#entry35comment</comments>
      <pubDate>Thu, 2 Jul 2026 22:39:21 +0900</pubDate>
    </item>
  </channel>
</rss>