<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>꽈이의 게임개발</title>
    <link>https://younggwan.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 11 Jul 2026 12:08:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>꽈이렁</managingEditor>
    <image>
      <title>꽈이의 게임개발</title>
      <url>https://tistory1.daumcdn.net/tistory/3014128/attach/78be6a35ceab4678be6afabb8640fbcc</url>
      <link>https://younggwan.tistory.com</link>
    </image>
    <item>
      <title>Atomic</title>
      <link>https://younggwan.tistory.com/61</link>
      <description>&lt;h3 data-end=&quot;15&quot; data-start=&quot;0&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Atomic이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;200&quot; data-start=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;Atomic은 &lt;b&gt;멀티스레드 환경에서 데이터를 안전하게 관리할 수 있도록 보장하는 기능&lt;/b&gt;이다.&lt;br /&gt;일반적인 변수는 여러 스레드에서 동시에 접근하면 데이터 경쟁(Race Condition)이 발생할 수 있지만,&lt;br /&gt;Atomic 변수는 원자적 연산(Atomic Operation)을 통해 이러한 문제를 방지한다.&lt;/p&gt;
&lt;h3 data-end=&quot;218&quot; data-start=&quot;202&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Atomic의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;457&quot; data-start=&quot;220&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;304&quot; data-start=&quot;220&quot;&gt;&lt;b&gt;원자성(Atomicity)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;304&quot; data-start=&quot;247&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;273&quot; data-start=&quot;247&quot;&gt;연산이 쪼개지지 않고 한 번에 수행된다.&lt;/li&gt;
&lt;li data-end=&quot;304&quot; data-start=&quot;277&quot;&gt;실행 도중 다른 스레드가 개입할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;366&quot; data-start=&quot;306&quot;&gt;&lt;b&gt;데이터 경쟁 방지&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;366&quot; data-start=&quot;328&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;366&quot; data-start=&quot;328&quot;&gt;여러 스레드가 동시에 접근해도 안전하게 값을 변경할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;457&quot; data-start=&quot;368&quot;&gt;&lt;b&gt;잠금 없는 동기화(Lock-free Synchronization)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;457&quot; data-start=&quot;417&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;457&quot; data-start=&quot;417&quot;&gt;일반적인 mutex 같은 락을 사용하지 않아 성능이 향상된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-end=&quot;959&quot; data-start=&quot;944&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Atomic 연산&lt;/b&gt;&lt;/h3&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-end=&quot;1164&quot; data-start=&quot;961&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1164&quot; data-start=&quot;989&quot;&gt;
&lt;tr data-end=&quot;1011&quot; data-start=&quot;989&quot;&gt;
&lt;td&gt;load()&lt;/td&gt;
&lt;td&gt;현재 값 읽기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1033&quot; data-start=&quot;1012&quot;&gt;
&lt;td&gt;store(x)&lt;/td&gt;
&lt;td&gt;값 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1077&quot; data-start=&quot;1034&quot;&gt;
&lt;td&gt;fetch_add(x)&lt;/td&gt;
&lt;td&gt;현재 값에 x를 더하고 이전 값 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1121&quot; data-start=&quot;1078&quot;&gt;
&lt;td&gt;fetch_sub(x)&lt;/td&gt;
&lt;td&gt;현재 값에서 x를 빼고 이전 값 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1164&quot; data-start=&quot;1122&quot;&gt;
&lt;td&gt;exchange(x)&lt;/td&gt;
&lt;td&gt;현재 값을 x로 바꾸고 이전 값 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-end=&quot;1182&quot; data-start=&quot;1166&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Atomic의 활용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1257&quot; data-start=&quot;1184&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1201&quot; data-start=&quot;1184&quot;&gt;&lt;b&gt;멀티스레드 카운터&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1227&quot; data-start=&quot;1202&quot;&gt;&lt;b&gt;로그 시스템&lt;/b&gt; (동시 접근 방지)&lt;/li&gt;
&lt;li data-end=&quot;1257&quot; data-start=&quot;1228&quot;&gt;&lt;b&gt;락 없는 자료구조&lt;/b&gt; (예: 락-프리 큐)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1355&quot; data-start=&quot;1259&quot; data-ke-size=&quot;size16&quot;&gt;Atomic을 사용하면 &lt;b&gt;데이터 경쟁을 방지하면서도 성능을 최적화할 수 있다&lt;/b&gt;.&lt;br /&gt;멀티스레드 프로그래밍에서 꼭 필요한 개념이므로, 상황에 맞게 활용하는 것이 중요하다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;1355&quot; data-start=&quot;1259&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;1355&quot; data-start=&quot;1259&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;1355&quot; data-start=&quot;1259&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1740493922173&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;thread&amp;gt;
#include &amp;lt;atomic&amp;gt;

static atomic&amp;lt;int&amp;gt; tempNum = 0;

void Add()
{
	for (int32 i = 0; i &amp;lt; 100'0000; i++)
	{
		tempNum++;
	}
}


void Sub()
{
	for (int32 i = 0; i &amp;lt; 100'0000; i++)
	{
		tempNum--;
	}
}

int main()
{

	std::thread t1(Add);
	std::thread t2(Add);
	t1.join();
	t2.join();
	cout &amp;lt;&amp;lt; tempNum &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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dz6dx/btsMxrbXZIW/YSqCKewQsAEuxvGBIieiP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dz6dx/btsMxrbXZIW/YSqCKewQsAEuxvGBIieiP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dz6dx/btsMxrbXZIW/YSqCKewQsAEuxvGBIieiP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDz6dx%2FbtsMxrbXZIW%2FYSqCKewQsAEuxvGBIieiP0%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;1115&quot; height=&quot;628&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&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;아토믹을 사용한 tempNum 변수는 정확하게 2000000이라는 값이 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아토믹은 mutex와 같이 LOCK ,UNLOCK 과정이 필요없지만&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mbvGi/btsMvMg8iiW/jFb4Ot4y8vGN2LV8UIdBBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mbvGi/btsMvMg8iiW/jFb4Ot4y8vGN2LV8UIdBBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mbvGi/btsMvMg8iiW/jFb4Ot4y8vGN2LV8UIdBBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmbvGi%2FbtsMvMg8iiW%2FjFb4Ot4y8vGN2LV8UIdBBK%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;1004&quot; height=&quot;197&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;is_trivially_copyable_v&amp;lt;_Ty&amp;gt;&amp;nbsp; 아토믹은 단순 복사가 가능해야하고&lt;/li&gt;
&lt;li&gt;is_copy_constructible_v&amp;lt;_Ty&amp;gt; 복사생성이 가능해야하고&lt;/li&gt;
&lt;li&gt;is_move_constructible_v&amp;lt;_Ty&amp;gt; 이동 생성이 가능해야하고&lt;/li&gt;
&lt;li&gt;&amp;nbsp;is_copy_assignable_v&amp;lt;_Ty&amp;gt; 복사 할당이 가능해야하고&lt;/li&gt;
&lt;li&gt;is_move_assignable_v&amp;lt;_Ty&amp;gt; 이동 할당이 가능해야한다&lt;/li&gt;
&lt;/ul&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;</description>
      <category>게임 프로그래밍/WINDOW SERVER</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/61</guid>
      <comments>https://younggwan.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 25 Feb 2025 23:38:07 +0900</pubDate>
    </item>
    <item>
      <title>쓰레드 thread</title>
      <link>https://younggwan.tistory.com/60</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;전 글에서 프로세스와 쓰레드의 차이점을 정리해보았다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예제 코드를 작성해보자&lt;/p&gt;
&lt;pre id=&quot;code_1740415820370&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;thread&amp;gt;

static int tempNum = 0;

void Add()
{
	for (int i = 0; i &amp;lt; 1000000; i++)
	{
		tempNum++;
	}
}


void Sub()
{
	for (int i = 0; i &amp;lt; 1000000; i++)
	{
		tempNum--;
	}
}

int main()
{
	cout &amp;lt;&amp;lt; tempNum &amp;lt;&amp;lt; endl;

	std::thread t1(Add);
	std::thread t2(Sub);
	t1.join();
	t2.join();
	cout &amp;lt;&amp;lt; tempNum &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;static int tempNum = 0; &lt;br /&gt;//tempNum이라는 전역변수를 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;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;tempNum&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//0으로 초기화된 tempNum 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;std::thread t1(Add); &lt;br /&gt;std::thread t2(Sub);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//tempNum을 백만번 증가시키는 쓰레드를 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//tempNum을 백만번 감소시키는 쓰레드를 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;t1.join(); &lt;br /&gt;t2.join();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//t1 쓰레드가 종료될때까지 대기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//t2 쓰레드가 종료될때까지 대기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cout &amp;lt;&amp;lt; tempNum &amp;lt;&amp;lt; endl&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰레드 실행이 완료된 상태에서 tempNum출력&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;br /&gt;&lt;br /&gt;0으로초기화하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백만번더하면서 백만번을빼니까 정답은 0??&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/erXRBc/btsMuRI9Lvo/uyle9YI5RCkwKMhkvBsa9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/erXRBc/btsMuRI9Lvo/uyle9YI5RCkwKMhkvBsa9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/erXRBc/btsMuRI9Lvo/uyle9YI5RCkwKMhkvBsa9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FerXRBc%2FbtsMuRI9Lvo%2Fuyle9YI5RCkwKMhkvBsa9k%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;1115&quot; height=&quot;628&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 결과값은 0이 나오지않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dr6Ry8/btsMuRPVtXg/gb723eFVhpV1QkwbvPQtHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dr6Ry8/btsMuRPVtXg/gb723eFVhpV1QkwbvPQtHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dr6Ry8/btsMuRPVtXg/gb723eFVhpV1QkwbvPQtHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdr6Ry8%2FbtsMuRPVtXg%2Fgb723eFVhpV1QkwbvPQtHk%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;1115&quot; height=&quot;628&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&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;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqiiNU/btsMvaaG9xk/gPeNvioqJT6mmoy5Q3XRVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqiiNU/btsMvaaG9xk/gPeNvioqJT6mmoy5Q3XRVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqiiNU/btsMvaaG9xk/gPeNvioqJT6mmoy5Q3XRVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqiiNU%2FbtsMvaaG9xk%2FgPeNvioqJT6mmoy5Q3XRVk%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;701&quot; height=&quot;572&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&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;실제로 백만번 1씩 증가시키는 부분의 어셈블리코드는 보면 위와같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;00007FF6EB922515&amp;nbsp;&amp;nbsp;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eax,dword&amp;nbsp;ptr&amp;nbsp;[tempNum&amp;nbsp;(07FF6EB92F440h)]&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//07FF6EB92F440h 의 주소에있는 데이터를 eax로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;00007FF6EB92251B&amp;nbsp;&amp;nbsp;inc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eax&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//eax값을 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;00007FF6EB92251D&amp;nbsp;&amp;nbsp;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dword&amp;nbsp;ptr&amp;nbsp;[tempNum&amp;nbsp;(07FF6EB92F440h)],eax&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//증가된 eax값을 다시 07FF6EB92F440h주소로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 코드를 작성할때에는 한줄로 tempNum++ 한줄로 표현하지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 코드가 돌아갈때에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리에서 -&amp;gt; CPU로 값을 이동하고 -&amp;gt; 연산을 한 후에 -&amp;gt; 다시 CPU로 이동을 하는 행위를한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 다시 쓰레드가 돌아가는 상황을 생각해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tempNum은 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;Add thread&amp;gt; tempNum에 있는 데이터를 CPU a위치로 옮겼다. 옮겨진 값은 0이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sub thread&amp;gt; tempNum에있는 데이터를 CPU b위치로 옮겼다. 옮겨진 값은 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;Add thread&amp;gt; a위치의 값을 +1했다 연산된 값은 +1이다&lt;br /&gt;Sub thread&amp;gt; b위치의 값을 -1했다 연산된 값은 -1이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Add thread&amp;gt; +1된 데이터를 다시 tempNum 메모리 위치로 옮긴다. tempNum은 +1이다&lt;br /&gt;Sub thread&amp;gt; -된 데이터를 다시 tempNum 메모리 위치로 옮긴다. tempNum은 -1이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 스탭은 예시이다 실제로 저렇게 드라마틱하게 한단계씩 실행되지는않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시에서 중요한점은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Add Thread에서 연산된값은 Sub쓰레드에서 연산된 값으로 덮혔다는것이다.&lt;/p&gt;
&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;백만번 더하고 백만번 빼는것같지만 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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음글에서 설명이어서 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>게임 프로그래밍/WINDOW SERVER</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/60</guid>
      <comments>https://younggwan.tistory.com/60#entry60comment</comments>
      <pubDate>Tue, 25 Feb 2025 02:08:25 +0900</pubDate>
    </item>
    <item>
      <title>프로세스? 쓰레드?</title>
      <link>https://younggwan.tistory.com/59</link>
      <description>&lt;p data-end=&quot;142&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트 프로그래머의 서버 공부 시작글입니다.&lt;/p&gt;
&lt;p data-end=&quot;142&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;다시 기초부터 시작합니다..&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h1 data-end=&quot;21&quot; data-start=&quot;0&quot;&gt;C++ 프로세스와 쓰레드의 차이&lt;/h1&gt;
&lt;p data-end=&quot;103&quot; data-start=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;C++에서 프로세스(Process)와 쓰레드(Thread)는 모두 실행 단위를 의미하지만, 동작 방식과 사용 목적이 다릅니다.&lt;/p&gt;
&lt;h2 data-end=&quot;128&quot; data-start=&quot;105&quot; data-ke-size=&quot;size26&quot;&gt;1. 프로세스(Process)란?&lt;/h2&gt;
&lt;p data-end=&quot;170&quot; data-start=&quot;129&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로세스&lt;/b&gt;는 운영체제(OS)에서 실행 중인 프로그램을 의미합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;300&quot; data-start=&quot;171&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;211&quot; data-start=&quot;171&quot;&gt;각각의 프로세스는 &lt;b&gt;독립적인 메모리 공간(주소 공간)을 가짐&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;237&quot; data-start=&quot;212&quot;&gt;다른 프로세스와 메모리를 공유하지 않음&lt;/li&gt;
&lt;li data-end=&quot;300&quot; data-start=&quot;238&quot;&gt;프로세스 간의 통신(IPC, Inter-Process Communication)은 추가적인 작업이 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;316&quot; data-start=&quot;302&quot; data-ke-size=&quot;size23&quot;&gt;프로세스의 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;425&quot; data-start=&quot;317&quot;&gt;독립적인 실행 단위&lt;/li&gt;
&lt;li data-end=&quot;425&quot; data-start=&quot;317&quot;&gt;운영체제가 직접 관리&lt;/li&gt;
&lt;li data-end=&quot;425&quot; data-start=&quot;317&quot;&gt;하나의 프로세스가 종료되어도 다른 프로세스에 영향을 주지 않음&lt;/li&gt;
&lt;li data-end=&quot;425&quot; data-start=&quot;317&quot;&gt;실행 속도가 비교적 느림 (프로세스 간 문맥 전환 비용이 큼)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;448&quot; data-start=&quot;427&quot; data-ke-size=&quot;size26&quot;&gt;2. 쓰레드(Thread)란?&lt;/h2&gt;
&lt;p data-end=&quot;486&quot; data-start=&quot;449&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쓰레드&lt;/b&gt;는 프로세스 내에서 실행되는 작은 실행 단위입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;628&quot; data-start=&quot;487&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;530&quot; data-start=&quot;487&quot;&gt;하나의 프로세스 내에서 여러 개의 쓰레드를 가질 수 있음 (멀티쓰레딩)&lt;/li&gt;
&lt;li data-end=&quot;572&quot; data-start=&quot;531&quot;&gt;&lt;b&gt;같은 프로세스의 메모리를 공유&lt;/b&gt; (데이터 영역, 힙 영역 등)&lt;/li&gt;
&lt;li data-end=&quot;628&quot; data-start=&quot;573&quot;&gt;하지만 각각의 쓰레드는 독립적인 &lt;b&gt;스택(Stack)과 레지스터(Register)를 가짐&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;643&quot; data-start=&quot;630&quot; data-ke-size=&quot;size23&quot;&gt;쓰레드의 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;782&quot; data-start=&quot;644&quot;&gt;같은 프로세스 내에서 동작&lt;/li&gt;
&lt;li data-end=&quot;782&quot; data-start=&quot;644&quot;&gt;메모리 공유로 인해 빠른 데이터 교환 가능&lt;/li&gt;
&lt;li data-end=&quot;782&quot; data-start=&quot;644&quot;&gt;실행 속도가 빠름 (쓰레드 간 문맥 전환 비용이 적음)&lt;/li&gt;
&lt;li data-end=&quot;782&quot; data-start=&quot;644&quot;&gt;하지만 동기화 문제(Race condition, Deadlock 등)가 발생할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;808&quot; data-start=&quot;784&quot; data-ke-size=&quot;size26&quot;&gt;3. 프로세스와 쓰레드의 차이 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교 항목프로세스(Process)쓰레드(Thread)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1204&quot; data-start=&quot;809&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1204&quot; data-start=&quot;899&quot;&gt;
&lt;tr data-end=&quot;938&quot; data-start=&quot;899&quot;&gt;
&lt;td&gt;실행 단위&lt;/td&gt;
&lt;td&gt;독립적인 실행 단위&lt;/td&gt;
&lt;td&gt;프로세스 내부의 실행 단위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;978&quot; data-start=&quot;939&quot;&gt;
&lt;td&gt;메모리 구조&lt;/td&gt;
&lt;td&gt;독립적인 메모리 공간&lt;/td&gt;
&lt;td&gt;프로세스의 메모리 공유&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1033&quot; data-start=&quot;979&quot;&gt;
&lt;td&gt;통신 방식&lt;/td&gt;
&lt;td&gt;프로세스 간 통신(IPC) 필요&lt;/td&gt;
&lt;td&gt;메모리를 공유하여 빠른 데이터 전달 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1080&quot; data-start=&quot;1034&quot;&gt;
&lt;td&gt;실행 속도&lt;/td&gt;
&lt;td&gt;느림 (문맥 전환 비용 큼)&lt;/td&gt;
&lt;td&gt;빠름 (문맥 전환 비용 적음)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1153&quot; data-start=&quot;1081&quot;&gt;
&lt;td&gt;안정성&lt;/td&gt;
&lt;td&gt;하나의 프로세스가 죽어도 다른 프로세스에 영향 없음&lt;/td&gt;
&lt;td&gt;하나의 쓰레드 오류가 프로세스 전체에 영향을 줄 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1204&quot; data-start=&quot;1154&quot;&gt;
&lt;td&gt;활용 예시&lt;/td&gt;
&lt;td&gt;운영체제 프로세스, 대형 애플리케이션&lt;/td&gt;
&lt;td&gt;멀티쓰레딩 서버, 게임 엔진&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-end=&quot;1235&quot; data-start=&quot;1206&quot; data-ke-size=&quot;size26&quot;&gt;4. C++에서 프로세스와 쓰레드 사용 방법&lt;/h2&gt;
&lt;h3 data-end=&quot;1276&quot; data-start=&quot;1237&quot; data-ke-size=&quot;size23&quot;&gt;1) C++에서 프로세스 생성 (fork() - 리눅스)&lt;/h3&gt;
&lt;p data-end=&quot;1320&quot; data-start=&quot;1277&quot; data-ke-size=&quot;size16&quot;&gt;C++에서는 보통 fork()를 사용하여 새로운 프로세스를 생성합니다.&lt;/p&gt;
&lt;p data-end=&quot;1631&quot; data-start=&quot;1561&quot; data-ke-size=&quot;size16&quot;&gt;fork()는 리눅스에서만 사용 가능하며, Windows에서는 CreateProcess()를 사용해야 합니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1675&quot; data-start=&quot;1638&quot; data-ke-size=&quot;size23&quot;&gt;2) C++에서 쓰레드 생성 (std::thread)&lt;/h3&gt;
&lt;p data-end=&quot;1727&quot; data-start=&quot;1676&quot; data-ke-size=&quot;size16&quot;&gt;C++11부터 std::thread를 사용하여 쉽게 멀티쓰레딩을 구현할 수 있습니다.&lt;/p&gt;
&lt;h2 data-end=&quot;1994&quot; data-start=&quot;1958&quot; data-ke-size=&quot;size26&quot;&gt;5. 언제 프로세스를 사용하고, 언제 쓰레드를 사용할까&lt;/h2&gt;
&lt;p data-end=&quot;2015&quot; data-start=&quot;1995&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로세스가 적합한 경우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2100&quot; data-start=&quot;2016&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2040&quot; data-start=&quot;2016&quot;&gt;서로 독립적인 작업을 수행해야 할 때&lt;/li&gt;
&lt;li data-end=&quot;2064&quot; data-start=&quot;2041&quot;&gt;보안적으로 분리된 환경이 필요할 때&lt;/li&gt;
&lt;li data-end=&quot;2100&quot; data-start=&quot;2065&quot;&gt;크롬 브라우저처럼 여러 개의 독립적인 작업이 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2121&quot; data-start=&quot;2102&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;쓰레드가 적합한 경우&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2214&quot; data-start=&quot;2122&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2150&quot; data-start=&quot;2122&quot;&gt;같은 데이터를 여러 작업에서 공유해야 할 때&lt;/li&gt;
&lt;li data-end=&quot;2191&quot; data-start=&quot;2151&quot;&gt;실행 속도가 중요한 멀티태스킹 프로그램 (ex: 게임, 웹 서버)&lt;/li&gt;
&lt;li data-end=&quot;2214&quot; data-start=&quot;2192&quot;&gt;자원을 효율적으로 활용해야 할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2226&quot; data-start=&quot;2216&quot; data-ke-size=&quot;size26&quot;&gt;6. 결론&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2377&quot; data-start=&quot;2227&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2275&quot; data-start=&quot;2227&quot;&gt;&lt;b&gt;프로세스&lt;/b&gt;는 서로 독립적인 실행 단위로 동작하며, 메모리를 공유하지 않음.&lt;/li&gt;
&lt;li data-end=&quot;2334&quot; data-start=&quot;2276&quot;&gt;&lt;b&gt;쓰레드&lt;/b&gt;는 같은 프로세스 내에서 실행되며, 메모리를 공유하여 빠르게 작업을 수행할 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;2377&quot; data-start=&quot;2335&quot;&gt;멀티쓰레딩은 성능을 향상시키지만 &lt;b&gt;동기화 문제&lt;/b&gt;를 신경 써야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2428&quot; data-start=&quot;2379&quot; data-ke-size=&quot;size16&quot;&gt;따라서, 프로그램의 특성과 요구사항에 따라 적절한 방식을 선택하는 것이 중요합니다.&lt;/p&gt;</description>
      <category>게임 프로그래밍/WINDOW SERVER</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/59</guid>
      <comments>https://younggwan.tistory.com/59#entry59comment</comments>
      <pubDate>Tue, 25 Feb 2025 01:45:28 +0900</pubDate>
    </item>
    <item>
      <title>C++ goto (고투)</title>
      <link>https://younggwan.tistory.com/58</link>
      <description>&lt;p&gt;&lt;b&gt;MSDN 설명&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-ttu-id=&quot;1a3a8-106&quot;&gt;식별자에 의해 지정된 레이블 문은 현재 함수에 있어야 합니다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-ttu-id=&quot;1a3a8-107&quot;&gt;모든&lt;span&gt;&amp;nbsp;식별자&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이름은 내부 네임스페이스의 멤버이므로 다른 식별자를 방해하지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-ttu-id=&quot;1a3a8-108&quot;&gt;문 레이블은에 의미가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;goto&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문과 그렇지 않은 경우 문 레이블은 무시 됩니다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-ttu-id=&quot;1a3a8-109&quot;&gt;레이블을 다시 선언할 수 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-ttu-id=&quot;1a3a8-110&quot;&gt;&lt;b&gt;goto&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;해당 위치에 대 한 범위 내에 있는 모든 변수를 초기화 하는 메서드는 위치에 컨트롤을 전송 하는 문은 허용 되지 않습니다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-ttu-id=&quot;1a3a8-111&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;라고한다.&lt;/p&gt;
&lt;p&gt;쉽게 말하면 그냥 내가 지정한 위치로 점프해버리는 제어문이다.&lt;/p&gt;
&lt;p&gt;점프하고 싶은 곳에 comeback의 이름을가진 레이블을 만들고 goto comeback 을 하면 comeback 레이블이 있는곳으로 점프한다.&lt;/p&gt;
&lt;p&gt;아래 코드를 보자&lt;/p&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1589454017974&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

int main()
{
	int x;
comeback :
	std::cout &amp;lt;&amp;lt; &quot;5이상 숫자 입력해&quot; &amp;lt;&amp;lt; std::endl;
	std::cin &amp;gt;&amp;gt; x;
	if (x &amp;lt; 5)
	{
		std::cout &amp;lt;&amp;lt; &quot;??????????????? &quot;;
		std::cout &amp;lt;&amp;lt; x;
		std::cout &amp;lt;&amp;lt; &quot; 5이상 이요!&quot; &amp;lt;&amp;lt; std::endl;
		goto comeback;
		std::cout &amp;lt;&amp;lt; &quot;이것도 출력해 보시지!&quot; &amp;lt;&amp;lt; std::endl;
	}
	else
	{
		std::cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt; std::endl;
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Aoj72/btqD9i3Fof7/qc4cU7EvLn5ktPNVFcTuuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Aoj72/btqD9i3Fof7/qc4cU7EvLn5ktPNVFcTuuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Aoj72/btqD9i3Fof7/qc4cU7EvLn5ktPNVFcTuuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAoj72%2FbtqD9i3Fof7%2Fqc4cU7EvLn5ktPNVFcTuuK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;5이하의 숫자를 입력할때 comeback:의 위치로 점프해서 계속 반복하다가 5를 넣자 프로그램이 종료되었다!&lt;/p&gt;
&lt;p&gt;goto 문 때문에 위로 다시 점프를 하기 때문에 이것도 출력해 보시지! 라는 문자는 출력되지 않는다.&lt;/p&gt;
&lt;p&gt;지금은 레이블을 1개밖에 사용하지 않아서 편리해 보이지만.. 만약 레이블이 50개 100개 늘어난다고하면 어떻게 될까&lt;/p&gt;
&lt;p&gt;엄청 얽혀 있고 프로그래머는 코드의 흐름을 이해하기 힘들어진다. 이런 코드를 스파게티 코드라고 하는데.&lt;/p&gt;
&lt;p&gt;관리하기 어려운 코드가 된다는것이다. 그래서 C++에서는 잘 사용하지 않는다고 들었다!!&lt;/p&gt;
&lt;p&gt;물론 사람마다 차이가 있기때문에 자주 사용하시는 분들도 있을것이다!&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/58</guid>
      <comments>https://younggwan.tistory.com/58#entry58comment</comments>
      <pubDate>Thu, 14 May 2020 20:17:14 +0900</pubDate>
    </item>
    <item>
      <title>C++ 바이트패딩 Byte Padding (두번째!)</title>
      <link>https://younggwan.tistory.com/57</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://younggwan.tistory.com/41&quot;&gt;https://younggwan.tistory.com/41&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1589372436247&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C++ 바이트 패딩(Byte Padding)&quot; data-og-description=&quot;바이트 패딩(Byte Padding) 클래스(구조체)에 패딩 바이트를 추가하여 CPU 접근을 더 용이하게 해주는 기법 코드 #include &amp;quot;pch.h&amp;quot; #include &amp;lt;iostream&amp;gt; class TestClass { char m_Temp_Char[2]; int m_Temp_Int;..&quot; data-og-host=&quot;younggwan.tistory.com&quot; data-og-source-url=&quot;https://younggwan.tistory.com/41&quot; data-og-url=&quot;https://younggwan.tistory.com/41&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fUNCf/hyF2KIls05/lmYYrMro2YlSnsRgFlPue0/img.png?width=397&amp;amp;height=55&amp;amp;face=0_0_397_55,https://scrap.kakaocdn.net/dn/b4dA87/hyF1E325Ux/690M29CkTyVWaaYTc06AX1/img.png?width=397&amp;amp;height=55&amp;amp;face=0_0_397_55,https://scrap.kakaocdn.net/dn/bb09GH/hyF1JqK1in/6lXwN9tmIC0KbZ7SL8rPG0/img.png?width=423&amp;amp;height=568&amp;amp;face=0_0_423_568&quot;&gt;&lt;a href=&quot;https://younggwan.tistory.com/41&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://younggwan.tistory.com/41&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fUNCf/hyF2KIls05/lmYYrMro2YlSnsRgFlPue0/img.png?width=397&amp;amp;height=55&amp;amp;face=0_0_397_55,https://scrap.kakaocdn.net/dn/b4dA87/hyF1E325Ux/690M29CkTyVWaaYTc06AX1/img.png?width=397&amp;amp;height=55&amp;amp;face=0_0_397_55,https://scrap.kakaocdn.net/dn/bb09GH/hyF1JqK1in/6lXwN9tmIC0KbZ7SL8rPG0/img.png?width=423&amp;amp;height=568&amp;amp;face=0_0_423_568');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;C++ 바이트 패딩(Byte Padding)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;바이트 패딩(Byte Padding) 클래스(구조체)에 패딩 바이트를 추가하여 CPU 접근을 더 용이하게 해주는 기법 코드 #include &quot;pch.h&quot; #include class TestClass { char m_Temp_Char[2]; int m_Temp_Int;..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;younggwan.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;전에 바이트 패딩에 정리한적이있다.&lt;/p&gt;
&lt;p&gt;가장큰 자료형의 크기로 바이트패딩이 된다고 말했었는데&lt;/p&gt;
&lt;p&gt;좀더 정보를 추가하기 위해 2번째 글이다!.&lt;/p&gt;
&lt;p&gt;일단 코드를 보자&lt;/p&gt;
&lt;pre id=&quot;code_1589372632875&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class A
{
public:
	char m_c1; // 1
	char m_c2; // 1
	int  m_i1; // 4
	char m_c3; // 1
	int m_i2; // 4
	char m_c4; // 1

	virtual void Func()
	{

	}
};


int main()
{
	A a;
	a.m_c1 = 1;
	a.m_c2 = 2;
	a.m_i1 = 11;
	a.m_c3 = 3;
	a.m_i2 = 22;
	a.m_c4 = 4;
	A* a_p = &amp;amp;a;
	size_t tempsize = sizeof(A);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;x64&lt;/b&gt; 환경에서 A의 크기는&amp;nbsp;&lt;/p&gt;
&lt;p&gt;가상 함수 포인터가 멤버 변수로 생기기에 8바이트로 패딩이 이루어 질거라고 예상을 하고&lt;br /&gt;char, char, int, char, int, char 의 멤버 변수를 가지고있기에&lt;br /&gt;1, 1, 4, 1, 4, 1&lt;br /&gt;8(__vfptr) + 8(1,1,4,1), + 8(4,1) = 24의 사이즈가 나올거라고 예상을 했다.&lt;br /&gt;하지만 사이즈가!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dypUz4/btqD9uWaiRO/1qw7DsTuHK04vcgW7ogyV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dypUz4/btqD9uWaiRO/1qw7DsTuHK04vcgW7ogyV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dypUz4/btqD9uWaiRO/1qw7DsTuHK04vcgW7ogyV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdypUz4%2FbtqD9uWaiRO%2F1qw7DsTuHK04vcgW7ogyV0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;32바이트가 나왔다..&lt;/p&gt;
&lt;p&gt;그래서! 메모리로 확인을 해보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu8uuA/btqD6POcYhH/DUiDIq61k52ma2QvuDOPrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu8uuA/btqD6POcYhH/DUiDIq61k52ma2QvuDOPrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu8uuA/btqD6POcYhH/DUiDIq61k52ma2QvuDOPrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu8uuA%2FbtqD6POcYhH%2FDUiDIq61k52ma2QvuDOPrK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SUOuQ/btqD9jAvSbc/1feOtHWS3otFrFoGH7V6k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SUOuQ/btqD9jAvSbc/1feOtHWS3otFrFoGH7V6k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SUOuQ/btqD9jAvSbc/1feOtHWS3otFrFoGH7V6k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSUOuQ%2FbtqD9jAvSbc%2F1feOtHWS3otFrFoGH7V6k1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;30 9c 99 28 f7 7f 00 00&amp;nbsp; &amp;nbsp;01 02 cc cc 0b 00 00 00&amp;nbsp; &amp;nbsp;03 cc cc cc 16 00 00 00&amp;nbsp; &amp;nbsp;04 cc cc cc cc cc cc cc&lt;/p&gt;
&lt;p&gt;----------------------------------------------------&lt;/p&gt;
&lt;p&gt;__vfptr(&lt;span style=&quot;color: #333333;&quot;&gt;30 9c 99 28 f7 7f 00 00)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;----------------------------------------------------&lt;/span&gt;&lt;br /&gt;m_c1(01)&lt;br /&gt;m_c2(02)&lt;br /&gt;cc&lt;br /&gt;cc&lt;br /&gt;m_i1(0b 00 00 00)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;----------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;m_c3(03)&lt;br /&gt;cc&lt;br /&gt;cc&lt;br /&gt;cc&lt;br /&gt;m_i2(16 00 00 00)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;----------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;m_c4(04)&lt;br /&gt;cc&lt;br /&gt;cc&lt;br /&gt;cc&lt;br /&gt;cc&lt;br /&gt;cc&lt;br /&gt;cc&lt;br /&gt;cc&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;----------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이렇게 메모리가 자리잡았다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;24바이트 크기안에 다넣을수있는데 왜 32바이트가 되었을까&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;바이트패딩은 이전의 데이터의 타입으로 바이트 패딩 규칙을 만든다고한다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;현재 가상 함수 포인터로 인하여 8바이트의 크기로 패딩이 되고있는데&lt;/p&gt;
&lt;p&gt;char, char, int , char가 8바이트에 들어간게아니라&lt;/p&gt;
&lt;p&gt;char 7바이트 남았네 또 char가 들어올수있네!&lt;br /&gt;char 6바이트 남았네 또 char가 들어올수있네!&lt;br /&gt;int&amp;nbsp; &amp;nbsp;2바이트 남았네 또 int가 들어올수없네! 하나더!!!&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;char 7바이트 남았네 &lt;span style=&quot;color: #333333;&quot;&gt;또 char가 들어올수있네!&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;int&amp;nbsp; &amp;nbsp;3바이트 남았네 또 int가 들어올수없네! 하나더!!!!!!!!!!!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;char 7바이트 남았네!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이런식으로 크기가 32바이트가 되었다고한다..&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;공부하다가 당연히 24라고 생각했었는데 32였다 하하하하하하....&lt;/p&gt;
&lt;p&gt;역시 코딩은 의심에 의심에 의심에 의심을 해야겠다.&lt;/p&gt;
&lt;p&gt;언제나 틀린정보는 지적해주시면 감사하겠습니다!. 꼭.. 잡아주세요&amp;nbsp;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/57</guid>
      <comments>https://younggwan.tistory.com/57#entry57comment</comments>
      <pubDate>Wed, 13 May 2020 21:37:01 +0900</pubDate>
    </item>
    <item>
      <title>C++ void* 보이드 포인터</title>
      <link>https://younggwan.tistory.com/56</link>
      <description>&lt;p&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;MSDN에서 void에 정의는 다음과 같다&lt;/p&gt;
&lt;p&gt;&lt;span data-ttu-id=&quot;785a8-103&quot;&gt;함수 반환 형식으로 사용 하는 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;void&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;키워드는 함수가 값을 반환 하지 않도록 지정 합니다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-ttu-id=&quot;785a8-104&quot;&gt;함수 매개 변수 목록에 사용 되는 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;void&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 함수가 매개 변수를 사용 하지 않도록 지정 합니다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-ttu-id=&quot;785a8-105&quot;&gt;포인터 선언에 사용 되는 경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;void&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 포인터가 &quot;universal(만능)&quot; 임을 지정 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-ttu-id=&quot;785a8-106&quot;&gt;포인터 형식이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;void*&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이면 포인터는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;const&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;volatile&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;키워드를 사용 하 여 선언 되지 않은 모든 변수를 가리킬 수 있습니다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-ttu-id=&quot;785a8-107&quot;&gt;&lt;b&gt;Void*&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;포인터는 다른 형식으로 캐스팅 된 경우에만 역참조 될 수 있습니다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-ttu-id=&quot;785a8-108&quot;&gt;&lt;b&gt;Void*&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;포인터를 다른 형식의 데이터 포인터로 변환할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-ttu-id=&quot;785a8-109&quot;&gt;&lt;b&gt;Void&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;포인터는 함수를 가리킬 수 있지만의 C++클래스 멤버가 아니어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-ttu-id=&quot;785a8-110&quot;&gt;&lt;b&gt;Void&lt;/b&gt;형식의 변수는 선언할 수 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;void pointer는 제네릭 포인터(generic pointer)라고 불린다.&lt;br /&gt;모든 데이터 자료형을 가리킬 수 있는 포인터이다.&lt;/p&gt;
&lt;p&gt;void* 는 다른 변수를 가리킬 수 있지만. 다른 형식으로 캐스팅 된 경우에만 역참조가 된다고 하고&lt;br /&gt;const 또는 volatile 키워드로 사용 하여 선언 되지 않은 모든 변수를 가리킬 수 있다고 한다.&lt;br /&gt;코드를 통해 보자.&lt;/p&gt;
&lt;pre id=&quot;code_1589181368518&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;


class VP_TEST_CLASS
{

};

int main()
{
	int _i;
	short _s;
	VP_TEST_CLASS v_t_c;
	void* v_p;

	v_p = &amp;amp;_i;
	std::cout &amp;lt;&amp;lt; *v_p &amp;lt;&amp;lt; std::endl;
	v_p = &amp;amp;_s;
	std::cout &amp;lt;&amp;lt; *v_p &amp;lt;&amp;lt; std::endl;
	v_p = &amp;amp;v_t_c;
	std::cout &amp;lt;&amp;lt; *v_p &amp;lt;&amp;lt; std::endl;

	const int _c_i = 10;
	v_p = &amp;amp;_c_i;

	volatile int _v_i;
	v_p = &amp;amp;_v_i;


	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qyDKx/btqD4xTk9a5/7WlrkckQ09fK4cZAiUISI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qyDKx/btqD4xTk9a5/7WlrkckQ09fK4cZAiUISI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qyDKx/btqD4xTk9a5/7WlrkckQ09fK4cZAiUISI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqyDKx%2FbtqD4xTk9a5%2F7WlrkckQ09fK4cZAiUISI0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/de9774/btqD4Unhl8G/mmCbsoXGcEc5kqsdwlGT1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/de9774/btqD4Unhl8G/mmCbsoXGcEc5kqsdwlGT1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/de9774/btqD4Unhl8G/mmCbsoXGcEc5kqsdwlGT1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fde9774%2FbtqD4Unhl8G%2FmmCbsoXGcEc5kqsdwlGT1k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tMLdy/btqD1NXEtPP/kc5s53kHdpzBAw5AQkzycK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tMLdy/btqD1NXEtPP/kc5s53kHdpzBAw5AQkzycK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tMLdy/btqD1NXEtPP/kc5s53kHdpzBAw5AQkzycK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtMLdy%2FbtqD1NXEtPP%2Fkc5s53kHdpzBAw5AQkzycK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dERsOg/btqD4VzIhKN/HON0KebnJuK0f5WpkZDDiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dERsOg/btqD4VzIhKN/HON0KebnJuK0f5WpkZDDiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dERsOg/btqD4VzIhKN/HON0KebnJuK0f5WpkZDDiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdERsOg%2FbtqD4VzIhKN%2FHON0KebnJuK0f5WpkZDDiK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do8y16/btqD4xTk9TI/hAzsMuOEroHbW9Fiaw9I1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do8y16/btqD4xTk9TI/hAzsMuOEroHbW9Fiaw9I1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do8y16/btqD4xTk9TI/hAzsMuOEroHbW9Fiaw9I1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo8y16%2FbtqD4xTk9TI%2FhAzsMuOEroHbW9Fiaw9I1K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ISpAY/btqD3dnAtIm/5MKI1sxbE6Df8bVdk0OCy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ISpAY/btqD3dnAtIm/5MKI1sxbE6Df8bVdk0OCy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ISpAY/btqD3dnAtIm/5MKI1sxbE6Df8bVdk0OCy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FISpAY%2FbtqD3dnAtIm%2F5MKI1sxbE6Df8bVdk0OCy1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;void* 는 모든 자료형을 가리키고 있지만&lt;br /&gt;출력을 하려고 해도 void* 는 자료형의 객체를 알지 못하기 때문에 역참조가 불가능하다.&lt;br /&gt;역참조를 하려면 void*를 다른 포인터의 유형으로 명시적 형 변환을 해야한다.&lt;/p&gt;
&lt;p&gt;또한 const, volatile 형식의 변수는 void* 로 가리킬수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1589181662605&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;


class VP_TEST_CLASS
{

};

int main()
{
	int _i = 20;
	short _s;
	VP_TEST_CLASS v_t_c;
	void* v_p;

	int* _i_p;
	v_p = &amp;amp;_i;
	_i_p = static_cast&amp;lt;int*&amp;gt;(v_p);
	std::cout &amp;lt;&amp;lt; *_i_p &amp;lt;&amp;lt; std::endl;
	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qDifc/btqD1OCcLuC/BawxpO0aw50G39a5ezixmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qDifc/btqD1OCcLuC/BawxpO0aw50G39a5ezixmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qDifc/btqD1OCcLuC/BawxpO0aw50G39a5ezixmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqDifc%2FbtqD1OCcLuC%2FBawxpO0aw50G39a5ezixmk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;또한 포인터 산술에서도 void*는 되지않는다 포인터 산술은 포인터가 어떤 크기의 객체를 가리키는지 알아야 하므로 포인터를 더하거나 뺄수없는 void*는 포인터 연산이 되지않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1589181867021&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

int main()
{
	int _i = 20;

	void* v_p;
	int* i_p;

	v_p = &amp;amp;_i;
	i_p = &amp;amp;_i;

	v_p++;
	i_p++;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2dTIp/btqD1Oa9ql9/oV0cdlAnAuGg9SmWiuyBe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2dTIp/btqD1Oa9ql9/oV0cdlAnAuGg9SmWiuyBe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2dTIp/btqD1Oa9ql9/oV0cdlAnAuGg9SmWiuyBe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2dTIp%2FbtqD1Oa9ql9%2FoV0cdlAnAuGg9SmWiuyBe0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cryMtr/btqD4UU53dd/y6wIx94sDXktEMy22kQLT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cryMtr/btqD4UU53dd/y6wIx94sDXktEMy22kQLT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cryMtr/btqD4UU53dd/y6wIx94sDXktEMy22kQLT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcryMtr%2FbtqD4UU53dd%2Fy6wIx94sDXktEMy22kQLT1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;또한 void reference 보이드 참조도 안된다!&lt;/p&gt;
&lt;pre id=&quot;code_1589181958615&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

int main()
{
	int _i = 20;

	void* v_p;
	int* i_p;

	void&amp;amp; r_p = _i;
	int&amp;amp; r_i = _i;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXPohN/btqD53xjkRx/fjbhGYKoPhr1YMwMpVyLIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXPohN/btqD53xjkRx/fjbhGYKoPhr1YMwMpVyLIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXPohN/btqD53xjkRx/fjbhGYKoPhr1YMwMpVyLIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXPohN%2FbtqD53xjkRx%2FfjbhGYKoPhr1YMwMpVyLIK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/56</guid>
      <comments>https://younggwan.tistory.com/56#entry56comment</comments>
      <pubDate>Mon, 11 May 2020 16:26:44 +0900</pubDate>
    </item>
    <item>
      <title>C++ 함수 포인터</title>
      <link>https://younggwan.tistory.com/55</link>
      <description>&lt;p&gt;C++의 특징이라고 한다면 포인터를 말할 수 있다.&lt;br /&gt;그럼 함수도 포인터로 이용할 수 있지 않을까??&lt;/p&gt;
&lt;p&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;포인터는 다른 변수의 주소를 저장하는 변수이다.&lt;br /&gt;함수 포인터는 다른 함수의 주소를 저장하는 변수이다!&lt;/p&gt;
&lt;p&gt;사용 방법은&lt;br /&gt;반환 타입 (*변수이름) (매개변수)&lt;br /&gt;int (*cir)(int, int);&amp;nbsp;&lt;/p&gt;
&lt;p&gt;함수 포인터로 계산기를 만들어보면서 설명하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588686922409&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

#pragma warning(disable: 4996)

void plus(int _v1, int _v2)
{
	std::cout &amp;lt;&amp;lt; _v1 + _v2 &amp;lt;&amp;lt; std::endl;
}

void minus(int _v1, int _v2)
{
	std::cout &amp;lt;&amp;lt; _v1 - _v2 &amp;lt;&amp;lt; std::endl;
}

void multiple(int _v1, int _v2)
{
	std::cout &amp;lt;&amp;lt; _v1 * _v2 &amp;lt;&amp;lt; std::endl;
}

void divide(int _v1, int _v2)
{
	std::cout &amp;lt;&amp;lt; _v1 / _v2 &amp;lt;&amp;lt; std::endl;
}

int main()
{
	void(*cir)(int, int) = nullptr;
	int value = 0;
	char sign = 0;
	int value2 = 0;

	scanf(&quot;%d %c %d&quot;, &amp;amp;value, &amp;amp;sign, &amp;amp;value2);

	switch (sign)
	{
	case '+' :
		cir = &amp;amp;plus;
		break;
	case '-':
		cir = &amp;amp;minus;
		break;
	case '*':
		cir = &amp;amp;multiple;
		break;
	case '/':
		cir = &amp;amp;divide;
		break;
	default:
		break;
	}
	cir(value,value2);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;반환 타입 (*변수이름) (매개변수)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;void(*cir)(int,int);&lt;/p&gt;
&lt;p&gt;cir 함수 포인터는 반환 값 void 매개변수가 int, int가 들어오는 함수를 담을수가 있다.&lt;/p&gt;
&lt;p&gt;scanf로 value, sign, value에 값을 받은뒤&lt;/p&gt;
&lt;p&gt;switch문으로&lt;/p&gt;
&lt;p&gt;사칙 연산에 해당하는 case문으로 이동후&lt;/p&gt;
&lt;p&gt;cir 함수 포인터에 각 계산식에 맞는 함수의 포인터를 넣어주면 된다!.&lt;/p&gt;
&lt;p&gt;cir 은 plus를 가리킬수도있고!&lt;/p&gt;
&lt;p&gt;minus, multiple, divide를 다 가리킬수있다!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/55</guid>
      <comments>https://younggwan.tistory.com/55#entry55comment</comments>
      <pubDate>Tue, 5 May 2020 22:57:28 +0900</pubDate>
    </item>
    <item>
      <title>C++ 가변 인자 템플릿</title>
      <link>https://younggwan.tistory.com/54</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://younggwan.tistory.com/53&quot;&gt;https://younggwan.tistory.com/53&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1588683970624&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;C++ 가변인자&quot; data-og-description=&quot;정의 매개 변수의 개수가 변할수 있는 인자이다. 예를 들어, printf, scanf 가 가변인자를 사용한 함수이다. 코드로 가변 인자를 사용하면서 설명하겠습니다. 정수를 더하는 가변 인자 함수입니다. 코드 #include..&quot; data-og-host=&quot;younggwan.tistory.com&quot; data-og-source-url=&quot;https://younggwan.tistory.com/53&quot; data-og-url=&quot;https://younggwan.tistory.com/53&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xAYT1/hyFVKWb9ib/dHseRlCbeoic9baHXjHFc1/img.png?width=148&amp;amp;height=70&amp;amp;face=0_0_148_70,https://scrap.kakaocdn.net/dn/WqYO5/hyFVFtPu8t/bUDJl1eqt2wvGo9uCYVm00/img.png?width=148&amp;amp;height=70&amp;amp;face=0_0_148_70,https://scrap.kakaocdn.net/dn/OC9uO/hyFVCw5jUU/YMnAwaEWDGrrFA9UqkDwaK/img.png?width=1194&amp;amp;height=666&amp;amp;face=0_0_1194_666&quot;&gt;&lt;a href=&quot;https://younggwan.tistory.com/53&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://younggwan.tistory.com/53&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xAYT1/hyFVKWb9ib/dHseRlCbeoic9baHXjHFc1/img.png?width=148&amp;amp;height=70&amp;amp;face=0_0_148_70,https://scrap.kakaocdn.net/dn/WqYO5/hyFVFtPu8t/bUDJl1eqt2wvGo9uCYVm00/img.png?width=148&amp;amp;height=70&amp;amp;face=0_0_148_70,https://scrap.kakaocdn.net/dn/OC9uO/hyFVCw5jUU/YMnAwaEWDGrrFA9UqkDwaK/img.png?width=1194&amp;amp;height=666&amp;amp;face=0_0_1194_666');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;C++ 가변인자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;정의 매개 변수의 개수가 변할수 있는 인자이다. 예를 들어, printf, scanf 가 가변인자를 사용한 함수이다. 코드로 가변 인자를 사용하면서 설명하겠습니다. 정수를 더하는 가변 인자 함수입니다. 코드 #include..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;younggwan.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;위 글에서 가변 인자에 대해 설명할때는 인자를 int형으로만 받아서 설명을 했다.&lt;/p&gt;
&lt;p&gt;그럼 인자의 형태가 여러가지 형태일때는 어떻게 해야할까???&lt;/p&gt;
&lt;p&gt;가변 인자 템플릿을 사용하면된다!.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코드를 통해 설명!!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588684044747&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
void Y_FUNC()
{

}

template &amp;lt;typename T, typename ...Arg&amp;gt;
void Y_FUNC(T _Value, Arg... args)
{
	int count = 0;
	++count;
	std::cout &amp;lt;&amp;lt; count &amp;lt;&amp;lt; &quot;. &quot; &amp;lt;&amp;lt; typeid(T).name() &amp;lt;&amp;lt; &quot; : &quot; &amp;lt;&amp;lt; _Value &amp;lt;&amp;lt; std::endl;
	int tempsize = (int)sizeof...(args);
	std::cout &amp;lt;&amp;lt; &quot;남은 변수 : &quot;&amp;lt;&amp;lt; tempsize &amp;lt;&amp;lt; std::endl;
	Y_FUNC(args...);
}

int main()
{
	short _s = 2;
	float _f = 3.3f;
	Y_FUNC(1, &quot;YYG&quot;, 'C', _s, _f, 11111111111);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sHlTb/btqDSijdlK3/GAoDZ8EFW5ToJxGwhWHKXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sHlTb/btqDSijdlK3/GAoDZ8EFW5ToJxGwhWHKXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sHlTb/btqDSijdlK3/GAoDZ8EFW5ToJxGwhWHKXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsHlTb%2FbtqDSijdlK3%2FGAoDZ8EFW5ToJxGwhWHKXK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Y_FUNC()안에 넣어준 인자들이&lt;br /&gt;출력되고 현재 변수의 개수가 출력되고 있는데.&lt;br /&gt;sizeof...() 의 동작은 현재 남은 가변 인자의 개수를 알려줍니다&lt;br /&gt;Y_FUNC()함수 내부를 보면 재귀함수 형태로 인자들을 전달해주는데 재귀의 탈출문이 보이지않습니다&lt;/p&gt;
&lt;p&gt;지금 Y_FUNC()는 함수 오버로딩을 이용해 두가지가 있습니다.&lt;/p&gt;
&lt;p&gt;1.&lt;br /&gt;...Arg&amp;gt;template ...Arg&amp;gt;&lt;br /&gt;Y_FUNC(Y_FUNC(T _Value, Arg... args)&lt;/p&gt;
&lt;p&gt;2.&lt;br /&gt;Y_FUNC()&lt;/p&gt;
&lt;p&gt;인자를 받는 함수와 인자를 받지 않는 함수&lt;/p&gt;
&lt;p&gt;재귀함수로 가변인자가 계속 값이 들어가면서 1번이 호출되다가 마지막에 더이상 인자가 없을때는&lt;br /&gt;2번 함수가 호출되서 재귀함수가 종료됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/54</guid>
      <comments>https://younggwan.tistory.com/54#entry54comment</comments>
      <pubDate>Tue, 5 May 2020 22:34:36 +0900</pubDate>
    </item>
    <item>
      <title>C++ 가변인자</title>
      <link>https://younggwan.tistory.com/53</link>
      <description>&lt;p&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;매개 변수의 개수가 변할수 있는 인자이다.&lt;br /&gt;예를 들어, printf, scanf 가 가변인자를 사용한 함수이다.&lt;/p&gt;
&lt;p&gt;코드로 가변 인자를 사용하면서 설명하겠습니다.&lt;br /&gt;정수를 더하는 가변 인자 함수입니다.&lt;br /&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588503887990&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

int Y_SUM(int _Count, ...)
{
	int Return_Value = 0;
	va_list va;
	__va_start(&amp;amp;va, _Count);

	for (int i = 0; i &amp;lt; _Count; i++)
	{
		Return_Value += __crt_va_arg(va, int);
	}
	__crt_va_end(va);

	return  Return_Value;
}

int main()
{
	std::cout &amp;lt;&amp;lt; Y_SUM(5, 1, 2, 3, 4, 5, 6) &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; Y_SUM(3, 1, 2) &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; Y_SUM(5, 2, 4, 6, 8, 10, 12) &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; Y_SUM(3, 1, 2, 3, 4) &amp;lt;&amp;lt; std::endl;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxkE1R/btqDTjmPl3t/VSSmpiVFcSCVR1wsMMuBmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxkE1R/btqDTjmPl3t/VSSmpiVFcSCVR1wsMMuBmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxkE1R/btqDTjmPl3t/VSSmpiVFcSCVR1wsMMuBmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxkE1R%2FbtqDTjmPl3t%2FVSSmpiVFcSCVR1wsMMuBmK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;가변 인자의 사용 방법을 보자&amp;nbsp;&lt;br /&gt;현재 int Y_SUM(int _Count, ...)라고 선언을 했다.&lt;br /&gt;가변인자는 ...을 사용해서 받고있습니다.&lt;/p&gt;
&lt;p&gt;코드를 보면&lt;/p&gt;
&lt;p&gt;va_list : 가변인자를 가르키는 포인터&lt;/p&gt;
&lt;p&gt;va_start : va_list를 특정 위치로 이동&lt;/p&gt;
&lt;p&gt;va_arg : va_list가 가리키는 위치부터 자료형 크기만큼 데이터를 읽어서 반환&lt;/p&gt;
&lt;p&gt;va_end : va_list를 NULL로 변경&lt;/p&gt;
&lt;p&gt;이렇게 4가지의 가변인자 함수들이있는데&lt;/p&gt;
&lt;p&gt;va_list 는 char* 입니다. 매개 변수의 주소 값을 받는 아이입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mnffm/btqDSivaAlJ/BvNJSSHIWKTH5OwdYsdyXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mnffm/btqDSivaAlJ/BvNJSSHIWKTH5OwdYsdyXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mnffm/btqDSivaAlJ/BvNJSSHIWKTH5OwdYsdyXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmnffm%2FbtqDSivaAlJ%2FBvNJSSHIWKTH5OwdYsdyXk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;va_start(&amp;amp;va, _Count)를 하게되면 va에는 첫번째 가변 인자의 주소를 가리키게 되고&lt;/p&gt;
&lt;p&gt;va_arg(va, int)를 하게 되면 int의 크기인 4바이트씩 메모리의 주소를 변경하면서 값을 반환한다.&lt;/p&gt;
&lt;p&gt;va_end(va)를 하게 되면 va를 NULL로 바꾼다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Y_SUM(5, 1, 2, 3, 4, 5, 6) 의 출력이 15인 이유는 5번 반복하기때문이다 1 + 2 + 3 + 4 + 5 = 15&lt;br /&gt;가변인자로 6개의 인자를 넣어줘도 반복문으로 5번만 돈다.&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Y_SUM(3, 1, 2) 의 출력이 쓰레기값인 이유는 가변 인자의 범위를 넘어가 쓰레기값을 더해주었기때문이다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Y_SUM(5, 2, 4, 6, 8, 10, 12) 과 &lt;span style=&quot;color: #333333;&quot;&gt;Y_SUM(3,&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3,&amp;nbsp;4)&lt;/span&gt;의 출력은 첫번째 경우와 같은 경우이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;증명 해보자&lt;/p&gt;
&lt;p&gt;&lt;b&gt;증명&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588504756039&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

int Y_SUM(int _Count, ...)
{
	int Return_Value = 0;

	int* temp_p;
	va_list va;
	__va_start(&amp;amp;va, _Count);
	temp_p = (int*)va;
	for (int i = 0; i &amp;lt; _Count; i++)
	{
		temp_p = (int*)va;
		Return_Value += __crt_va_arg(va, int);
		temp_p = (int*)va;
	}
	__crt_va_end(va);

	return  Return_Value;
}

int main()
{
	std::cout &amp;lt;&amp;lt; Y_SUM(5, 1, 2, 3, 4, 5, 6) &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; Y_SUM(3, 1, 2) &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; Y_SUM(5, 2, 4, 6, 8, 10, 12) &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; Y_SUM(3, 1, 2, 3, 4) &amp;lt;&amp;lt; std::endl;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;int* temp_p를 선언해서 va값을 int*로 형변환해서 받아보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3hOhk/btqDPZDXf5Q/KjreJfkKOe9rCyLrVTBryK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3hOhk/btqDPZDXf5Q/KjreJfkKOe9rCyLrVTBryK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3hOhk/btqDPZDXf5Q/KjreJfkKOe9rCyLrVTBryK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3hOhk%2FbtqDPZDXf5Q%2FKjreJfkKOe9rCyLrVTBryK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;va_start() 함수 실행 후&amp;nbsp;&lt;br /&gt;va는 가변 인자중 첫번째인 5를 가리키고있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BhAdC/btqDSBaaLWc/Loi3zjTFjBi9MfGSShOLjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BhAdC/btqDSBaaLWc/Loi3zjTFjBi9MfGSShOLjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BhAdC/btqDSBaaLWc/Loi3zjTFjBi9MfGSShOLjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBhAdC%2FbtqDSBaaLWc%2FLoi3zjTFjBi9MfGSShOLjK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;va_arg() 함수 실행 후&lt;br /&gt;va는 다음 인자인 1을 가리키고 있다.&lt;/p&gt;
&lt;p&gt;쭉 진행한 후&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qwjU5/btqDTjAmNTm/k9j1HgEuxLnVO4GnX3srQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qwjU5/btqDTjAmNTm/k9j1HgEuxLnVO4GnX3srQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qwjU5/btqDTjAmNTm/k9j1HgEuxLnVO4GnX3srQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqwjU5%2FbtqDTjAmNTm%2Fk9j1HgEuxLnVO4GnX3srQ0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;va_end() 함수 실행 후&lt;br /&gt;va는 NULL이 되었다.&lt;/p&gt;
&lt;p&gt;그러면 printf()같은경우 int형만 받는게아니라 char short int double string 여러가지 형태를 받는다.&lt;/p&gt;
&lt;p&gt;이럴때는 가변인자 템플릿을 사용해야한다.&lt;/p&gt;
&lt;p&gt;가변인자 템플릿은 다음글에서 설명하겠다.&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/53</guid>
      <comments>https://younggwan.tistory.com/53#entry53comment</comments>
      <pubDate>Sun, 3 May 2020 20:28:58 +0900</pubDate>
    </item>
    <item>
      <title>C++ 가상함수테이블(Virtual function table)</title>
      <link>https://younggwan.tistory.com/52</link>
      <description>&lt;p&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;부모 클래스의 포인터나 레퍼런스가 자식 클래스 객체를 가리킬 때&lt;br /&gt;자식 클래스의 가상 함수 재정의(Override)에 의해 호출되는 함수가 달라지는 것&lt;/p&gt;
&lt;p&gt;다형성의 좋은 예이다.&lt;/p&gt;
&lt;p&gt;A클래스에 virtual Func()가 있고 B클래스가 A클래스를 상속 받고 Func()함수를 재정의(Override)했을때&lt;br /&gt;A* a = new B();&lt;br /&gt;a-&amp;gt;Func(); 를 하면&lt;br /&gt;컴파일러는 Func()가 A의 Func()를 실행해야하는지 B의 Func()를 실행해야하는 알지를 못합니다.&lt;br /&gt;그럼 어떻게 알아내야 할까??&lt;br /&gt;객체 타입을 런타임중에 알아내는 매커니즘을 RTTI(Run Time Type Information)이라고 하는데&lt;br /&gt;RTTI는 다음 글에 정리하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;C++은 가상 함수를 처리하기 위해서 가상 함수를 갖는 클래스 마다 '가상 함수 테이블(Virtual function table)을 생성하는데 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;가상 함수 테이블은 가상 함수 포인터를 모아둔 배열입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;가상함수 포인터(vfptr)는 &lt;/span&gt;가상함수를 추가할 경우 객체의 멤버 변수로 가상 함수 테이블을 가리키는 포인터를 멤버 변수로 추가를 시킵니다.&lt;br /&gt;&lt;br /&gt;일단 가상 함수 포인터가 실제로 추가되는지 부터 확인하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588418146581&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
private:
	int m_i = 0;
public: 
	void Func()
	{

	}
};

class B : public A
{

};

int main()
{
	A a;
	B b;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다음과 같은 코드가 있을때 a와b를 살펴보자.&lt;br /&gt;멤버 변수에 int m_i만 존재한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5xxyr/btqDQcCOlh7/1v8FLzzcDDzh7c3jlEBLrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5xxyr/btqDQcCOlh7/1v8FLzzcDDzh7c3jlEBLrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5xxyr/btqDQcCOlh7/1v8FLzzcDDzh7c3jlEBLrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5xxyr%2FbtqDQcCOlh7%2F1v8FLzzcDDzh7c3jlEBLrk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;virtual 함수를 추가하면 어떻게 변할까??&lt;/p&gt;
&lt;pre id=&quot;code_1588418270629&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
private:
	int m_i = 0;
public: 
	virtual void Func()
	{

	}
};

class B : public A
{

};

int main()
{
	A a;
	B b;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuv8v0/btqDQ9rOfsU/dCjltB2vncQLiYWrBakl1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuv8v0/btqDQ9rOfsU/dCjltB2vncQLiYWrBakl1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuv8v0/btqDQ9rOfsU/dCjltB2vncQLiYWrBakl1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuv8v0%2FbtqDQ9rOfsU%2FdCjltB2vncQLiYWrBakl1K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;가상 함수를 만들자 __vfptr이 추가되었다.&amp;nbsp;&lt;br /&gt;B클래스에서 Func()함수를 재정의 하지 않았기 때문에&amp;nbsp;&lt;br /&gt;a와 b의 __vfptr를 보면 Func()함수 포인터 주소를 0x00ed13a7로 같은 곳을 가리키고있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일단 B클래스에서 Func()함수를 재정의 해보겠다.&lt;/p&gt;
&lt;pre id=&quot;code_1588419542807&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
private:
	int m_i = 0;
public: 
	virtual void Func()
	{

	}
};

class B : public A
{
public:
	void Func() override
	{

	}
};

int main()
{
	A a;
	B b;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;B클래스에서 void Func() override로 재정의를 하였다.&lt;br /&gt;override는 암시적으로도 붙기때문에 명시적으로 작성할 필요는 없지만 저는 재정의 했다는걸 한눈에 알 수 있게&lt;br /&gt;작성하는걸 선호하는 편입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Cb697/btqDQSKD6JF/EOAPmCmYI8vDql4XRiAKL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Cb697/btqDQSKD6JF/EOAPmCmYI8vDql4XRiAKL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Cb697/btqDQSKD6JF/EOAPmCmYI8vDql4XRiAKL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCb697%2FbtqDQSKD6JF%2FEOAPmCmYI8vDql4XRiAKL0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;자이제 보면 a는 A::Func() 0x009a12ee를 가리키고있고 b는 B::Func() 0x009a1366을 가리키고 있습니다.&lt;br /&gt;재정의 하지 않았을때 B의 Func()는 A의 Func() 포인터를 가리키고 있었지만 재정의하면서 B의 Func()를 가리킵니다.&lt;/p&gt;
&lt;p&gt;이렇게 가상 함수테이블에 가상 함수 포인터가 추가되기 때문에 자기의 클래스에 맞는 함수를 찾아갑니다.&lt;/p&gt;
&lt;p&gt;그럼 A의 클래스를 100개 만들면 가상함수테이블도 100개 만들어질까???&lt;br /&gt;답은 X입니다.&lt;br /&gt;가상 함수 테이블은 가상 함수가 있는 클래스마다 1개씩만 생성이됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1588420004360&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main()
{
	A a1;
	A a2;
	A a3;
	A a4;
	B b;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;메인함수를 위와 같이 수정후 실행하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pcGr5/btqDQc3P2ZD/UIBPgWAyi6V0RACF53l6l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pcGr5/btqDQc3P2ZD/UIBPgWAyi6V0RACF53l6l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pcGr5/btqDQc3P2ZD/UIBPgWAyi6V0RACF53l6l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpcGr5%2FbtqDQc3P2ZD%2FUIBPgWAyi6V0RACF53l6l0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;가상함수테이블의 주소가 0x00987b34로 다 같은걸 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;))여담&lt;/p&gt;
&lt;p&gt;전 포스트에서 바이트 패딩에 대해 정리했었는데&lt;br /&gt;가장큰 자료형의 크기로 데이터가 정렬이 됬었는데&lt;br /&gt;가상 함수를 사용하면 멤버 변수로 가상함수포인터 __vfptr이 생겼다.&lt;br /&gt;그럼 64비트 환경에서&amp;nbsp;&lt;br /&gt;멤버변수로&amp;nbsp;&lt;br /&gt;int (4byte)&lt;br /&gt;short (2byte)&lt;br /&gt;__vfptr (8byte) 이 있으면 바이트패딩이 이루어질까?&lt;br /&gt;64비트 환경이기에 포인터의 크기는 8바이트&lt;br /&gt;그럼 8(4,2) + 8 = 16이 나와야한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KY5Go/btqDQcJyNtX/zHCJH00cM1O8PxNP5sdcw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KY5Go/btqDQcJyNtX/zHCJH00cM1O8PxNP5sdcw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KY5Go/btqDQcJyNtX/zHCJH00cM1O8PxNP5sdcw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKY5Go%2FbtqDQcJyNtX%2FzHCJH00cM1O8PxNP5sdcw1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;바이트 패딩이 가장 큰 크기인 __vfptr의 크기로 된다.&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/52</guid>
      <comments>https://younggwan.tistory.com/52#entry52comment</comments>
      <pubDate>Sat, 2 May 2020 21:14:04 +0900</pubDate>
    </item>
    <item>
      <title>C++ 자료형의 type을 알아내는 방법 typeid()</title>
      <link>https://younggwan.tistory.com/51</link>
      <description>&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588416675005&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;typeinfo&amp;gt;

class A
{
public:

};



int main()
{
	char _c = '0';
	short _s = 0;
	int _i = 0;
	__int64 _i64 = 0;
	const int _ci = 0;

	std::cout &amp;lt;&amp;lt; typeid(A).name()&amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; typeid(_c).name() &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; typeid(_s).name() &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; typeid(_i).name() &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; typeid(_i64).name() &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; typeid(_ci).name() &amp;lt;&amp;lt; std::endl;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhn2Vq/btqDQtxwgDE/eICERp2BUAHxVI7e451JK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhn2Vq/btqDQtxwgDE/eICERp2BUAHxVI7e451JK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhn2Vq/btqDQtxwgDE/eICERp2BUAHxVI7e451JK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhn2Vq%2FbtqDQtxwgDE%2FeICERp2BUAHxVI7e451JK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;typeinfo 참조&amp;nbsp;&lt;/p&gt;
&lt;p&gt;typeid()를 사용하면 const char* 로 반환받아서 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJkjH0/btqDQ8sULVa/10wk8CRXtaXbj8S7YFcfL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJkjH0/btqDQ8sULVa/10wk8CRXtaXbj8S7YFcfL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJkjH0/btqDQ8sULVa/10wk8CRXtaXbj8S7YFcfL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJkjH0%2FbtqDQ8sULVa%2F10wk8CRXtaXbj8S7YFcfL0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;클래스 같은경우 앞에 class 가 붙어서 출력된다.....&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/51</guid>
      <comments>https://younggwan.tistory.com/51#entry51comment</comments>
      <pubDate>Sat, 2 May 2020 19:55:36 +0900</pubDate>
    </item>
    <item>
      <title>C++ 다형성(Polymorphism)</title>
      <link>https://younggwan.tistory.com/50</link>
      <description>&lt;p&gt;&lt;b&gt;다형성의 사전적 의미&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;프로그램 언어의 다형성은 자료형 체계의 성질을 나타낸다.&lt;br /&gt;언어의 각 요소들(상수, 변수, 식, 오브젝트, 메소드 등등) 다양한 자료형에 속하는 것이 허가되는 성질이다.&lt;br /&gt;원래는 생물학에서 유래된 단어라고 하는데, 동일한 종에 속하는 생물이라 할지라도 다양한 변이를 가지는 형상이라고한다. &lt;br /&gt;영어 단어인 Polymorphis은 여러개를 의미하는 그리스어 'Poly'와 모습, 모양을 뜻하는 그리스어 'Morphism'에서 온 단어로 '여러가지 형태'라는 의미이다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;C++ 언어에서의 다형성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;가상 함수&lt;br /&gt;부모 클래스와 자식 클래스에 동일한 이름의 함수의 다른 작동&amp;nbsp;&lt;/p&gt;
&lt;p&gt;함수 템플릿&lt;br /&gt;동일한 이름의 함수가 다양한 자료형을 처리&lt;/p&gt;
&lt;p&gt;함수 오버로드&lt;br /&gt;동일한 이름의 함수가 다른 작동&lt;/p&gt;
&lt;p&gt;연산자 오버로드&lt;br /&gt;한가지 연산자가 다양한 작동&lt;/p&gt;
&lt;p&gt;함수 이름이 같아도 다른 작업을 하는것을 말한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;코드&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1588407846336&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
public:
	virtual void Func()
	{
		std::cout &amp;lt;&amp;lt; &quot;A함수&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
	A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A생성&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
	~A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A소멸&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
};

class B : public A
{
public:
	void Func() override
	{
		std::cout &amp;lt;&amp;lt; &quot;B함수&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
	B()
	{
		std::cout &amp;lt;&amp;lt; &quot;B생성&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
	~B()
	{
		std::cout &amp;lt;&amp;lt; &quot;B소멸&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
};

int main()
{
	A a;
	a.Func();

	B b;
	b.Func();
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beWA4C/btqDRLcRJuv/HxHF8zrgCKfEIWGVobi74K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beWA4C/btqDRLcRJuv/HxHF8zrgCKfEIWGVobi74K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beWA4C/btqDRLcRJuv/HxHF8zrgCKfEIWGVobi74K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeWA4C%2FbtqDRLcRJuv%2FHxHF8zrgCKfEIWGVobi74K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;같은 이름의 Func() 함수를 호출했지만&lt;br /&gt;A 함수&lt;br /&gt;B 함수&lt;br /&gt;로 출력되고있다.&lt;/p&gt;
&lt;pre id=&quot;code_1588408049096&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
public:
	template &amp;lt;typename T&amp;gt;
	void Func(T _value)
	{
		std::cout &amp;lt;&amp;lt; sizeof(T) &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}

	A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A생성&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
	~A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A소멸&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
};



int main()
{
	char _c = '0';
	short _s = 0 ;
	int _i = 0 ;
	__int64 _i64= 0;

	A a;
	a.Func(_c);
	a.Func(_s);
	a.Func(_i);
	a.Func(_i64);

	return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJjOX/btqDRMQm2zV/FxjupKZoTcwiQtyZEinsQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJjOX/btqDRMQm2zV/FxjupKZoTcwiQtyZEinsQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJjOX/btqDRMQm2zV/FxjupKZoTcwiQtyZEinsQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJjOX%2FbtqDRMQm2zV%2FFxjupKZoTcwiQtyZEinsQK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;같은 이름의 Func() 함수를 호출했지만 매개변수로 여러 타입을 받아왔다.&lt;/p&gt;
&lt;pre id=&quot;code_1588408180760&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
public:
	void Func()
	{
		std::cout &amp;lt;&amp;lt; &quot;A일반 함수&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}

	void Func(char _c)
	{
		std::cout &amp;lt;&amp;lt; &quot;A일반 캐릭터&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}

	void Func(short _s)
	{
		std::cout &amp;lt;&amp;lt; &quot;A일반 쇼트&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}

	void Func(int _i)
	{
		std::cout &amp;lt;&amp;lt; &quot;A일반 인트&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}

	void Func(__int64 _i64)
	{
		std::cout &amp;lt;&amp;lt; &quot;A일반 인트64&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}

	A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A생성&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
	~A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A소멸&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
};



int main()
{
	char _c = '0';
	short _s = 0 ;
	int _i = 0 ;
	__int64 _i64= 0;

	A a;
	a.Func();
	a.Func(_c);
	a.Func(_s);
	a.Func(_i);
	a.Func(_i64);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lZlDO/btqDQbDL9X8/w1dTGQy0U5RRynHvwLa5o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lZlDO/btqDQbDL9X8/w1dTGQy0U5RRynHvwLa5o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lZlDO/btqDQbDL9X8/w1dTGQy0U5RRynHvwLa5o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlZlDO%2FbtqDQbDL9X8%2Fw1dTGQy0U5RRynHvwLa5o1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;같은 이름의 Func() 함수를 호출했지만&lt;br /&gt;매개변수에 타입에 따라 다른 함수가 호출된다.&lt;/p&gt;
&lt;pre id=&quot;code_1588408549760&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
public:
	bool operator==(A&amp;amp; _A)
	{
		std::cout &amp;lt;&amp;lt; &quot;매개변수 A비교&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
		return true;
	}
	bool operator==(int _Value)
	{
		std::cout &amp;lt;&amp;lt; &quot;매개변수 int&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
		return true;
	}

	A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A생성&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
	~A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A소멸&quot; &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; std::endl;
	}
};



int main()
{
	int _i = 0 ;

	A a;

	A aa;

	bool Result;
	Result = (a == aa);
	Result = (a == _i);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p5ehW/btqDSi9pfgw/DcMqrMXd5kWvxlj1NmcC50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p5ehW/btqDSi9pfgw/DcMqrMXd5kWvxlj1NmcC50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p5ehW/btqDSi9pfgw/DcMqrMXd5kWvxlj1NmcC50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp5ehW%2FbtqDSi9pfgw%2FDcMqrMXd5kWvxlj1NmcC50%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;같은 == 연산자를 사용했지만&lt;br /&gt;하나는 A클래스를 받고 다른 하나는 int형을 비교했다.&lt;br /&gt;좀 억지스럽게 보여주려고 만든 코드이니 어떻게 작동하는지만 봐주세요.&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/50</guid>
      <comments>https://younggwan.tistory.com/50#entry50comment</comments>
      <pubDate>Sat, 2 May 2020 17:36:50 +0900</pubDate>
    </item>
    <item>
      <title>C++ Lvalue , Rvalue</title>
      <link>https://younggwan.tistory.com/49</link>
      <description>&lt;p&gt;&lt;b&gt;LVALUE,RVALUE&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;보통 Left Value, Right Value 로 풀어서 씁니다.&amp;nbsp;&lt;br /&gt;그래서 보통 Left Value = Right Value 와 같이&lt;br /&gt;=(대입연산자)를 기준으로 왼쪽 값 Left Value , 오른쪽 값 Right Value 라고 이해할 수 있습니다.&lt;br /&gt;하지만 Lvalue는 = 를 기준으로 왼쪽, 오른쪽 양쪽다 위치할 수 있고, Rvalue는 = 를 기준 오른쪽에만 위치할 수 있습니다.&lt;br /&gt;C++에서는 Lvalue,Rvalue의 L,R을 위치가 아닌 그저 Lvalue,Rvalue 고유명사로 봐주시면 되겠습니다.&lt;/p&gt;
&lt;p&gt;Lvalue는 반드시 명시적인 메모리 공간을 가져야 합니다.&lt;br /&gt;값을 대입 받기 때문입니다.&lt;br /&gt;Rvalue는 잠깐? 사용하고 사라지는 임시값입니다.&lt;br /&gt;Lvalue에 값을 전해줄 수만 있으면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1585982920647&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

int main()
{
	int LValue_int = 10;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lvalue = LValue_int&lt;br /&gt;Rvalue = 10&lt;br /&gt;오류가 나지 않는 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1585983125270&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

int main()
{
	int LValue_int = 10;
	20 = LValue_int;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lvalue = LValue_int&lt;br /&gt;Rvalue = 20&lt;br /&gt;Rvalue가 =(대입연산자) 왼쪽에 위치하기에 오류가 나는 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1585984239438&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

int main()
{
	int Temp = 10;
	++Temp = 20;
	Temp++ = 20;
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그럼 여기서에서 int Temp 는 Lvalue입니다.&lt;br /&gt;그럼 ++Temp, Temp++는 Lvalue일까요 Rvalue일까요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/322sp/btqDcxNcK8J/caPmuFCcezE4XtK2SwO941/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/322sp/btqDcxNcK8J/caPmuFCcezE4XtK2SwO941/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/322sp/btqDcxNcK8J/caPmuFCcezE4XtK2SwO941/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F322sp%2FbtqDcxNcK8J%2FcaPmuFCcezE4XtK2SwO941%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;++Temp는 증가된 자신을 return 하기 때문에 Lvalue 입니다.&lt;br /&gt;Temp++는 증가된 복사본을 return 하기 때문이 Rvalue 입니다.&lt;br /&gt;그래서 위 사진과 같이 ++Temp 에는 = 20 이라는 상수를 받을수 있지만.&lt;br /&gt;Temp++은 Rvalue이기 때문에 20이라는 상수를 받을수가 없습니다.&lt;/p&gt;
&lt;p&gt;Lvalue와 Rvalue 의 구분이 모호할때는 &amp;amp;연산자를 사용하시면 됩니다. &amp;amp;연산자는 주소연산자 이기 때문에 Lvalue를 요구합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8GxUR/btqDaUvQTxX/VDjHu5NTQaX0UZr0F1j7v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8GxUR/btqDaUvQTxX/VDjHu5NTQaX0UZr0F1j7v0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8GxUR/btqDaUvQTxX/VDjHu5NTQaX0UZr0F1j7v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8GxUR%2FbtqDaUvQTxX%2FVDjHu5NTQaX0UZr0F1j7v0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Lvalue 주소를 참조하는 &amp;amp; 연산자가 있다면 Ravlue주소를 참조하는 연산자도 있지않을까&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Rvalue Reference 우측값 참조&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;있다 우측값 참조 &amp;amp;&amp;amp;연산자가 Rvalue를 참조할 수 있는 연산자이다.&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/49</guid>
      <comments>https://younggwan.tistory.com/49#entry49comment</comments>
      <pubDate>Sat, 4 Apr 2020 16:28:44 +0900</pubDate>
    </item>
    <item>
      <title>C++ 상속, 접근 지정자, 다형성</title>
      <link>https://younggwan.tistory.com/48</link>
      <description>&lt;p&gt;&lt;b&gt;상속&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;상속은 기존의 클래스를 받아서 기존의 클래스를 포함한 새로운 클래스를 만드는 행위라고 보면된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1585805210361&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

class Monster
{
public:
	std::string m_Name;
	int m_HP;
	int m_MP;
    
    	int GetHP()
	{
		return m_HP;
	}

	int GetMP()
	{
		return m_MP;
	}
};

class Fighter : public Monster
{
};

class Archer : public Monster
{
};

class Wizard : public Monster
{
};

int main()
{
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Monster를 부모클래스&lt;br /&gt;Fighter, Archer, Wizard 를 자식 클래스라고 봤을때&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Fighter, Archer, Wizard&lt;span&gt; 는 부모클래스인 Monster의 모든 멤버 변수와 멤버 함수를 물려받는다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;상속을 받는 형식은&lt;br /&gt;class 클래스명 : 상속 접근 지정자 부모클래스명&amp;nbsp;&lt;br /&gt;ex) class Wizard : public Monster이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;접근 지정자&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;접근 지정자는 말 그대로 객체의 멤버 변수, 멤버 함수에 접근할 수 있는 권한이다.&lt;/p&gt;
&lt;p&gt;public : 어디서든 접근 가능&lt;br /&gt;private : 기반 클래스에서만 접근 가능&lt;br /&gt;protected : 기반 클래스, 파생 클래스에서 접근 가능&lt;/p&gt;
&lt;p&gt;&lt;b&gt;상속 접근 지정자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;상속 접근 지정자는 부모로 부터 물려받은 멤버 함수와 멤버 객체를 상속 접근 지정자의 형태로 물려받는걸 의미한다.&lt;br /&gt;주의 해야할점은 부모 클래스(기반 클래스) 에서 private로 물려받은 멤버 변수 및 멤버 함수는 private에서 변형되지 않는다.&lt;/p&gt;
&lt;p&gt;우선 순위는&amp;nbsp;&lt;br /&gt;1. private&lt;br /&gt;2. protected&lt;br /&gt;3. public&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 193px;&quot; border=&quot;1&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;상속 접근 지정자&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;부모 클래스(기반 클래스)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;자식 클래스(파생 클래스)의 상속 형태&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 60px;&quot; rowspan=&quot;3&quot;&gt;public&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;public&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;public&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;protected&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;protected&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 49px;&quot; rowspan=&quot;3&quot;&gt;private&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;public&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 15px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 15px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 15px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 14px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 14px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;protected&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 14px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 24px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 64px;&quot; rowspan=&quot;3&quot;&gt;protected&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 24px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;public&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 24px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;protected&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;private&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;protected&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;protected&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1585807118171&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

class Monster
{
public:
	std::string m_Name;
	int m_HP; //public 외부 접근 가능
private:
	int m_MP; //private 외부 접근 불가능 Monster 클래스에서만 접근 가능
protected:
	int m_DEF; //protected 외부 접근 불가능 Monster 클래스와 Monster클래스의 자식 클래스(파생 클래스)에서만 접근 가능 
public:
	int GetHP()
	{
		return m_HP;
	}

	int GetMP()
	{
		return m_MP;
	}

	virtual void Func()
	{
	}
};

class Fighter : public Monster
{
public:
	void Func() override
	{
		m_HP; //public 외부 접근 가능
		m_MP; //private 외부 접근 불가능 Monster 클래스에서만 접근 가능
		m_DEF; //protected 외부 접근 불가능 Monster 클래스, Fighter클래스, FIghter클래스의 자식 클래스에서 접근 가능
	}
};

class Archer : private Monster
{
public:
	void Func() override
	{
		m_HP; //private 외부 접근 불가능 Monster 클래스 Archer클래스에서 접근 가능
		m_MP; //private 외부 접근 불가능 Monster 클래스에서만 접근 가능
		m_DEF; //private 외부 접근 불가능 Monster 클래스 Archer클래스에서 접근 가능
	}
};

class Wizard : protected Monster
{
public:
	void Func() override
	{
		m_HP; //protected 외부 접근 불가능
		m_MP; //private 외부 접근 불가능 Monster 클래스에서만 접근 가능
		m_DEF; //protcted 외부 접근 불가능 Monster 클래스, Wizard클래스, Wizard클래스의 자식 클래스에서 접근 가능
	}
};

int main()
{
	Monster Temp_Monster;
	Fighter Temp_Fighter;
	Archer Temp_Archer;
	Wizard Temp_Wizard;
	
	Temp_Monster.m_HP; //public 외부에서 접근 가능
	Temp_Monster.m_MP; //priavte 외부에서 접근 불가능
	Temp_Monster.m_DEF; //protected 외부에서 접근 불가능

	Temp_Fighter.m_HP; //public 외부에서 접근 가능
	Temp_Fighter.m_MP; //private 외부에서 접근 불가능
	Temp_Fighter.m_DEF; //potected 외부에서 접근 불가능

	Temp_Archer.m_HP; //private 외부에서 접근 불가능
	Temp_Archer.m_MP; //private 외부에서 접근 불가능
	Temp_Archer.m_DEF; //private 외부에서 접근 불가능

	Temp_Wizard.m_HP; //protected 외부에서 접근 불가능
	Temp_Wizard.m_MP; //private 외부에서 접근 불가능
	Temp_Wizard.m_DEF; //protected 외부에서 접근 불가능

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/om5c9/btqC8IWjJY9/pNlNgX3yIyVbGwSM0upkLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/om5c9/btqC8IWjJY9/pNlNgX3yIyVbGwSM0upkLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/om5c9/btqC8IWjJY9/pNlNgX3yIyVbGwSM0upkLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fom5c9%2FbtqC8IWjJY9%2FpNlNgX3yIyVbGwSM0upkLK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8mpZV/btqDaVfS5s6/Z2SgNyhl5pLbwrFzkuNVY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8mpZV/btqDaVfS5s6/Z2SgNyhl5pLbwrFzkuNVY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8mpZV/btqDaVfS5s6/Z2SgNyhl5pLbwrFzkuNVY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8mpZV%2FbtqDaVfS5s6%2FZ2SgNyhl5pLbwrFzkuNVY0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chcxDU/btqC9MX2n9g/6e2G4PjirBW5hvyi2cBaM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chcxDU/btqC9MX2n9g/6e2G4PjirBW5hvyi2cBaM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chcxDU/btqC9MX2n9g/6e2G4PjirBW5hvyi2cBaM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchcxDU%2FbtqC9MX2n9g%2F6e2G4PjirBW5hvyi2cBaM0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Monster의 private 멤버 변수인 m_Mp는 접근이 불가능하다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MUWTj/btqC9zdBdyB/ViAPO7Sw4JJjQccLgp6ZZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MUWTj/btqC9zdBdyB/ViAPO7Sw4JJjQccLgp6ZZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MUWTj/btqC9zdBdyB/ViAPO7Sw4JJjQccLgp6ZZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMUWTj%2FbtqC9zdBdyB%2FViAPO7Sw4JJjQccLgp6ZZ1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;외부에서 접근할때를 보면 상속 접근 지정자에 의해 멤버 변수의 접근 제한이 바뀌어&amp;nbsp;&lt;br /&gt;위와 같이 오류가 발생한다.&lt;/p&gt;
&lt;p&gt;접근 지정자를 명시하지않았을때 클래스와 구조체의 기본 접근 지정자가 다르다.&lt;/p&gt;
&lt;p&gt;class(클래스) : private&lt;br /&gt;struct(구조체) : public&lt;/p&gt;
&lt;p&gt;&lt;b&gt;다형성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;다형성은 형태는 같지만 행동은 다른 특징이라고 말할 수 있습니다.&lt;/p&gt;
&lt;p&gt;C++에서 다형성을 잘 보여주는 예는 Overriding(오버라이딩), Overloading(오버로딩) 으로 말할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1585809169706&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

class Monster
{
public:
	virtual void Attack()
	{
		std::cout &amp;lt;&amp;lt; &quot;나는 Monster 공격합니다.&quot; &amp;lt;&amp;lt; std::endl;
	}

	virtual ~Monster()
	{
	}
};

class Fighter : public Monster
{
public:
	void Attack() override
	{
		std::cout &amp;lt;&amp;lt; &quot;나는 Fighter 공격합니다.&quot; &amp;lt;&amp;lt; std::endl;
	}
};

class Archer : private Monster
{
public:
	void Attack() override
	{
		std::cout &amp;lt;&amp;lt; &quot;나는 Archer 공격합니다.&quot; &amp;lt;&amp;lt; std::endl;
	}
};

class Wizard : protected Monster
{
public:
	void Attack() override
	{
		std::cout &amp;lt;&amp;lt; &quot;나는 Wizard 공격합니다.&quot; &amp;lt;&amp;lt; std::endl;
	}

	void Func()
	{
		std::cout &amp;lt;&amp;lt; &quot;나는 일반 Func입니다.&quot; &amp;lt;&amp;lt; std::endl;
	}
	void Func(int _Value)
	{
		std::cout &amp;lt;&amp;lt; &quot;나는 int를 받는 Func입니다.&quot; &amp;lt;&amp;lt; std::endl;
	}
	void Func(float _Value)
	{
		std::cout &amp;lt;&amp;lt; &quot;나는 float를 받는 Func입니다.&quot; &amp;lt;&amp;lt; std::endl;
	}
};

int main()
{
	Monster Temp_Monster;
	Fighter Temp_Fighter;
	Archer Temp_Archer;
	Wizard Temp_Wizard;
	
	Temp_Monster.Attack();
	Temp_Fighter.Attack();
	Temp_Archer.Attack();
	Temp_Wizard.Attack();

	std::cout &amp;lt;&amp;lt; std::endl;
	Temp_Wizard.Func();
	Temp_Wizard.Func(10);
	Temp_Wizard.Func(10.0f);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;실행 결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddUtR8/btqDblMc7IG/i4NezkexAKEUShVVlNSskk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddUtR8/btqDblMc7IG/i4NezkexAKEUShVVlNSskk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddUtR8/btqDblMc7IG/i4NezkexAKEUShVVlNSskk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddUtR8%2FbtqDblMc7IG%2Fi4NezkexAKEUShVVlNSskk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;같은 이름의 Attack()을 호출하고&lt;br /&gt;같은 이름의 Func()를 호출했지만 다른 함수를 호출해주고 있는걸 확인할 수 있습니다.&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/48</guid>
      <comments>https://younggwan.tistory.com/48#entry48comment</comments>
      <pubDate>Thu, 2 Apr 2020 15:34:54 +0900</pubDate>
    </item>
    <item>
      <title>벡터(Vector) 덧셈 뺄셈</title>
      <link>https://younggwan.tistory.com/47</link>
      <description>&lt;p&gt;&lt;b&gt;티스토리 앱에서는 수식이 깨져서 보입니다.!&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;b&gt;벡터 덧셈&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;벡터의 덧셈은 각 성분을 더해주면 됩니다.&lt;/p&gt;
&lt;p&gt;게임에서는 벡터의 덧셈을 캐릭터의 이동에 이용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$\mathbf{A} = (A_{x}, A_{y})$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$\mathbf{B} = (B_{x}, B_{y})$&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;$\mathbf A + \mathbf B = (A_{x} + B_{x}, A_{y} + B_{y})$&lt;/p&gt;
&lt;p&gt;예를 들어 A = (3,4) , B = (2,1) 이라고 하면&lt;/p&gt;
&lt;p&gt;A + B = (3 + 2, 4 + 1) = (5,5)가 됩니다.&lt;/p&gt;
&lt;p&gt;A = 파랑선 B = 주황선 A+B = 노랑선&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;532&quot; height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDwMWp/btqCWMQ5WD3/Ivel8dUmICZhDlFk2d1I9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDwMWp/btqCWMQ5WD3/Ivel8dUmICZhDlFk2d1I9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDwMWp/btqCWMQ5WD3/Ivel8dUmICZhDlFk2d1I9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDwMWp%2FbtqCWMQ5WD3%2FIvel8dUmICZhDlFk2d1I9k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;532&quot; height=&quot;477&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;벡터 뺄셈&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;벡터의 뺄셈은 각 성분을 빼주면 됩니다.&lt;/p&gt;
&lt;p&gt;게임에서는 벡터의 뺄셈을 B캐릭터가 A캐릭터를 바라보는 방향을 찾을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$\mathbf{A} = (A_{x}, A_{y})$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;$\mathbf{B} = (B_{x}, B_{y})$&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;$\mathbf A - \mathbf B = (A_{x} - B_{x}, A_{y} - B_{y})$&lt;/p&gt;
&lt;p&gt;예를 들어 A = (3,4) , B = (2,1) 이라고 하면&lt;/p&gt;
&lt;p&gt;A - B = (3 - 2, 4 - 1) = (1,3)가 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;A = 파랑선&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;B = 주황선 A-B = 노랑선&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;519&quot; height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJozR6/btqCSfnsadn/krFprifoBhjROocoUJMNeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJozR6/btqCSfnsadn/krFprifoBhjROocoUJMNeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJozR6/btqCSfnsadn/krFprifoBhjROocoUJMNeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJozR6%2FbtqCSfnsadn%2FkrFprifoBhjROocoUJMNeK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;519&quot; height=&quot;463&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>게임 수학/수학</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/47</guid>
      <comments>https://younggwan.tistory.com/47#entry47comment</comments>
      <pubDate>Tue, 24 Mar 2020 12:26:09 +0900</pubDate>
    </item>
    <item>
      <title>벡터(Vector), 스칼라(Scalar)</title>
      <link>https://younggwan.tistory.com/46</link>
      <description>&lt;p&gt;&lt;b&gt;티스토리 앱에서는 수식이 깨져서 보입니다.!&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;b&gt;벡터(Vector),&amp;nbsp;스칼라(Scalar)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;벡터(vector) : 크기와 방향&lt;br /&gt;스칼라(Scalar) : 크기&lt;br /&gt;쉽게 생각하면 속력과 속도로 비교할수있다.&lt;br /&gt;벡터는 속도 스칼라는 속력이라고 했을때&lt;br /&gt;자동차가 100km/h 속력으로 달리고 있다&amp;nbsp; = 스칼라&amp;nbsp;&lt;br /&gt;자동차가 북쪽 방향으로 100km/h 속도로 달리고 있다 = 벡터&lt;br /&gt;벡터는 크기와 방향을 가지고 스칼라는 크기만 가진 아이이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;벡터(Vector)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;기하학적으로 벡터는 방향을 가진 선분(화살표)로 표현한다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$\vec{\mathbf{A}}$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;벡터의 속성은 '크기', '방향' 이다.&lt;br /&gt;'위치'는 벡터의 속성이 아니다!!!!&lt;/p&gt;
&lt;p&gt;다른 위치에 있더라도 동일한 길이와 방향을 가리키는 벡터들은 동일한 벡터이다.&lt;/p&gt;
&lt;p&gt;아래 사진은 (2,3) 2차원 벡터&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNKicR/btqCENQRzXr/cHa9Pu0LB6bIAb8K3S29R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNKicR/btqCENQRzXr/cHa9Pu0LB6bIAb8K3S29R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNKicR/btqCENQRzXr/cHa9Pu0LB6bIAb8K3S29R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNKicR%2FbtqCENQRzXr%2FcHa9Pu0LB6bIAb8K3S29R1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;430&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;점B에서 A로 향하는 벡터는&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$\vec{\mathbf{BA}}$ B(꼬리), A(머리) 쪽이다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pxuVe/btqCAPWDHtq/mkdxZiEnk12EYfvnYlEW6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pxuVe/btqCAPWDHtq/mkdxZiEnk12EYfvnYlEW6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pxuVe/btqCAPWDHtq/mkdxZiEnk12EYfvnYlEW6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpxuVe%2FbtqCAPWDHtq%2FmkdxZiEnk12EYfvnYlEW6k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;2차원 벡터는&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;$\mathbf{A} = (A_{x}, A_{y})$&lt;/p&gt;
&lt;p&gt;3차원 벡터는&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$\mathbf{A} = (A_{x}, A_{y}, A_{z})$&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;벡터의 크기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;벡터의 크기는 방향을 가진 선분의 길이이다.&lt;/p&gt;
&lt;p&gt;벡터의 크기를 구하는 식은 아래와 같다.&lt;/p&gt;
&lt;p&gt;$|\mathbf{A}| = \sqrt{A_{x}^{2} + A_{y}^{2} + A_{z}^{2} }$&lt;/p&gt;
&lt;p&gt;(3,4,5)짜리 3차원 벡터가 있을때 벡터의 크기는&lt;br /&gt;벡터의 크기 = (3*3) + (4*4) + (5*5)&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$5\sqrt{2} = \sqrt{25 * 2} = \sqrt{50}$&lt;/span&gt; =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;9 + 16 + 25&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;그럼 이 벡터는 x(3), y(4), z(5)의 방향과 $5\sqrt{2}$ 크기를 가진 벡터이다.&lt;/p&gt;
&lt;p&gt;보통 방향 벡터는 단위 벡터로 표현하는데.&lt;/p&gt;
&lt;p&gt;단위 벡터란 벡터를 정규화 시킨것이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;벡터의 정규화&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;벡터의 크기를 1로 만들어 단위 벡터가 되도록 하는 것이다.&lt;/p&gt;
&lt;p&gt;벡터의 크기로 x,y,z 각 성분을 나누어주면 정규화가 된다.&lt;/p&gt;
&lt;p&gt;정규화 수식은 $\hat{\mathbf{A}} = \frac{\mathbf{A}}{|\mathbf{A}|}= (\frac{A_{x}}{|\mathbf{A}|}, \frac{A_{y}}{|\mathbf{A}|}, \frac{A_{z}}{|\mathbf{A}|})$ 과 같다.&lt;/p&gt;
&lt;p&gt;아까의 3차원 벡터인 (3,4,5)를 정규화 시켜보면&lt;/p&gt;
&lt;p&gt;$\hat{\mathbf{A}} = \frac{\mathbf{A}}{5\sqrt{2}} = (\frac{3}{5\sqrt{2}}, \frac{4}{5\sqrt{2}}, \frac{1}{\sqrt{2}})$이 된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;스칼라&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;벡터가 크기와 방향이 있다면&lt;/p&gt;
&lt;p&gt;스칼라는 크기만 있는 물리량 그저 숫자이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;벡터와 스칼라 연산&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;v라는 벡터와 S라는 스칼라값이 있을때&lt;br /&gt;스칼라는 벡터와 곱셈 연산을 통해 벡터의 크기를 조정하는데 사용된다.&lt;br /&gt;$S\mathbf{v} = (Sv_x, Sv_y, Sv_z)$ 모든 성분에 같은 값을 곱해주기에 &lt;br /&gt;$S &amp;gt; 0$이면 방향에는 영향이 없지만 $S &amp;lt; 0$ 이면 v벡터의 방향이 뒤집힌다.&lt;/p&gt;
&lt;p&gt;만약 S에다가 -1을 대입하면?? v의 역벡터가 된다.&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;$-\mathbf{v} = (-v_x, -v_y, -v_z)$&lt;/span&gt;&lt;/p&gt;</description>
      <category>게임 수학/수학</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/46</guid>
      <comments>https://younggwan.tistory.com/46#entry46comment</comments>
      <pubDate>Wed, 11 Mar 2020 23:18:16 +0900</pubDate>
    </item>
    <item>
      <title>C++ 상속시 부모 클래스 소멸자에 virtual(가상 키워드)를 사용해야 하는 이유</title>
      <link>https://younggwan.tistory.com/45</link>
      <description>&lt;p&gt;&lt;b&gt;상속 받은 클래스의 생성자 소멸자 호출 순서&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583919415065&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class A
{
}

class B : public A
{
}

class C : public B
{
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 클래스들이 있을때&lt;/p&gt;
&lt;p&gt;CChild cc 클래스를 생성하면 생성자 호출 순서는&lt;/p&gt;
&lt;p&gt;A -&amp;gt; B -&amp;gt; C&amp;nbsp;&lt;/p&gt;
&lt;p&gt;소멸자 호출 순서는&lt;/p&gt;
&lt;p&gt;C -&amp;gt; B -&amp;gt; A 이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;부모 클래스 소멸자에 virtual 사용해야 하는 이유&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583919684485&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A* Parent = new C()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;부모 클래스의 포인터로 자식 클래스를 호출할때&lt;br /&gt;가상 함수로 정의되지 않은 자식 클래스의 함수를 호출하면 부모 클래스의 멤버 함수가 호출된다.&lt;br /&gt;소멸자도 자식 클래스의 소멸자가아닌 부모클래스의 소멸자가 호출이된다.&lt;/p&gt;
&lt;p&gt;가상 함수로 소멸자가 사용되었다면 자식 클래스에서 재정의 될 수 있음을 명시하기 때문에 자식 클래스의 소멸자부터 차례대로 부모 클래스의 소멸자가 호출된다.&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;디폴트 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583918834585&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
public:
	A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
};

class B : public A
{
public:
	B()
	{
		std::cout &amp;lt;&amp;lt; &quot;B생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
};

class C : public B
{
public:
	C()
	{
		std::cout &amp;lt;&amp;lt; &quot;C생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
};

int main()
{
	A* a = static_cast&amp;lt;A*&amp;gt;(new C());
	std::cout &amp;lt;&amp;lt; std::endl;
	delete a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;결과&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;110&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfveIN/btqCB82nghj/kJkF7SIG9U9o9rgHRZ8LJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfveIN/btqCB82nghj/kJkF7SIG9U9o9rgHRZ8LJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfveIN/btqCB82nghj/kJkF7SIG9U9o9rgHRZ8LJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfveIN%2FbtqCB82nghj%2FkJkF7SIG9U9o9rgHRZ8LJk%2Fimg.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;110&quot; data-filename=&quot;blob&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;생성자 호출 순서&lt;/p&gt;
&lt;p&gt;&lt;b&gt;소멸자 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583919018217&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
public:
	A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
	~A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A소멸자&quot; &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; std::endl;
	}
};

class B : public A
{
public:
	B()
	{
		std::cout &amp;lt;&amp;lt; &quot;B생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
	~B()
	{
		std::cout &amp;lt;&amp;lt; &quot;B소멸자&quot; &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; std::endl;
	}
};

class C : public B
{
public:
	C()
	{
		std::cout &amp;lt;&amp;lt; &quot;C생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
	~C()
	{
		std::cout &amp;lt;&amp;lt; &quot;C소멸자&quot; &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; std::endl;
	}
};

int main()
{
	A* a = static_cast&amp;lt;A*&amp;gt;(new C());
	std::cout &amp;lt;&amp;lt; std::endl;
	delete a;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;125&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQWAzr/btqCF72fbl5/sdhS8H6XWwM8lx9jetHz11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQWAzr/btqCF72fbl5/sdhS8H6XWwM8lx9jetHz11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQWAzr/btqCF72fbl5/sdhS8H6XWwM8lx9jetHz11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQWAzr%2FbtqCF72fbl5%2FsdhS8H6XWwM8lx9jetHz11%2Fimg.png&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;125&quot; data-filename=&quot;blob&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;일반 소멸자&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Virtual 소멸자 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583919093869&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

class A
{
public:
	A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
	virtual ~A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A소멸자&quot; &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; std::endl;
	}
};

class B : public A
{
public:
	B()
	{
		std::cout &amp;lt;&amp;lt; &quot;B생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
	~B()
	{
		std::cout &amp;lt;&amp;lt; &quot;B소멸자&quot; &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; std::endl;
	}
};

class C : public B
{
public:
	C()
	{
		std::cout &amp;lt;&amp;lt; &quot;C생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
	~C()
	{
		std::cout &amp;lt;&amp;lt; &quot;C소멸자&quot; &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; std::endl;
	}
};

int main()
{
	A* a = static_cast&amp;lt;A*&amp;gt;(new C());
	std::cout &amp;lt;&amp;lt; std::endl;
	delete a;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;198&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Llxdo/btqCD9zL6we/RMz1g22scZR5BRKqdy8qK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Llxdo/btqCD9zL6we/RMz1g22scZR5BRKqdy8qK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Llxdo/btqCD9zL6we/RMz1g22scZR5BRKqdy8qK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLlxdo%2FbtqCD9zL6we%2FRMz1g22scZR5BRKqdy8qK1%2Fimg.png&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;198&quot; data-filename=&quot;blob&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;자식 부터 차례대로 소멸자 호출.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;만약 virtual 키워드가 B클래스에 달린다면?&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583920378443&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main()
{
	A* a = static_cast&amp;lt;A*&amp;gt;(new C());
	B* b = (B*)a;
	C* c = (C*)a;
	std::cout &amp;lt;&amp;lt; std::endl;
	delete a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;B*, C*를 추가해 a의 주소값을 가져왔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci7nkw/btqCENJUQrJ/v6n1CkmSz8t5cj4vcsK5hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci7nkw/btqCENJUQrJ/v6n1CkmSz8t5cj4vcsK5hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci7nkw/btqCENJUQrJ/v6n1CkmSz8t5cj4vcsK5hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci7nkw%2FbtqCENJUQrJ%2Fv6n1CkmSz8t5cj4vcsK5hk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위 사진과 같이 a,b,c의 주소값이 동일한걸 확인 할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583920472026&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class A
{
public:
	A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
	~A()
	{
		std::cout &amp;lt;&amp;lt; &quot;A소멸자&quot; &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; std::endl;
	}
};

class B : public A
{
public:
	B()
	{
		std::cout &amp;lt;&amp;lt; &quot;B생성자&quot; &amp;lt;&amp;lt; std::endl;
	}
	virtual ~B()
	{
		std::cout &amp;lt;&amp;lt; &quot;B소멸자&quot; &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; std::endl;
	}
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A클래스 소멸자에 있던 virtual 키워드를 B클래스 소멸자로 옮겨보았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mBYcj/btqCAQBciUe/lMQUJlOgU9Pt6Urbbuq2lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mBYcj/btqCAQBciUe/lMQUJlOgU9Pt6Urbbuq2lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mBYcj/btqCAQBciUe/lMQUJlOgU9Pt6Urbbuq2lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmBYcj%2FbtqCAQBciUe%2FlMQUJlOgU9Pt6Urbbuq2lk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;b와c의 주소 값이 a와 달라진걸 확인 할 수 있다.&lt;/p&gt;
&lt;p&gt;이 상태에서 delete a를하게 되면 에러가 발생한다.&lt;/p&gt;
&lt;pre id=&quot;code_1583920865314&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main()
{
	//A* a = static_cast&amp;lt;A*&amp;gt;(new C());
	A* a = reinterpret_cast&amp;lt;A*&amp;gt;(new C());
	B* b = (B*)a;
	C* c = (C*)a;
	std::cout &amp;lt;&amp;lt; std::endl;
	delete a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;cast방식을 reinterpret로 cast를 진행하면 에러는 발생하지 않지만&lt;br /&gt;소멸자는 A클래스의 소멸자가 호출이된다.&lt;/p&gt;
&lt;p&gt;new C를 하는순간 가상함수 테이블이 생성되는데&lt;br /&gt;A에는 가상함수가 없어서 가상함수 테이블이 생성되지 않고 가상함수 포인터 (vfptr을 가지고 있지 않는다)&lt;br /&gt;또한 MSDN을 살펴보면 static_cast 를 하는순간 포인터의 주소가 변경될 수 있어서 위험하다고 명시하고있다!&lt;br /&gt;그래서 a의 소멸자가 호출 되는 순간 펑!&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/45</guid>
      <comments>https://younggwan.tistory.com/45#entry45comment</comments>
      <pubDate>Wed, 11 Mar 2020 19:02:31 +0900</pubDate>
    </item>
    <item>
      <title>C++ 자식 클래스(파생)에서 부모 클래스(기초)의 이름이 같은 함수 불러오기</title>
      <link>https://younggwan.tistory.com/44</link>
      <description>&lt;p&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583746257969&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

class Status
{
public:
	void Move()
	{
		printf(&quot;Status\n&quot;);
	}
};

class Monster
{
public:
	void Move()
	{
		printf(&quot;Monster\n&quot;);
	}
};

class Slime : public Monster, public Status
{
public:
	void Move()
	{
		printf(&quot;Slime\n&quot;);
	}
	void move()
	{
		printf(&quot;slime\n&quot;);
	}
};

int main()
{
	Slime a;
	a.Move();
	a.move();
	a.Monster::Move();
	a.Status::Move();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA0Mhd/btqCDktF211/5PnD1BofRTpxG636vYGT60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA0Mhd/btqCDktF211/5PnD1BofRTpxG636vYGT60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA0Mhd/btqCDktF211/5PnD1BofRTpxG636vYGT60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA0Mhd%2FbtqCDktF211%2F5PnD1BofRTpxG636vYGT60%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/44</guid>
      <comments>https://younggwan.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 9 Mar 2020 18:32:58 +0900</pubDate>
    </item>
    <item>
      <title>메모리 단편화(Memory Fragmentation)</title>
      <link>https://younggwan.tistory.com/43</link>
      <description>&lt;p&gt;&lt;b&gt;단편화(Fragmentation)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;RAM에서 공간이 작은 조각으로 나누어져 사용 가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태이다.&lt;/p&gt;
&lt;p&gt;단편화는 내부, 외부 단편화가 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;내부 단편화(Internal Frammentation)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;메모리를 할당할 때 프로세스의 메모리가 필요한 양보다 더많이 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 현상이다.&lt;/p&gt;
&lt;p&gt;운영체제가 프로세스에 30mb를 할당 해줬을때, 사실상 20mb만 사용하고 있을 경우 내부 단편화가 10mb만큼 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2mCGC/btqCymfBBHc/aIo7JkKSUKH0Ame7Kotsh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2mCGC/btqCymfBBHc/aIo7JkKSUKH0Ame7Kotsh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2mCGC/btqCymfBBHc/aIo7JkKSUKH0Ame7Kotsh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2mCGC%2FbtqCymfBBHc%2FaIo7JkKSUKH0Ame7Kotsh1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;30mb의 빈공간에 20mb크기의 프로세스4가 할당되면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLgjmt/btqCB9eL1rH/8fSRpxaUmpkqvjY39ghcX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLgjmt/btqCB9eL1rH/8fSRpxaUmpkqvjY39ghcX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLgjmt/btqCB9eL1rH/8fSRpxaUmpkqvjY39ghcX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLgjmt%2FbtqCB9eL1rH%2F8fSRpxaUmpkqvjY39ghcX0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;10mb의 내부 단편화가 일어나게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;외부 단편화(External Fragmentation)&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;프로세스들의 메모리를 할당하고 난 다음 아주 작은 크기로 남은 조각들이 생겨 사용할 수 없는 작은 메모리 공간들이 생길수 있는데. 이 공간들을 합쳐서 새로운 프로세스가 요구하는 메모리의 크기를 할당할 수 있음에도 불구하고 연속적인 공간이 아니라서 할당을 하지 못하는 경우다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRV1wW/btqCB7Bg3la/P8fNtWTT5k1WeUNUTpD9y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRV1wW/btqCB7Bg3la/P8fNtWTT5k1WeUNUTpD9y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRV1wW/btqCB7Bg3la/P8fNtWTT5k1WeUNUTpD9y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRV1wW%2FbtqCB7Bg3la%2FP8fNtWTT5k1WeUNUTpD9y0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;10mb + 10mb = 20mb의 크기가 남아있지만&lt;br /&gt;20mb의 메모리가 필요한 프로세스4 는 할당 될 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;문제 해결 방법&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;문제 해결 방법으로는 페이징(Paging), 세그멘테이션(Segmentation), 메모리 풀(Memory Pool) 이 있다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;페이징(Paging)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;가상메모리사용, 외부 단편화 해결, 내부 단편화 존재&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;보조기억장치를 이용한 가상메모리를&amp;nbsp;같은 크기의 블록으로 나눈 것을 페이지라고 하고 RAM을 페이지와 같은 크기로 나눈 것을 프레임이라고 할 때,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;페이징 기법이란 사용하지 않는 프레임을 페이지에 옮기고, 필요한 메모리를 페이지 단위로 프레임에 옮기는 기법.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;페이지와 프레임을 대응시키기 위해 page mapping과정이 필요해서 paging table을 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;페이징 기법을 사용하면&amp;nbsp;연속적이지 않은 공간도 활용할 수 있기 때문에 외부 단편화 문제를 해결할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;대신 페이지 단위에 알맞게 꽉채워 쓰는게 아니므로 내부 단편화 문제는 여전히 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;*&amp;nbsp;페이지 단위를 작게하면 내부 단편화 문제도 해결할 수 있겠지만&amp;nbsp;대신 page mapping 과정이 많아지므로 오히려 효율이 떨어질 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;세그멘테이션(Segmentation)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;가상메모리사용, 외부 단편화 존재, 내부 단편화 해결&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;페이징기법에서 가상메모리를 같은 크기의 단위로 분할했지만 세그멘테이션기법에서는 가상메모리를&amp;nbsp;서로 크기가 다른 논리적 단위인 세그먼트로 분할해서 메모리를 할당하여 실제 메모리 주소로 변환을 하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;각 세그먼트는&amp;nbsp;연속적인 공간에 저장되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;세그먼트들의 크기가 다르기 때문에 미리 분할해 둘 수 없고 메모리에 적재될 때 빈 공간을 찾아 할당하는 기법이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;마찬가지로 mapping을 위해 세그먼트 테이블이 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;(각 세그먼트 항목별 세그먼트 시작주소와 세그먼트의 길이 정보를 가지고 있음)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;프로세스가 필요한 메모리 만큼 할당해주기 때문에 내부단편화는 일어나지 않으나 여전히 중간에 프로세스가 메모리를 해제하면 생기는 구멍, 즉 외부 단편화 문제는 여전히 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;메모리 풀(Memory Pool)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;가상메모리사용, 외부 단편화 해결, 내부 단편화 해결&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;필요한 메모리 공간을 필요한 크기, 개수 만큼 사용자가 직접 지정하여 미리 할당받아 놓고 필요할 때마다 사용하고 반납하는 기법&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;메모리 풀 없이 동적할당과 해제를 반복하면 메모리의 랜덤한(실제로는 알고리즘에 의한) 위치에 할당과 해제가 반복되면서 단편화를 일으킬 수 있겠지만 미리 공간을 할당해놓고 가져다 쓰고 반납하기 때문에 할당과 해제로 인한 외부 단편화가 발생하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;또한 필요한 크기만큼 할당을 해놓기 때문에 내부 단편화 또한 생기지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;하지만 메모리 단편화로 인한 메모리 낭비량보다 메모리 풀을 만들었지만 쓰지 않았을 때 메모리 양이 커질 경우 사용하지 않아야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;메모리의 할당, 해제가 잦은 경우에 메모리 풀을 쓰면 효과적이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;미리 할당해놓고 사용하지 않는 순간에도 계속 할당해놓으므로 메모리 누수가 있는 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;메모리 풀(Memory Pool) 구현 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 큰 메모리 블록(페이지)을 힙으로 부터 할당&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 할당 받은 페이지를 각 객체의 크기의 블록으로 나눔&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 각 객체를 위한 블록을 순차적으로 링크&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 이 때 현 시점에서 할당할 블록을 특정 포인터가 가리키게 함&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 메모리 요청이 생기면 현재 헤더 포인터가 가리키는 블록을 돌려준다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 할당이 일어난 후 헤더 포인터는 할당 직전에 가리키던 블록이 가리키던 블록을 가리킨다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;- 사용되던 메모리가 해제되어 메모리 풀로 돌아올 경우 헤더 포인터는 그 블록을 가리키고 방금 전까지 헤더 포인터가 가리키던 블록을 돌아온 블록의 다음 포인터가 가리키게 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;출처 :&lt;/b&gt; &lt;a href=&quot;https://jeong-pro.tistory.com/91&quot;&gt;https://jeong-pro.tistory.com/91&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/43</guid>
      <comments>https://younggwan.tistory.com/43#entry43comment</comments>
      <pubDate>Mon, 9 Mar 2020 15:07:25 +0900</pubDate>
    </item>
    <item>
      <title>C++ 콘스트(const)</title>
      <link>https://younggwan.tistory.com/42</link>
      <description>&lt;p&gt;&lt;b&gt;콘스트(const)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;변수를 상수화 하기 위해 사용된다. 쓰이는 위치에 따라서 용도가 달라진다.&lt;/p&gt;
&lt;p&gt;* 앞 뒤로 구별하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;const * 상수 데이터&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583694901415&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

int main()
{
	int TempValue = 10;
	int TempValue2 = 20;

	const int* TempPoint1 = &amp;amp;TempValue;
	int const* TempPoint2 = &amp;amp;TempValue;

	TempPoint1 = &amp;amp;TempValue2;
	*TempPoint1 = 30;

	TempPoint2 = &amp;amp;TempValue2;
	*TempPoint2 = 30;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;포인터주소의 값이 불변이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 54px;&quot; border=&quot;1&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 14px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 14px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 14px; text-align: center;&quot;&gt;수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;포인터 변수&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;포인터 주소의 값&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1blIc/btqCz5RsZF8/CTrxPuQQJyAKB8SXR43EoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1blIc/btqCz5RsZF8/CTrxPuQQJyAKB8SXR43EoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1blIc/btqCz5RsZF8/CTrxPuQQJyAKB8SXR43EoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1blIc%2FbtqCz5RsZF8%2FCTrxPuQQJyAKB8SXR43EoK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;주소의 값을 변경하려면 에러가 뜬다.&lt;br /&gt;*앞에 const가 위치하면 되기에&lt;br /&gt;const int *&lt;br /&gt;int const *&amp;nbsp;&lt;br /&gt;같다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;* const 상수 포인터&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583695379057&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

int main()
{
	int TempValue = 10;
	int TempValue2 = 20;

	int* const TempPoint1 = &amp;amp;TempValue;

	TempPoint1 = &amp;amp;TempValue2;
	*TempPoint1 = 30;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;포인터 변수가 불변이 된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 60px;&quot; border=&quot;1&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;포인터 변수&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;포인터 주소의 값&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px; text-align: center;&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RvAHg/btqCz6W78Jg/B18wyzVjK85Q3hJC3lFNO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RvAHg/btqCz6W78Jg/B18wyzVjK85Q3hJC3lFNO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RvAHg/btqCz6W78Jg/B18wyzVjK85Q3hJC3lFNO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRvAHg%2FbtqCz6W78Jg%2FB18wyzVjK85Q3hJC3lFNO1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;포인터 변수를 변경하려고 하면 에러가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;const * const&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;포인터 변수, 포인터 주소의 값 둘다 불변이 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1583695559147&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

int main()
{
	int TempValue = 10;
	int TempValue2 = 20;

	const int* const TempPoint1 = &amp;amp;TempValue;

	TempPoint1 = &amp;amp;TempValue2;
	*TempPoint1 = 30;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OIuOH/btqCymzFvDR/E0K0Fkm95jvPgOJhnebS50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OIuOH/btqCymzFvDR/E0K0Fkm95jvPgOJhnebS50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OIuOH/btqCymzFvDR/E0K0Fkm95jvPgOJhnebS50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOIuOH%2FbtqCymzFvDR%2FE0K0Fkm95jvPgOJhnebS50%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;포인터 변수, 포인터 주소의 값 둘다 변경하려고하면 에러가 발생한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;포인터 변수&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;포인터 주소의 값&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/42</guid>
      <comments>https://younggwan.tistory.com/42#entry42comment</comments>
      <pubDate>Mon, 9 Mar 2020 04:26:55 +0900</pubDate>
    </item>
    <item>
      <title>C++ 바이트 패딩(Byte Padding)</title>
      <link>https://younggwan.tistory.com/41</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;바이트 패딩(Byte Padding)&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;클래스(구조체)에 &amp;nbsp;패딩 바이트를 추가하여 CPU 접근을 더 용이하게 해주는 기법&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583685748240&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

class TestClass
{
	char m_Temp_Char[2];
	int m_Temp_Int;
	short m_Temp_Short1;
	short m_Temp_Short2;
	short m_Temp_Short3;
};

int main()
{
	TestClass TempTestClass;
	int Size_1 = sizeof(TempTestClass);
	std::cout &amp;lt;&amp;lt; Size_1 &amp;lt;&amp;lt; std::endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TestClass의 크기는?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. char m_ char m_Temp_Char[2];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. int m_Temp_Int; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. short m_Temp_Short1; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. short m_Temp_Short2; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. short m_Temp_Short3;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1 = 2byte&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2 = 4byte&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3 = 2byte&lt;br /&gt;4 = 2byte&lt;br /&gt;5 = 2byte&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2 + 4 + 2 + 2 + 2 = 12byte라고 생각할 수 도 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 답은&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqMGlG/btqCwX8e4jX/TjP6g9RvZvbhDm0MmCofl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqMGlG/btqCwX8e4jX/TjP6g9RvZvbhDm0MmCofl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqMGlG/btqCwX8e4jX/TjP6g9RvZvbhDm0MmCofl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqMGlG%2FbtqCwX8e4jX%2FTjP6g9RvZvbhDm0MmCofl0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바이트 패딩이란 한번 연산에 하나의 값이 들어가게끔 패딩 바이트를 추가해주는건데.&lt;br /&gt;&lt;br /&gt;1. char m_ char m_Temp_Char[2];&amp;nbsp;&amp;nbsp;&lt;br /&gt;2. int m_Temp_Int;&amp;nbsp;&lt;br /&gt;3. short m_Temp_Short1;&amp;nbsp;&lt;br /&gt;4. short m_Temp_Short2;&amp;nbsp;&lt;br /&gt;5. short m_Temp_Short3;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제일 큰 단위인 int의 크기를 따라가게된다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;크기가 12바이트 라고 생각했을때의 메모리 구조는&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZwbiL/btqCyml9ux7/GDu4kVPMYUQafNGEqxFTqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZwbiL/btqCyml9ux7/GDu4kVPMYUQafNGEqxFTqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZwbiL/btqCyml9ux7/GDu4kVPMYUQafNGEqxFTqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZwbiL%2FbtqCyml9ux7%2FGDu4kVPMYUQafNGEqxFTqk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바이트 패딩이 일어난 TestClass의 메모리구조는 아래와 같이 구성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p0Efc/btqCAPgxC1G/4g3hEFfcvBd0OPSz90cwS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p0Efc/btqCAPgxC1G/4g3hEFfcvBd0OPSz90cwS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p0Efc/btqCAPgxC1G/4g3hEFfcvBd0OPSz90cwS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp0Efc%2FbtqCAPgxC1G%2F4g3hEFfcvBd0OPSz90cwS1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가장 큰 크기인 int형 4바이트 크기에 맞춰 위와 같이 패딩 바이트를 추가하여 메모리는 더 사용하나 속도는 빨라집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바이트 패딩을 고려한 구조&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583686709363&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

class TestClass
{
	char m_Temp_Char[2];
    	short m_Temp_Short1;
	short m_Temp_Short2;
	short m_Temp_Short3;
	int m_Temp_Int;
};

int main()
{
	TestClass TempTestClass;
	int Size_1 = sizeof(TempTestClass);
	std::cout &amp;lt;&amp;lt; Size_1 &amp;lt;&amp;lt; std::endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. char m_ char m_Temp_Char[2];&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. short m_Temp_Short1;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. short m_Temp_Short2;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. short m_Temp_Short3;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. int m_Temp_Int;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1 = 2byte&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2 = 2byte&lt;br /&gt;3 =&lt;span&gt;&amp;nbsp;&lt;/span&gt;2byte&lt;br /&gt;4 =&lt;span&gt;&amp;nbsp;&lt;/span&gt;2byte&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5 = 4byte&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4byte씩 딱 떨어지기에 Class의 크기는 12byte로 4byte 줄어들었습니다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mFFBH/btqCxPowWEn/WrUVR8kdu78ue2JRK351YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mFFBH/btqCxPowWEn/WrUVR8kdu78ue2JRK351YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mFFBH/btqCxPowWEn/WrUVR8kdu78ue2JRK351YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmFFBH%2FbtqCxPowWEn%2FWrUVR8kdu78ue2JRK351YK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/41</guid>
      <comments>https://younggwan.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 9 Mar 2020 02:01:09 +0900</pubDate>
    </item>
    <item>
      <title>C++ #define 매크로 상수, 매크로 함수</title>
      <link>https://younggwan.tistory.com/40</link>
      <description>&lt;p&gt;&lt;b&gt;#define&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;매크로를 정의할 때 앞에 써주는 키워드이다&lt;br /&gt;여기서 매크로는 프로그램 내에서 컴파일러가 매크로를 만났을 때, 대체할 문자열이다&lt;br /&gt;매크로는 컴파일 과정인 &lt;span style=&quot;color: #000000;&quot;&gt;전처리기 -&amp;gt; 컴파일러 -&amp;gt; 어셈블러 -&amp;gt; 링커 중&lt;br /&gt;&lt;/span&gt;전처리기 단계에서 #define으로 정의된 기호 상수 등을 확장 문자열로 변환시키는 동작을 한다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;형식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583670043988&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define NAME = &quot;YOUNGWAN&quot; //매크로 상수
#define PI = 3.14f //매크로 상수
#define func(_a, _b) ((_a) &amp;lt; (_b) ? (_a) : (_b)) //매크로 함수&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;매크로 상수&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;미리 정의한 매크로 상수명이 사용되면 -&amp;gt; 매크로 확장 문자열로 치환을 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;매크로 함수&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;미리 정의한 매크로 함수명이 사용되면 -&amp;gt; &lt;/span&gt;전달인자의 형태를 고려해서 치환하는 동작을 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;장단점?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;프로그램 가독성이 좋아진다&lt;br /&gt;유지보수가 쉬워진다.&lt;br /&gt;변수를 사용하는 것 보다 빠르다고 하지만&amp;nbsp;&lt;br /&gt;#define 보다는 const, enum, inline을 사용하는 것이 좋다고한다.&lt;br /&gt;왜냐하면 위에적은것처럼 #define은 변수가 아닌 단순히 치환되는 형태이기 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;주의사항&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583670370657&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

#define func(_a, _b) ((_a) &amp;lt; (_b) ? (_a) : (_b))

int main()
{
	int temp = 1;
	int Result = func(1, temp++);
    
    ////////이때
    Result;
    temp;
    //두개의 값은?
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;증감 연산자를 사용할때 주의를 해야한다.&lt;br /&gt;Result = 2&lt;br /&gt;temp = 3&lt;br /&gt;이라는 결과가 나올텐데&lt;br /&gt;이것은 temp++이 치환되면서 2가되고 조건문에서 한번더 사용되면서 증감 연산자가 두번 행해진다.&lt;br /&gt;&lt;br /&gt;또 괄호의 유무에도 주의 사항이 있다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583670692414&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;pch.h&quot;
#include &amp;lt;iostream&amp;gt;

#define PLUS1 1 + 2
#define PLUS2 (1 + 2)

int main()
{
	int temp1 = PLUS1 * 5;
	int temp2 = PLUS2 * 5;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;temp1의 경우&lt;br /&gt;1 + 2 * 5 = 11&lt;br /&gt;temp2의 경우&lt;br /&gt;(1 + 2) * 5 = 15&lt;br /&gt;위오 같은 형식으로 작동한다.&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/40</guid>
      <comments>https://younggwan.tistory.com/40#entry40comment</comments>
      <pubDate>Sun, 8 Mar 2020 21:33:24 +0900</pubDate>
    </item>
    <item>
      <title>C++ 얕은복사(Shallow Copy) 깊은복사(Deep Copy)</title>
      <link>https://younggwan.tistory.com/39</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;깊은 복사와 얕은 복사&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;객체는 다른 객체를 참조할 수 있는데 이럴 경우에 깊은 복사인가, 얕은 복사인가에 따라 결과값이 달라질 수 있으니 주의해야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;복사를 한다는 것은 기존 객체와 같은 값을 가진 새로운 객체로 만든다는 것&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;객체들은 멤버를 가지고 있고 그 멤버들은 값일 수도 있고 참조 형식일 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 바로 이 객체들이 가진 값 형식과 참조 형식의 복제 방식에 따라 얕은 복사와 깊은 복사의 개념이 나누어지게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;얕은 복사(Shallow Copy)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;얕은 복사는 객체가 가진 멤버들의 값을 새로운 객체로 복사하는데 만약 객체가 참조타입의 멤버를 가지고 있다면 참조값만 복사가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;얕은 복사 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583429840100&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;memory&amp;gt;

class TestClass
{
public:
	char* m_Name;
	int m_Age;

	void PrintInfo()
	{
		std::cout &amp;lt;&amp;lt; &quot;Name : &quot; &amp;lt;&amp;lt; m_Name &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; &quot;Age  : &quot; &amp;lt;&amp;lt; m_Age &amp;lt;&amp;lt; std::endl;
	}

	TestClass()
	{

	}
	~TestClass()
	{
		std::cout &amp;lt;&amp;lt; &quot;소멸자 호출&quot; &amp;lt;&amp;lt; std::endl;
	}
};

int main()
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
	TestClass A_Class;
	A_Class.m_Name = new char[3];
	strcpy_s(A_Class.m_Name, 3, &quot;YG&quot;);
	A_Class.m_Age = 10;

	A_Class.PrintInfo();

	std::cout &amp;lt;&amp;lt; &quot;B클래스 = A클래스 하고 A클래스 정보를 바꾸면?&quot; &amp;lt;&amp;lt; std::endl;

	TestClass B_Class = A_Class;

	strcpy_s(A_Class.m_Name, 3, &quot;YJ&quot;);
	A_Class.m_Age = 20;

	A_Class.PrintInfo();
	B_Class.PrintInfo();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLwxNr/btqCuZqE7Am/sSMEhK6s0IuoF65rMYIdZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLwxNr/btqCuZqE7Am/sSMEhK6s0IuoF65rMYIdZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLwxNr/btqCuZqE7Am/sSMEhK6s0IuoF65rMYIdZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLwxNr%2FbtqCuZqE7Am%2FsSMEhK6s0IuoF65rMYIdZ0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;A클래스의 이름을 YJ 나이를 20으로 변경했을때&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;A클래스를 얕은복사한 B클래스의 이름까지 바뀐걸 볼수있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본 복사 생성자를 이용했으니 이번엔 얕은 복사 생성자 코드.&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583430076539&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;memory&amp;gt;

class TestClass
{
public:
	char* m_Name;
	int m_Age;

	void PrintInfo()
	{
		std::cout &amp;lt;&amp;lt; &quot;Name : &quot; &amp;lt;&amp;lt; m_Name &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; &quot;Age  : &quot; &amp;lt;&amp;lt; m_Age &amp;lt;&amp;lt; std::endl;
	}

	TestClass()
	{
		std::cout &amp;lt;&amp;lt; &quot;생성자 호출&quot; &amp;lt;&amp;lt; std::endl;
	}

//////////////////////얕은복사
	TestClass(const TestClass&amp;amp; _Value)
	{
		std::cout &amp;lt;&amp;lt; &quot;복사 생성자 호출&quot; &amp;lt;&amp;lt; std::endl;
		m_Age = _Value.m_Age;
		m_Name = _Value.m_Name;
	}

	~TestClass()
	{
		std::cout &amp;lt;&amp;lt; &quot;소멸자 호출&quot; &amp;lt;&amp;lt; std::endl;
	}
};

int main()
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
	TestClass A_Class;
	A_Class.m_Name = new char[3];
	strcpy_s(A_Class.m_Name, 3, &quot;YG&quot;);
	A_Class.m_Age = 10;

	A_Class.PrintInfo();

	TestClass B_Class = A_Class;

	std::cout &amp;lt;&amp;lt; &quot;B클래스 = A클래스 하고 A클래스 정보를 바꾸면?&quot; &amp;lt;&amp;lt; std::endl;


	strcpy_s(A_Class.m_Name, 3, &quot;YJ&quot;);
	A_Class.m_Age = 20;

	A_Class.PrintInfo();
	B_Class.PrintInfo();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duWW9t/btqCrPWMw1x/BQpz1sbGPfVpwJkNy2eEuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duWW9t/btqCrPWMw1x/BQpz1sbGPfVpwJkNy2eEuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duWW9t/btqCrPWMw1x/BQpz1sbGPfVpwJkNy2eEuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduWW9t%2FbtqCrPWMw1x%2FBQpz1sbGPfVpwJkNy2eEuk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빌드시 복사 생성자에 중단점이 걸린걸 확인 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V8J7q/btqCuY6ridB/xJCti2kZiLVOsAnQ3KPdZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V8J7q/btqCuY6ridB/xJCti2kZiLVOsAnQ3KPdZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V8J7q/btqCuY6ridB/xJCti2kZiLVOsAnQ3KPdZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV8J7q%2FbtqCuY6ridB%2FxJCti2kZiLVOsAnQ3KPdZk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;디폴트 복사 생성자는 얕은 복사를 사용하는걸로 확인됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이런 방식에 문제점이 멀까요&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v0r5o/btqCwXlGvFs/Z7aRJRX6MgkDLkE5071jF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v0r5o/btqCwXlGvFs/Z7aRJRX6MgkDLkE5071jF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v0r5o/btqCwXlGvFs/Z7aRJRX6MgkDLkE5071jF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv0r5o%2FbtqCwXlGvFs%2FZ7aRJRX6MgkDLkE5071jF1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1583430387750&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	TestClass A_Class;
	A_Class.m_Name = new char[3];
	strcpy_s(A_Class.m_Name, 3, &quot;YG&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;new char[3] 동적 할당을 하고있어서 릭이 체크되고 있는데&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TestClass는 A_Class, B_Class 두개를 만들었는데&amp;nbsp; 3 bytes long. 만큼만 체크가 되고있습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소멸자에서 릭을 delete 해보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583430448259&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	~TestClass()
	{
		std::cout &amp;lt;&amp;lt; &quot;소멸자 호출&quot; &amp;lt;&amp;lt; std::endl;
		delete[] m_Name;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxOsCS/btqCuYyxXl7/sU2UtSjJK04WjYa11cOuJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxOsCS/btqCuYyxXl7/sU2UtSjJK04WjYa11cOuJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxOsCS/btqCuYyxXl7/sU2UtSjJK04WjYa11cOuJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxOsCS%2FbtqCuYyxXl7%2FsU2UtSjJK04WjYa11cOuJK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;펑 하고 터졌습니다&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;TestClass는 A_Class, B_Class 두개를 만들었는데 얕은 복사를 해서 메모리 참조를 하고있으니&lt;br /&gt;&lt;/span&gt;삭제한 메모리를 한번더 삭제하려고 하니까 터지고있습니다. 그럼 깊은 복사 생성자를 만들어 보겠습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;깊은 복사(Deep Copy)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;깊은 복사 또는 전체 복사.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;얕은 복사와는 달리 객체가 가진 모든 멤버(값과 참조형식 모두)를 복사하는 것을 말합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;객체가 참조 타입의 멤버를 포함할 경우&amp;nbsp;참조값의 복사가 아닌 참조된 객체 자체가 복사되는 것을 깊은 복사라 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;깊은 복사 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1583430729208&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;memory&amp;gt;

class TestClass
{
public:
	char* m_Name;
	int m_Age;

	void PrintInfo()
	{
		std::cout &amp;lt;&amp;lt; &quot;Name : &quot; &amp;lt;&amp;lt; m_Name &amp;lt;&amp;lt; std::endl;
		std::cout &amp;lt;&amp;lt; &quot;Age  : &quot; &amp;lt;&amp;lt; m_Age &amp;lt;&amp;lt; std::endl;
	}

	TestClass()
	{
		std::cout &amp;lt;&amp;lt; &quot;생성자 호출&quot; &amp;lt;&amp;lt; std::endl;
	}

	/////////////////깊은 복사로 바꿈
	TestClass(const TestClass&amp;amp; _Value)
	{
		std::cout &amp;lt;&amp;lt; &quot;복사 생성자 호출&quot; &amp;lt;&amp;lt; std::endl;
		m_Age = _Value.m_Age;
		m_Name = new char[strlen(_Value.m_Name) + 1];
		strcpy_s(m_Name, strlen(_Value.m_Name) + 1, _Value.m_Name);
	}

	~TestClass()
	{
		std::cout &amp;lt;&amp;lt; &quot;소멸자 호출&quot; &amp;lt;&amp;lt; std::endl;
		delete[] m_Name;
	}
};

int main()
{
	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
	TestClass A_Class;
	A_Class.m_Name = new char[3];
	strcpy_s(A_Class.m_Name, 3, &quot;YG&quot;);
	A_Class.m_Age = 10;

	A_Class.PrintInfo();

	TestClass B_Class = A_Class;

	std::cout &amp;lt;&amp;lt; &quot;B클래스 = A클래스 하고 A클래스 정보를 바꾸면?&quot; &amp;lt;&amp;lt; std::endl;


	strcpy_s(A_Class.m_Name, 3, &quot;YJ&quot;);
	A_Class.m_Age = 20;

	A_Class.PrintInfo();
	B_Class.PrintInfo();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucweR/btqCxPno7uW/wz7o8wh3M2RM6yogkeqD71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucweR/btqCxPno7uW/wz7o8wh3M2RM6yogkeqD71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucweR/btqCxPno7uW/wz7o8wh3M2RM6yogkeqD71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FucweR%2FbtqCxPno7uW%2Fwz7o8wh3M2RM6yogkeqD71%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eNpwW4/btqCrNYS73s/dw37paeElNRaNVjrkQThOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eNpwW4/btqCrNYS73s/dw37paeElNRaNVjrkQThOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eNpwW4/btqCrNYS73s/dw37paeElNRaNVjrkQThOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeNpwW4%2FbtqCrNYS73s%2Fdw37paeElNRaNVjrkQThOK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;A클래스의 이름만 수정되고!&lt;br /&gt;B클래스의 이름은 그대로!&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;릭도 남지않고 깔끔하게 프로그램이 종료됬습니다!.&lt;/span&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/39</guid>
      <comments>https://younggwan.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 4 Mar 2020 03:01:39 +0900</pubDate>
    </item>
    <item>
      <title>std::weak_ptr</title>
      <link>https://younggwan.tistory.com/38</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://younggwan.tistory.com/36&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;https://younggwan.tistory.com/36&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;윗 글에서 std::shared_ptr 의 정의와 문제점에대한 정리를 했는데.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;std::shared_ptr의 문제점이 였던 순환 참조 문제를 해결할 수 있는 std::weak_ptr을 정리해 봅시다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;정의&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;weak_ptr은 하나 이상의 shared_ptr 인스턴스가 소유하는 객체에 대한 접근을 제공하지만, 소유자의 수에는 포함되지 않는 스마트 포인터입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;shared_ptr은 참조 횟수(reference count)를 기반으로 동작하는 스마트 포인터입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;만약 서로가 상대방을 가리키는 shared_ptr를 가지고 있다면, 참조 횟수는 절대 0이 되지 않으므로 메모리는 영원히 해제되지 않습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;이렇게 서로가 상대방을 참조하고 있는 상황을 순환 참조(circular reference)라고 합니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;weak_ptr은 바로 이러한 shared_ptr 인스턴스 사이의 순환 참조를 제거하기 위해서 사용됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Ubuntu Condensed&amp;quot;, &amp;quot;Noto Sans Korean&amp;quot;; font-size: 15px;&quot;&gt;멤버 함수&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Ubuntu Condensed, Noto Sans Korean&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;reset : 관리 객체의 소유권을 공개 합니다.&lt;br /&gt;swap : 관리 객체를 교환합니다.&lt;br /&gt;use_count : shared_ptr개체를 관리하는 개체 수를 반환합니다.&lt;br /&gt;expired : 참조된 객체가 삭제되었는지 확인합니다.&lt;br /&gt;lock : shared_ptr로 변환 해서 참조할 수 있게 합니다.(변환이 맞는지는 모르겠습니다)&lt;br /&gt;owner_before : 약한 포인터의 소유자 기반 순서를 제공합니다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Ubuntu Condensed, Noto Sans Korean&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Ubuntu Condensed&amp;quot;, &amp;quot;Noto Sans Korean&amp;quot;; font-size: 15px;&quot;&gt;사용 예제&lt;/b&gt;&lt;/p&gt;&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;/p&gt;&lt;p&gt;#include &amp;lt;memory&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class TestClass&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;std::string name;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;std::weak_ptr&amp;lt;TestClass&amp;gt; m_Other_Class;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void TestFunc()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;std::cout &amp;lt;&amp;lt; &quot;hahaha&quot; &amp;lt;&amp;lt; std::endl;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void Set_Class(std::weak_ptr&amp;lt;TestClass&amp;gt; _Value)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;m_Other_Class = _Value;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void Access_Other_Class()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;std::shared_ptr&amp;lt;TestClass&amp;gt; convert_weak_ptr = m_Other_Class.lock();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (convert_weak_ptr)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;std::cout &amp;lt;&amp;lt; this-&amp;gt;name.c_str() &amp;lt;&amp;lt; &quot; 접근 성공 -&amp;gt; &quot; &amp;lt;&amp;lt; convert_weak_ptr-&amp;gt;name.c_str() &amp;lt;&amp;lt;std::endl;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;else&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;std::cout &amp;lt;&amp;lt; &quot;접근 실패&quot; &amp;lt;&amp;lt; std::endl;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;TestClass(std::string _name) : name(_name)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;std::cout &amp;lt;&amp;lt; this-&amp;gt;name.c_str() &amp;lt;&amp;lt;&quot; 생성자 호출&quot; &amp;lt;&amp;lt; std::endl;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;~TestClass()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;std::cout &amp;lt;&amp;lt; this-&amp;gt;name.c_str() &amp;lt;&amp;lt; &quot; 소멸자 호출&quot; &amp;lt;&amp;lt; std::endl;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;std::shared_ptr&amp;lt;TestClass&amp;gt; T_A = std::make_shared&amp;lt;TestClass&amp;gt;(&quot;A클래스&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;std::shared_ptr&amp;lt;TestClass&amp;gt; T_B = std::make_shared&amp;lt;TestClass&amp;gt;(&quot;B클래스&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;T_A-&amp;gt;Set_Class(T_B);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;T_B-&amp;gt;Set_Class(T_A);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;T_A-&amp;gt;Access_Other_Class();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;T_B-&amp;gt;Access_Other_Class();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;T_B.reset();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;T_A-&amp;gt;Access_Other_Class();&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;font-family: &amp;quot;Ubuntu Condensed&amp;quot;, &amp;quot;Noto Sans Korean&amp;quot;; font-size: 15px;&quot;&gt;결과&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Ubuntu Condensed, Noto Sans Korean&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;A클래스 생성자 호출&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style=&quot;font-size: 15px; font-family: &amp;quot;Ubuntu Condensed&amp;quot;, &amp;quot;Noto Sans Korean&amp;quot;;&quot;&gt;B클래스 생성자 호출&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-family: &amp;quot;Ubuntu Condensed&amp;quot;, &amp;quot;Noto Sans Korean&amp;quot;;&quot;&gt;A클래스 접근 성공 -&amp;gt; B클래스&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-family: &amp;quot;Ubuntu Condensed&amp;quot;, &amp;quot;Noto Sans Korean&amp;quot;;&quot;&gt;B클래스 접근 성공 -&amp;gt; A클래스&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-family: &amp;quot;Ubuntu Condensed&amp;quot;, &amp;quot;Noto Sans Korean&amp;quot;;&quot;&gt;B클래스 소멸자 호출&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-family: &amp;quot;Ubuntu Condensed&amp;quot;, &amp;quot;Noto Sans Korean&amp;quot;;&quot;&gt;접근 실패&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 15px; font-family: &amp;quot;Ubuntu Condensed&amp;quot;, &amp;quot;Noto Sans Korean&amp;quot;;&quot;&gt;A클래스 소멸자 호출&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font face=&quot;Ubuntu Condensed, Noto Sans Korean&quot;&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;순환 참조의 소멸자 호출이 없어서 릭이 남던 문제가 없어지고 정상적으로 작동을 한다.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <category>C++</category>
      <category>std::weak_ptr</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/38</guid>
      <comments>https://younggwan.tistory.com/38#entry38comment</comments>
      <pubDate>Tue, 3 Mar 2020 18:07:27 +0900</pubDate>
    </item>
    <item>
      <title>std::shared_ptr 정의 및 문제점</title>
      <link>https://younggwan.tistory.com/36</link>
      <description>&lt;p&gt;std::shared_ptr은 refrerence-counting smart pointer 중 하나.&lt;br /&gt;std::shared_ptr은 포인터를 통해 객체의 공유 소유권을 유지하는 스마트 포인터이다.&lt;br /&gt;&lt;span&gt;스마트 포인터의 기본적인 특성인 자신이 소멸될 때 가리키고 있는 대상에 대해 자동으로 delete 해줘 메모리 누수 걱정은 없게 작성이 되어 있다.&lt;/span&gt;&lt;br /&gt;여러 shared_ptr 객체가 동일한 객체를 소유 할 수 있고, 객체가 삭제되고 다음 중 하나가 발생하면 메모리가 해재된다.&lt;br /&gt;&amp;nbsp; &amp;nbsp;-마지막으로 남아있는 &lt;span style=&quot;color: #333333;&quot;&gt;shared_ptr을 소유하고 있는 객체가 삭제된다.&lt;br /&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;-마지막으로 남아있는 &lt;span style=&quot;color: #333333;&quot;&gt;shared_ptr을 소유하고 있는 객체가 다른 포인터에 의해 operator= 또는 reset()으로 할당된 경우 객체가 파괴된다.&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;shared_ptr은 다른 객체에 대한 포인터를 저장하는 동안 객체의 소유권을 공유할 수 있으며 이 기능은 개체를 소유하는 동안 개체를 가리키는 데 사용할 수 있다. 저장된 포인터는 get(), 역참조와 비교 연산자에 의해 액세스 된 포인터이다.&lt;br /&gt;&lt;/span&gt;사용된 카운터가 0이 되면 관리되는 포인터는 deleter에 전달된다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;b&gt;멤버 함수&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;get&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;operator*, operator-&amp;gt; : 저장된 포인터를 역참조한다.&lt;br /&gt;operator[]&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 저장된 배열에 대해 인덱스로 접근할 수 있도록 한다.&lt;br /&gt;use_count&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 동일하게 관리되는 객체를 참조하는 &lt;span style=&quot;color: #333333;&quot;&gt;shared_ptr의 수를 반환한다.&lt;br /&gt;unique&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: 관리되는 객체가 오직 현재 shared_ptr 인스터스에서만 관리되는지 확인한다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;operator bool&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 저장된 포인터가 null이 아닌지 체크한다.&lt;br /&gt;owner_before&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 공유 포인터의 소유자 기반 순서를 제공한다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;b&gt;사용 예제&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;memory&amp;gt;&lt;br /&gt;&lt;br /&gt;class&amp;nbsp;TestClass &lt;br /&gt;{ &lt;br /&gt;public: &lt;br /&gt;void&amp;nbsp;TestFunc() &lt;br /&gt;{ &lt;br /&gt;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;hahaha&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;public: &lt;br /&gt;TestClass() &lt;br /&gt;{ &lt;br /&gt;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;생성자&amp;nbsp;호출&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl; &lt;br /&gt;} &lt;br /&gt;~TestClass() &lt;br /&gt;{ &lt;br /&gt;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;소멸자&amp;nbsp;호출&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl; &lt;br /&gt;} &lt;br /&gt;}; &lt;br /&gt;&lt;br /&gt;int&amp;nbsp;main() &lt;br /&gt;{ &lt;br /&gt;_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF&amp;nbsp;|&amp;nbsp;_CRTDBG_LEAK_CHECK_DF); &lt;br /&gt;new&amp;nbsp;int; &lt;br /&gt;std::shared_ptr&amp;lt;TestClass&amp;gt; TempClass(new TestClass()); &lt;br /&gt;TempClass-&amp;gt;TestFunc(); &lt;br /&gt;}&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;b&gt;결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;생성자&amp;nbsp;호출 &lt;br /&gt;hahaha &lt;br /&gt;소멸자&amp;nbsp;호출&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djnkak/btqCtXFgCFm/wzX4uLAjtuq79vrtWjxGsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djnkak/btqCtXFgCFm/wzX4uLAjtuq79vrtWjxGsk/img.png&quot; data-alt=&quot;릭 검출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djnkak/btqCtXFgCFm/wzX4uLAjtuq79vrtWjxGsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdjnkak%2FbtqCtXFgCFm%2FwzX4uLAjtuq79vrtWjxGsk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;릭 검출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;생성자 호출 -&amp;gt; hahaha -&amp;gt; 소멸자 호출이 출력되고&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;동적할당을 &lt;span style=&quot;color: #333333;&quot;&gt;new int, new TestClass() 두가지를 했지만&lt;br /&gt;new TestClass()는 delete삭제가 되고 new int는 삭제가 되지 않아 릭이 남았다.&lt;br /&gt;std::shared_ptr의 래퍼런스 카운트가 0이 되면서 TestClass()를 삭제했기 때문이다.&lt;br /&gt;동적 메모리관리를 이렇게 편하게 할 수 가 있는데. 문제점은 무엇이 있을까?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문제점&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;shared_ptr은 래퍼런스 카운트가 0 이되면 가리키는 객체를 메모리에서 해제 시킨다고 했는데.&lt;br /&gt;서로를 순환참조하는 shared_ptr이 있다면 어떻게 될까요&lt;br /&gt;객체 A와 객체 B가 있다고 가정을하고 이객체들은 shared_ptr을 하나 씩 가지고 있을때&lt;br /&gt;A는 B의, B는 A의 shared_ptr을 가리키고 있다면&lt;br /&gt;A가 삭제가 되기 위해서는 A를 가리키고있는 shared_ptr의 래퍼런스 카운트가 0이 되어야하는데&lt;br /&gt;그럼 B가 파괴가 되어야합니다. 근데 B가 파괴가 되려면 A가 파괴가 되어야하고 A가 파괴되려면 B가 파괴되어야하고.....&lt;br /&gt;이러지도 저러지도 못하는 상황이 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;#include &amp;lt;memory&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;class&amp;nbsp;TestClass &lt;br /&gt;{ &lt;br /&gt;public: &lt;br /&gt;std::shared_ptr&amp;lt;TestClass&amp;gt; m_Other_Class; &lt;br /&gt;void&amp;nbsp;TestFunc() &lt;br /&gt;{ &lt;br /&gt;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;hahaha&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;void Set_Class(std::shared_ptr&amp;lt;TestClass&amp;gt; _Value)&amp;nbsp; &lt;br /&gt;{ &lt;br /&gt;m_Other_Class&amp;nbsp;=&amp;nbsp;_Value; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;TestClass() &lt;br /&gt;{ &lt;br /&gt;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;생성자&amp;nbsp;호출&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl; &lt;br /&gt;} &lt;br /&gt;~TestClass() &lt;br /&gt;{ &lt;br /&gt;std::cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;&quot;소멸자&amp;nbsp;호출&quot;&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;std::endl; &lt;br /&gt;} &lt;br /&gt;}; &lt;br /&gt;&lt;br /&gt;int&amp;nbsp;main() &lt;br /&gt;{ &lt;br /&gt;_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF&amp;nbsp;|&amp;nbsp;_CRTDBG_LEAK_CHECK_DF); &lt;br /&gt;std::shared_ptr&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;TestClass&amp;gt;&lt;/span&gt;&amp;nbsp;T_A&amp;nbsp;=&amp;nbsp;std::make_shared&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;TestClass&amp;gt;&lt;/span&gt;(); &lt;br /&gt;std::shared_ptr&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;TestClass&amp;gt;&lt;/span&gt;&amp;nbsp;T_B&amp;nbsp;=&amp;nbsp;std::make_shared&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;TestClass&amp;gt;&lt;/span&gt;(); &lt;br /&gt;&lt;br /&gt;T_A-&amp;gt;Set_Class(T_B); &lt;br /&gt;T_B-&amp;gt;Set_Class(T_A); &lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;b&gt;문제 코드 결과&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;생성자&amp;nbsp;호출 &lt;br /&gt;생성자&amp;nbsp;호출&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mhc4J/btqCpP9vbQB/cNzKcEzehNPVKnmzigOZu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mhc4J/btqCpP9vbQB/cNzKcEzehNPVKnmzigOZu0/img.png&quot; data-alt=&quot;릭 검출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mhc4J/btqCpP9vbQB/cNzKcEzehNPVKnmzigOZu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmhc4J%2FbtqCpP9vbQB%2FcNzKcEzehNPVKnmzigOZu0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;릭 검출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;소멸자는 호출 되지 않고 릭도 남았습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p&gt;&lt;b&gt;해결방안&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;shared_ptr자체에 내재되어 있는 문제이기 때문에 shared_ptr로는 해결을 할 수 없습니다.&lt;br /&gt;순환 참조 문제를 해결하기 위해서는 std::weak_ptr을 사용하면 됩니다.&lt;br /&gt;std::weak_ptr에 대한 정리는 다음글에서 마무리하겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://hojak99.tistory.com/270&quot;&gt;https://hojak99.tistory.com/270&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <category>std</category>
      <category>std::shared_ptr</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/36</guid>
      <comments>https://younggwan.tistory.com/36#entry36comment</comments>
      <pubDate>Mon, 2 Mar 2020 20:55:06 +0900</pubDate>
    </item>
    <item>
      <title>C++ new, malloc</title>
      <link>https://younggwan.tistory.com/35</link>
      <description>&lt;p&gt;malloc :&amp;nbsp;&lt;span&gt;라이브러리에서 제공하는&amp;nbsp;&lt;/span&gt;&lt;span&gt;메모리 할당 함수, free(변수명) 으로 할당 내용을 해제한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;- 형태 : void *malloc(size_t size), 반환형 : *void 메모리공간&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; + 예 : int a = (int*)malloc(50 * sizeof(int)); &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;- int형의 자료가 50개가 들어갈 공간을 확보, a[0~49]의 인덱스로 접근가능&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;- 프로그램 실행 중에 메모리를 할당받는 동적 메모리 할당 함수&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;new : 변수나 함수 객체의 생성자를 자동으로 호출하는 연산자, delete로 해제한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 349px;&quot; border=&quot;1&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;malloc&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;new&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;라이브러리가 제공하는 함수&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;프로그래밍 언어가 제공하는&amp;nbsp;연산자&lt;br /&gt;&amp;nbsp;- 오버로딩 가능&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;&amp;nbsp;필요한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;메모리 양을 바이트 단위로 지정&lt;/span&gt;하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;void*를 리턴&lt;br /&gt;&lt;/span&gt;&amp;nbsp;- sizeof 연산자와 캐스트 연산자의 도움이 필요하다.&lt;br /&gt;&amp;nbsp;- void를 리턴 다양한 형식(char, int 등)에 적용되어야 한다.&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;타입을 지정&lt;/span&gt;하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;해당 타입의 포인터를 리턴한다.&lt;br /&gt;&lt;/span&gt;&amp;nbsp;- 할당한 타입과 같은 타입의 포인터 변수로 대입만 받으면 된다.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;&amp;nbsp;메모리 할당이 목적,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;초기값 할당 불가&lt;br /&gt;&lt;/span&gt;&amp;nbsp;- 다른 예로&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;calloc 함수&lt;/span&gt;는 malloc 처럼 메모리 할당을 하는 점에선 같지만&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;모든 공간을 0으로 초기화&lt;/span&gt;한다.&lt;br /&gt;&amp;nbsp;-&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;calloc&lt;/span&gt;도 0으로 초기화 할 뿐이지 원하는 변수로 초기화는 불가&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;&amp;nbsp;&lt;span&gt;할당과 초기화를 동시에 진행 가능&lt;br /&gt;&lt;/span&gt;&amp;nbsp;- int a = new int(123);&lt;br /&gt;&amp;nbsp;- int a = new int(); a = 123;&lt;br /&gt;&amp;nbsp; + 같은 결과가 나온다.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;오로지 메모리 공간 만을 할당&lt;br /&gt;&amp;nbsp;-&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;생성자를 호출하지 않음&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;&lt;span&gt;생성자&lt;/span&gt;를 자동으로 호출&lt;br /&gt;&amp;nbsp;- 생성자 : 객체를 초기화하는 함수&amp;nbsp;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;할당된 메모리는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;크기 변경이 가능&lt;/span&gt;하다.&lt;br /&gt;&amp;nbsp;- realloc으로 재할당 가능&lt;/p&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;&lt;span&gt;재할당이 불가&lt;/span&gt;능하다.&lt;br /&gt;&amp;nbsp;- 새로운 변수를 만들고 그 안에 원래 변수를 만들어 대체하는 식으로 재할당해야한다.&lt;br /&gt;&amp;nbsp;- 재할당 할 때마다 메모리 번지가 바뀐다.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;객체가 아니고 빈번하게 재할당을 한다면 malloc/free&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;
&lt;p&gt;&amp;nbsp;객체를 할당할 때에는 반드시 new&amp;nbsp; / delete&lt;br /&gt;&amp;nbsp;- delete는 소멸자라고 불리우는 함수가 호출되어 삭제된다.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;출처&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wonjayk.tistory.com/252?category=535160&quot;&gt;https://wonjayk.tistory.com/252?category=535160&lt;/a&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <category>C++</category>
      <category>malloc</category>
      <category>new</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/35</guid>
      <comments>https://younggwan.tistory.com/35#entry35comment</comments>
      <pubDate>Mon, 2 Mar 2020 18:02:13 +0900</pubDate>
    </item>
    <item>
      <title>마인파이터</title>
      <link>https://younggwan.tistory.com/34</link>
      <description>&lt;p&gt;마인크래프트 같은 복셀 맵 기반의 8인 온라인 FPS게임입니다.&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/ovK7cU5PFTw&quot; width=&quot;1120&quot; height=&quot;630&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;</description>
      <category>게임 프로그래밍/UNITY</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/34</guid>
      <comments>https://younggwan.tistory.com/34#entry34comment</comments>
      <pubDate>Mon, 2 Mar 2020 17:37:31 +0900</pubDate>
    </item>
    <item>
      <title>자체엔진 2D포트폴리오 스타듀밸리 모작</title>
      <link>https://younggwan.tistory.com/33</link>
      <description>&lt;p&gt;자체엔진 2D포트폴리오 스타듀밸리 모작입니다.&lt;/p&gt;
&lt;iframe src=&quot;https://www.youtube.com/embed/xWAgz1KO6rg&quot; width=&quot;1120&quot; height=&quot;630&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;</description>
      <category>게임 프로그래밍/C++ 게임</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/33</guid>
      <comments>https://younggwan.tistory.com/33#entry33comment</comments>
      <pubDate>Mon, 2 Mar 2020 17:35:37 +0900</pubDate>
    </item>
    <item>
      <title>DirectX11 자체엔진 3D포트폴리오 블레이드&amp;amp;소울 모작</title>
      <link>https://younggwan.tistory.com/32</link>
      <description>&lt;p&gt;DirectX11 자체엔진 3D포트폴리오 블레이드&amp;amp;소울 모작입니다.&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/BF8JUTfheCI&quot; width=&quot;1120&quot; height=&quot;630&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/DIRECTX11</category>
      <category>C++</category>
      <category>directx11</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/32</guid>
      <comments>https://younggwan.tistory.com/32#entry32comment</comments>
      <pubDate>Mon, 2 Mar 2020 17:32:32 +0900</pubDate>
    </item>
    <item>
      <title>DirectX11 자체엔진 2D포트폴리오 위자드 오브 레전드 모작</title>
      <link>https://younggwan.tistory.com/31</link>
      <description>&lt;p&gt;DirectX11 자체엔진 2D포트폴리오 위자드 오브 레전드 모작입니다!&lt;/p&gt;

&lt;iframe src=&quot;https://www.youtube.com/embed/gMagdRegeHs&quot; width=&quot;1120&quot; height=&quot;630&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;</description>
      <category>게임 프로그래밍/DIRECTX11</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/31</guid>
      <comments>https://younggwan.tistory.com/31#entry31comment</comments>
      <pubDate>Mon, 2 Mar 2020 17:29:28 +0900</pubDate>
    </item>
    <item>
      <title>오버로딩 (Overloading)</title>
      <link>https://younggwan.tistory.com/30</link>
      <description>&lt;p&gt;오버로딩 - 함수 중복 정의&lt;/p&gt;
&lt;p&gt;오버로딩은 같은 이름의 함수에 매개변수를 다르게 사용하여 매개 변수에 따라 다른 함수처럼 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;특징&lt;br /&gt;1. 함수 이름이 같아야한다.&lt;br /&gt;2. 리턴형이 같아도 되고 달라도 된다.&lt;br /&gt;3. 파라미터 개수가 달라야한다.&lt;br /&gt;4. 파라미터 개수가 같을경우 자료형이 달라야한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예제 소스&lt;/p&gt;
&lt;p&gt;class&amp;nbsp;TestClass &lt;br /&gt;{ &lt;br /&gt;public: &lt;br /&gt;&amp;nbsp; void OverloadingTest(int _Value) &lt;br /&gt;&amp;nbsp; { &lt;br /&gt;&amp;nbsp; &amp;nbsp;std::cout &amp;lt;&amp;lt; &quot;int : &quot; &amp;lt;&amp;lt; _Value &amp;lt;&amp;lt; std::endl; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&lt;br /&gt;&amp;nbsp;void OverloadingTest(float _Value) &lt;br /&gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; std::cout &amp;lt;&amp;lt; &quot;float : &quot; &amp;lt;&amp;lt; _Value &amp;lt;&amp;lt; std::endl; &lt;br /&gt;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&amp;nbsp;void OverloadingTest(std::string _Value) &lt;br /&gt;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; std::cout &amp;lt;&amp;lt; &quot;string : &quot; &amp;lt;&amp;lt; _Value.c_str() &amp;lt;&amp;lt; std::endl; &lt;br /&gt;&amp;nbsp;} &lt;br /&gt;}; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int&amp;nbsp;main() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;TestClass Test; &lt;br /&gt;&amp;nbsp;Test.OverloadingTest(10); &lt;br /&gt;&amp;nbsp;Test.OverloadingTest(3.14f); &lt;br /&gt;&amp;nbsp;Test.OverloadingTest(&quot;overloading&quot;); &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;결과&lt;br /&gt;int&amp;nbsp;:&amp;nbsp;10 &lt;br /&gt;float&amp;nbsp;:&amp;nbsp;3.14 &lt;br /&gt;string&amp;nbsp;:&amp;nbsp;overloading&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/30</guid>
      <comments>https://younggwan.tistory.com/30#entry30comment</comments>
      <pubDate>Mon, 2 Mar 2020 17:16:02 +0900</pubDate>
    </item>
    <item>
      <title>오버라이딩 (Overriding)</title>
      <link>https://younggwan.tistory.com/29</link>
      <description>&lt;p&gt;오버라이딩 - 함수 재정의&lt;/p&gt;
&lt;p&gt;부모클래스의 함수를 사용하지 않고 자식 클래스만의 기능으로 사용하고 싶을 때&amp;nbsp;&lt;br /&gt;부모클래스 함수와 같은 이름, 매개변수로 재정의 해서 사용하는것이다.&lt;/p&gt;
&lt;p&gt;특징&lt;br /&gt;1. 함수 이름이 같아야한다.&lt;br /&gt;2. 함수 파라미터 개수, 파라미터의 자료형이 같아야 한다.&lt;br /&gt;3. 오버라이드 하고자 하는 함수가 상위 클래스에 있어야한다.&lt;br /&gt;4. 함수 리턴형이 같아야 한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;예제 소스&lt;/p&gt;
&lt;p&gt;class ParentClass //부모클래스&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;public: &lt;br /&gt;&amp;nbsp; virtual int OverrideTest(int _Value1,&amp;nbsp;&amp;nbsp;int _Value2) //부모클래스 함수에 virtual 키워드를 붙여주어야한다.&lt;br /&gt;&amp;nbsp; { &lt;br /&gt;&amp;nbsp; &amp;nbsp;return _Value1 + _Value2; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;}; &lt;br /&gt;&lt;br /&gt;class&amp;nbsp;ChildClass&amp;nbsp;:&amp;nbsp;public&amp;nbsp;ParentClass &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;public: &lt;br /&gt;&amp;nbsp; int OverrideTest(int _Value1, int _Value2) override &lt;br /&gt;//자식클래스 함수에는 override가 암시적으로 붙지만 명시적으로 작성해주는것이 좋다.&lt;br /&gt;&amp;nbsp; { &lt;br /&gt;&amp;nbsp; &amp;nbsp;return _Value1 - _Value2; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;}; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int&amp;nbsp;main() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;ParentClass Parent; &lt;br /&gt;&amp;nbsp;ChildClass Child; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;int Result_Parent; &lt;br /&gt;&amp;nbsp;int Result_Child; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;Result_Parent = Parent.OverrideTest(10, 20); &lt;br /&gt;&amp;nbsp;Result_Child = Child.OverrideTest(10, 20); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;std::cout &amp;lt;&amp;lt; Result_Parent &amp;lt;&amp;lt; std::endl; &lt;br /&gt;&amp;nbsp;std::cout &amp;lt;&amp;lt; Result_Child &amp;lt;&amp;lt; std::endl; &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;결과&lt;br /&gt;30&lt;br /&gt;-10&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/29</guid>
      <comments>https://younggwan.tistory.com/29#entry29comment</comments>
      <pubDate>Mon, 2 Mar 2020 17:01:19 +0900</pubDate>
    </item>
    <item>
      <title>C++ Map [STL]</title>
      <link>https://younggwan.tistory.com/28</link>
      <description>&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;맵 기본 함수&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;기본형태&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;map&amp;lt;key,value&amp;gt; : key와 value를 pair 형태로 선언합니다.&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;iterator(반복자)&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;begin() : beginning iterator를 반환&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;end() : end iterator를 반환&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;추가 및 삭제&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;insert( make_pair(key,value) ) : 맵에 원소를 pair 형태로 추가&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;erase(key) : 맵에서 key(키값)에 해당하는 원소 삭제&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;clear() : 맵의 원소들 모두 삭제&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;조회&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;find(key) : key(키값)에 해당하는 iterator를 반환&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;count(key) : key(키값)에 해당하는 원소들(value들)의 개수를 반환&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;기타&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;empty() : 맵이 비어있으면 true 아니면 false를 반환&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;size() : 맵 원소들의 수를 반환&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;구현 코드&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;#include &amp;lt;map&amp;gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;using namespace std;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;int main(){&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;// map&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;// &amp;lt;string, int&amp;gt; =&amp;gt; &amp;lt;key, value&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;map&amp;lt; string, int &amp;gt; m;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-weight: normal; font-size: 10pt;&quot;&gt;// insert(key,value)&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;m.insert(make_pair(&quot;a&quot;, 1));&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;m.insert(make_pair(&quot;b&quot;, 2));&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;m.insert(make_pair(&quot;c&quot;, 3));&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;m.insert(make_pair(&quot;d&quot;, 4));&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;m.insert(make_pair(&quot;e&quot;, 5));&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;m[&quot;f&quot;] = 6; // also possible&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;// erase(key)&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;m.erase(&quot;d&quot;);&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;m.erase(&quot;e&quot;);&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;m.erase(m.find(&quot;f&quot;)); // also possible&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;// empty(), size()&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;if(!m.empty()) cout &amp;lt;&amp;lt; &quot;m size : &quot; &amp;lt;&amp;lt; m.size() &amp;lt;&amp;lt; '\n';&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;// find(key)&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;cout &amp;lt;&amp;lt; &quot;a : &quot; &amp;lt;&amp;lt; m.find(&quot;a&quot;)-&amp;gt;second &amp;lt;&amp;lt; '\n';&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;cout &amp;lt;&amp;lt; &quot;b : &quot; &amp;lt;&amp;lt; m.find(&quot;b&quot;)-&amp;gt;second &amp;lt;&amp;lt; '\n';&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;// count(key)&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;cout &amp;lt;&amp;lt; &quot;a count : &quot; &amp;lt;&amp;lt; m.count(&quot;a&quot;) &amp;lt;&amp;lt; '\n';&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;cout &amp;lt;&amp;lt; &quot;b count : &quot; &amp;lt;&amp;lt; m.count(&quot;b&quot;) &amp;lt;&amp;lt; '\n';&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;// begin(), end()&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;cout &amp;lt;&amp;lt; &quot;traverse&quot; &amp;lt;&amp;lt; '\n';&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;&amp;nbsp; &amp;nbsp; // map&amp;lt; string, int &amp;gt;::iterator it; also possible&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;for(auto it = m.begin(); it != m.end(); it++){&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;cout &amp;lt;&amp;lt; &quot;key : &quot; &amp;lt;&amp;lt; it-&amp;gt;first &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; &quot;value : &quot; &amp;lt;&amp;lt; it-&amp;gt;second &amp;lt;&amp;lt; '\n';&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 24px; font-weight: normal;&quot;&gt;&lt;span style=&quot;white-space: pre; font-size: 10pt;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;return 0;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 id=&quot;환경-및-선수조건&quot; style=&quot;box-sizing: border-box; transition: all 0.2s ease 0s; overflow-wrap: break-word;&quot;&gt;&lt;span style=&quot;font-size: 10pt; font-weight: normal;&quot;&gt;}&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/28</guid>
      <comments>https://younggwan.tistory.com/28#entry28comment</comments>
      <pubDate>Sat, 23 Feb 2019 20:06:05 +0900</pubDate>
    </item>
    <item>
      <title>C++ 캐스트(static_cast / const_cast / dynamic_cast / reinterpret_cast)</title>
      <link>https://younggwan.tistory.com/27</link>
      <description>&lt;p&gt;c++의 명시적 캐스트 연사자들이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. const_cast&lt;/b&gt;&lt;/p&gt;&lt;p&gt;클래스에서 const, volatile 및 __unaligned 특성을 제거합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;void main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;char str[] = &quot;String&quot;;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;const char&amp;nbsp; *c1=str;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;char *c2;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;c2 = &lt;b&gt;const_cast&lt;/b&gt;&amp;lt;char *&amp;gt;(c1);&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;c2[0] = 'a';&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;printf(&quot;%s\n&quot;, c2);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;결과 : atring&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. static_cast&lt;/b&gt;&lt;/p&gt;&lt;p&gt;명시적 형 변환을 위한 캐스트 연산자.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class super&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;class sub : public super&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;sub* ss&amp;nbsp; = &lt;b&gt;static_cast&lt;/b&gt;&amp;lt;sub*&amp;gt;(new super());&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;// sub* ss =&amp;nbsp;new super();&lt;/p&gt;&lt;p&gt;// '초기화 중' : super *'에서 'main::sub *'(으) 로 변환할수 없습니다.&lt;/p&gt;&lt;p&gt;// 기본 형식에서 파생 형식으로 캐스팅하려면 dynamic_cast 또는 static_cast가 필요합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. dynamic_cast&lt;/b&gt;&lt;/p&gt;&lt;p&gt;포인터나 레퍼런스를 기본 클래스 -&amp;gt; 파생 클래스로의 다운 캐스팅과,&lt;/p&gt;&lt;p&gt;다중 상속에서 클래스 간의 안전한 타입 캐스팅에 사용된다.&lt;/p&gt;&lt;p&gt;안전하지만 느리다.&lt;/p&gt;&lt;p&gt;이 연산자를 사용하려면 '하나 이상의 virtual 함수' 가 존재해야한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class super&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;class sub : public super&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;sub* ss&amp;nbsp; =&amp;nbsp;&lt;b&gt;dynamic_cast&lt;/b&gt;&amp;lt;sub*&amp;gt;(new super());&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위 코드는 실행이 불가능하다&lt;/p&gt;&lt;p&gt;해당 클래스가 '&lt;b&gt;다형 형식'&lt;/b&gt;이 아니라고 경고문이 나온다.&lt;/p&gt;&lt;p&gt;그럼 &lt;b&gt;다형 형식&lt;/b&gt;이란?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위에서. 이 &lt;b&gt;dynamic_cast&lt;/b&gt;연산자를 사용하려면&amp;nbsp;&lt;/p&gt;&lt;p&gt;하나 이상의 &lt;b&gt;virtual함수 &lt;/b&gt;가 존재해야한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;virtual함수. &lt;/b&gt;즉 가상 함수는 오버라이딩을통해 '다형성'을 구축한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class super&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;virtual void func()&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;prtinf_s(&quot;부모의 가상 함수.\n&quot;);&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;}&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;class sub : public super&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;sub* ss&amp;nbsp; =&amp;nbsp;&lt;b&gt;dynamic_cast&lt;/b&gt;&amp;lt;sub*&amp;gt;(new super());&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;if(ss == NULL)&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;{&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;prtinf_s(&quot;변환 실패\n&quot;);&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;}&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;ss-&amp;gt;func();&amp;nbsp;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. reinterpret_cast&lt;/b&gt;&lt;/p&gt;&lt;p&gt;타입이니 뭐니 하는 것을 따지지 않고 무조건적으로 변환해버린다.&lt;/p&gt;&lt;p&gt;(reinterpret 다시 해석하다, 새로해석하다)&lt;/p&gt;&lt;p&gt;대단히 위험한 방법으로, 안전하다는 보장이 없다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;void main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int a = 123;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;double *b = nullptr;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;b = &lt;b&gt;reinterpret_cast&lt;/b&gt;&amp;lt;double*&amp;gt;(a);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;%d\n&quot;, a);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;%d\n&quot;, b);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/27</guid>
      <comments>https://younggwan.tistory.com/27#entry27comment</comments>
      <pubDate>Thu, 31 Jan 2019 16:00:55 +0900</pubDate>
    </item>
    <item>
      <title>C++ 증감연산자 (전,후) 구현</title>
      <link>https://younggwan.tistory.com/26</link>
      <description>&lt;p&gt;c++ 증감연산자&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;num++&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;++num&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;의 차이.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int num = 10&lt;/p&gt;&lt;p&gt;printf_s(&quot;num&amp;nbsp; &amp;nbsp;: %d\n&quot;, num)&lt;/p&gt;&lt;p&gt;printf_s(&quot;num&amp;nbsp; &amp;nbsp;: %d\n&quot;, ++num)&lt;/p&gt;&lt;p&gt;printf_s(&quot;num&amp;nbsp; &amp;nbsp;: %d\n&quot;, num++)&lt;/p&gt;&lt;p&gt;printf_s(&quot;num&amp;nbsp; &amp;nbsp;: %d\n&quot;, num)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;가있을때 실행결과는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;num&amp;nbsp; &amp;nbsp;: 10&lt;/p&gt;&lt;p&gt;num&amp;nbsp; &amp;nbsp;: 11&lt;/p&gt;&lt;p&gt;num&amp;nbsp; &amp;nbsp;: 11&lt;/p&gt;&lt;p&gt;num&amp;nbsp; &amp;nbsp;: 12&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;++num은 실행 전 1을더한다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;num++은 실행 후 1을 더한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;printf_s(&quot;num&amp;nbsp; &amp;nbsp;: %d\n&quot;,&amp;nbsp;num++)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이부분 에서 num은 위에 ++num의 결과로 11이된 상태다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이때 num++은 printf 구문에서 11을 출력한 다음 ++이되어 12가 된다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그래서 아래 printf_s(&quot;num&amp;nbsp; &amp;nbsp;: %d\n&quot;,&amp;nbsp;num) 부분에서 num이 12로 출력이된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 전위 후위 증감 연산자를 코드로 구현해보았다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int transposition(int* _num)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int* transnum = _num;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;*transnum += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;return *transnum;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int postposition(int * _num)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int* transnum = _num;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int save = (*transnum);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;*transnum += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;return save;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int num = 10;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;num&amp;nbsp; &amp;nbsp;: %d\n&quot;, num);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;++num : %d\n&quot;, transposition(&amp;amp;num));&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;num++ : %d\n&quot;, postposition(&amp;amp;num));&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;num&amp;nbsp; &amp;nbsp;: %d\n&quot;, num);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/26</guid>
      <comments>https://younggwan.tistory.com/26#entry26comment</comments>
      <pubDate>Fri, 25 Jan 2019 07:38:44 +0900</pubDate>
    </item>
    <item>
      <title>C++ memcpy_s 함수 구현</title>
      <link>https://younggwan.tistory.com/25</link>
      <description>&lt;p&gt;memcpy_s 함수는&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding-right: 0px; padding-left: 0px; color: rgb(51, 51, 51); font-family: &amp;quot;Apple SD Gothic Neo&amp;quot;, &amp;quot;Malgun Gothic&amp;quot;, &amp;quot;맑은 고딕&amp;quot;, Dotum, 돋움, &amp;quot;Noto Sans KR&amp;quot;, &amp;quot;Nanum Gothic&amp;quot;, Lato, Helvetica, sans-serif; padding-top: 0px !important; padding-bottom: 0px !important;&quot;&gt;&lt;span style=&quot;font-size: 13.3333px;&quot;&gt;메모리를 복사해주는 함수이다.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;memcpy_s(void * dest,size_t size, const void * source,&amp;nbsp; &amp;nbsp;size_t n);&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;dest&amp;nbsp; &amp;nbsp; : 복사 대상 버퍼&lt;/p&gt;&lt;p&gt;size&amp;nbsp; &amp;nbsp; &amp;nbsp;: 복사 대상 버퍼 크기&lt;/p&gt;&lt;p&gt;source : 복사할 원본&lt;/p&gt;&lt;p&gt;n&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :복사할 바이트 수&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;반환 값&lt;/p&gt;&lt;p&gt;에러 번호&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;코드는 아래와 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-코드-&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int Strlen(char* _pC)&amp;nbsp;&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int Count = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;while (0 != _pC[Count])&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;Count += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;return Count;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;배열의 크기를 알수있게 Strlen함수도 구현을 했다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;void Mymemcpy_s(void* _pCopy, int _CopySize, void* _pOriginal, int _OriginalSize)&amp;nbsp;&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int Count = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char* Copy = (char*)_pCopy;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char* Original = (char*)_pOriginal;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (_OriginalSize &amp;gt; _CopySize)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;복사 실패.\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;while (_CopySize != Count)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;Copy[Count] = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;Count += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;else&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;while (_OriginalSize != Count)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;Copy[Count] = Original[Count];&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;Count += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char TestCopy1[256];&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char TestOriginal1[256] = &quot;Assortrock&quot;;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char TestCopy2[512];&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char TestOriginal2[256] = &quot;YangYoungGwan&quot;;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Mymemcpy_s(TestCopy1, sizeof(TestCopy1), TestOriginal1, sizeof(TestOriginal1));&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Mymemcpy_s(TestCopy2, sizeof(TestCopy2), TestOriginal2, sizeof(TestOriginal2));&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;Original1 : %s \n&quot;, TestOriginal1);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;Copy&amp;nbsp; &amp;nbsp; &amp;nbsp; : %s \n\n&quot;, TestCopy1);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;Original2 : %s \n&quot;, TestOriginal2);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;Copy&amp;nbsp; &amp;nbsp; &amp;nbsp; : %s \n\n&quot;, TestCopy2);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/25</guid>
      <comments>https://younggwan.tistory.com/25#entry25comment</comments>
      <pubDate>Fri, 25 Jan 2019 07:32:35 +0900</pubDate>
    </item>
    <item>
      <title>C++ memset 함수 구현</title>
      <link>https://younggwan.tistory.com/24</link>
      <description>&lt;p&gt;memset 함수는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;어떤 메모리의 시작점부터 연속된 범위를 어떤 값으로(바이트 단위) 모두 지정하고 싶을 때 사용하는 함수이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;구조는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;memset ( void * ptr, int value, size_t num );&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ptr&amp;nbsp; &amp;nbsp; : 채우고자 하는 메모리의 시작 포인터(시작 주소)&lt;/p&gt;&lt;p&gt;value : 메모리에 채우고자하는 값. int형이지만 내부에서는 unsigned char(1 byte)로 변환되어서 저장된다.&lt;/p&gt;&lt;p&gt;num&amp;nbsp; : 채우고자 하는 바이트의 수. 즉, 채우고자 하는 메모리의 크기&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;memset함수를 구현해보면 아래 코드와 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-코드-&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;void* MYMEMSET(void* _StartPtr&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;, int&amp;nbsp;_Data&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;, unsigned int _Number)&amp;nbsp;&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char* PStartPtr = (char*)_StartPtr;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;for(int i = 0 ; i &amp;lt; _Number ; i++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;PStartPtr[i] = _Data;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;return _StartPtr;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;리턴하는 값이 배열 형이기때문에&amp;nbsp;&lt;/p&gt;&lt;p&gt;void*형으로 함수를 선언하고.&lt;/p&gt;&lt;p&gt;void* _StartPtr 배열의 시작 주소를 받아온다.&lt;/p&gt;&lt;p&gt;int _Data 입력될 값을 받아온다.&lt;/p&gt;&lt;p&gt;unsigned int _Number 범위를 받아온다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;//배열&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char Test[100];&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;//값 확인&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;for (int i = 0; i &amp;lt; 100; i++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;%d &quot;, Test[0]);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf(&quot;다음 \n&quot;);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;//함수&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;MYMEMSET(Test, 1, sizeof(Test));&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;//값 확인&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;for (int i = 0; i &amp;lt; 100; i++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;%d &quot;, Test[0]);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/24</guid>
      <comments>https://younggwan.tistory.com/24#entry24comment</comments>
      <pubDate>Fri, 25 Jan 2019 07:23:47 +0900</pubDate>
    </item>
    <item>
      <title>C++ 포인터</title>
      <link>https://younggwan.tistory.com/23</link>
      <description>&lt;p&gt;C++ 포인터는 2가지만 알면된다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. * 참조 연산자&lt;/p&gt;&lt;p&gt;2. &amp;amp; 주소 연산자&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;포인터는 다른 변수의 위치를 가르키는 변수이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;예를들어&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;int a = 10 이라는 변수가 선언되었다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;여기서 a는&amp;nbsp;&lt;/div&gt;&lt;div&gt;자료형 int&lt;/div&gt;&lt;div&gt;크기 4바이트&lt;br /&gt;형태 정수형&lt;/div&gt;&lt;div&gt;값이 10인&lt;/div&gt;&lt;div&gt;주소의 이름이 a이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그럼 주소의 이름이 a면 주소의 값은?&lt;/div&gt;&lt;div&gt;&amp;amp; 주소 연산자를 통해 끌어낼 수 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;int a = 10&lt;/div&gt;&lt;div&gt;int* pa = &amp;amp;a&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;자료형 int&lt;/div&gt;&lt;div&gt;크기 4바이트&lt;br /&gt;형태 정수형&lt;/div&gt;&lt;div&gt;값이 10인&lt;/div&gt;&lt;div&gt;주소의 이름이 a인 변수 a를 선언한후&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;자료형이 int 포인터 인 pa를 선언해서&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;amp;a &amp;lt;-&amp;nbsp;a의 주소를 넣어 준다.&lt;/div&gt;&lt;div&gt;그럼 pa는 a의 주소값을 가진 변수가 되는것이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;아 int 포인터의 크기는&amp;nbsp;&lt;/div&gt;&lt;div&gt;32비트 환경에서는 4바이트&lt;/div&gt;&lt;div&gt;64비트 환경에서는 8바이트이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그럼 포인터는 주소를 가르키는 변수인데 증명을 하고 싶으면.&lt;/div&gt;&lt;div&gt;아래와 같은 방법으로 증명 할 수 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;int a = 10;&lt;/div&gt;&lt;div&gt;int b = 20;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;int* pa = &amp;amp;a;&lt;/div&gt;&lt;div&gt;int* pb = &amp;amp;b;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;printf_s(&quot;%d\n&quot;, pa);&lt;/div&gt;&lt;div&gt;printf_s(&quot;%d\n&quot;, pb);&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이와 같은 코드를 실행 했을때&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;7731072&lt;/div&gt;&lt;div&gt;7731060&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;라는 실행결과를&amp;nbsp;얻을수있다.(메모리의 할당은 자동으로 할당되는것이기때문에 주소값은 실행시 바뀐다.)&lt;/div&gt;&lt;div&gt;pa와 pb의 주소값의 차이가 12바이트가 차이가나는데.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그럼 pb의 값을 + 12 해서 새로운 pc라는 포인터에 넣어주면&lt;/div&gt;&lt;div&gt;pc는 a를 가르키는 포인터가 되어야한다.&lt;/div&gt;&lt;div&gt;아래의 코드를 보자&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;int a = 10;&lt;/div&gt;&lt;div&gt;int b = 20;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;int* pa = &amp;amp;a;&lt;/div&gt;&lt;div&gt;int* pb = &amp;amp;b;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;printf_s(&quot;pa&amp;nbsp; : %d\n&quot;, pa);&lt;/div&gt;&lt;div&gt;printf_s(&quot;pb&amp;nbsp; : %d\n&quot;, pb);&lt;/div&gt;&lt;div&gt;printf_s(&quot;*pa : %d\n&quot;, *pa);&lt;/div&gt;&lt;div&gt;printf_s(&quot;*pb : %d\n&quot;, *pb);&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;int* pc = pb + 3;&lt;/div&gt;&lt;div&gt;printf_s(&quot;int *pc = pb + 3\n&quot;);&lt;/div&gt;&lt;div&gt;printf_s(&quot;pc&amp;nbsp; : %d\n&quot;, pc);&lt;/div&gt;&lt;div&gt;printf_s(&quot;*pc : %d\n&quot;, *pc);&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;위와 같은코드에&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;int* pc = pb + 3; 이라는 코드를 활용해 주소값을 바꿔보았다.&lt;/div&gt;&lt;div&gt;여기에서 12바이트가 차이나는데 3이라는 상수를 더한 이유는&amp;nbsp;&lt;/div&gt;&lt;div&gt;저 3이라는 상수 앞에 sizeof(int) * 3 의 코드가 숨겨져 있기 때문이다.&lt;/div&gt;&lt;div&gt;실행결과는 예상과 같이 아래와 같다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-실행결과-&lt;/div&gt;&lt;div&gt;&lt;div&gt;pa&amp;nbsp; : 9829708&lt;/div&gt;&lt;div&gt;pb&amp;nbsp; : 9829696&lt;/div&gt;&lt;div&gt;*pa : 10&lt;/div&gt;&lt;div&gt;*pb : 20&lt;/div&gt;&lt;div&gt;int *pc = pb + 3&lt;/div&gt;&lt;div&gt;pc&amp;nbsp; : 9829708&lt;/div&gt;&lt;div&gt;*pc : 10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이렇게 불편해 보이는 포인터를 쓰는 이유는.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;1. 배열은 포인터를 사용하여 구현된다. 포인터는 배열을 반복할 때 사용할 수 있다. (배열 인덱스 대신 사용 가능)&lt;/div&gt;&lt;div&gt;2. C++에서 동적으로 메모리를 할당할 수 있는 유일한 방법이다. (가장 흔한 사용 사례)&lt;/div&gt;&lt;div&gt;3. 데이터를 복사하지 않고도 많은 양의 데이터를 함수에 전달할 수 있다.&lt;/div&gt;&lt;div&gt;4. 함수를 매개 변수로 다른 함수에 전달하는 데 사용할 수 있다.&lt;/div&gt;&lt;div&gt;5. 상속을 다룰 때 다형성을 달성하기 위해 사용한다.&lt;/div&gt;&lt;div&gt;6. 하나의 구조체/클래스 포인터를 다른 구조체/클래스에 두어 체인을 형성하는 데 사용할 수 있다. 이는 연결리스트 및 트리와 같은 고급 자료구조에서 유용하다.&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/23</guid>
      <comments>https://younggwan.tistory.com/23#entry23comment</comments>
      <pubDate>Fri, 25 Jan 2019 06:38:03 +0900</pubDate>
    </item>
    <item>
      <title>C++ WHILE ,DO WHILE (반복문)</title>
      <link>https://younggwan.tistory.com/22</link>
      <description>&lt;p&gt;while은 for과 같이 반복문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int Count = 0;&lt;/p&gt;&lt;p&gt;while (Count != 0)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;printf(&quot;내부코드&quot;);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;조건 : Count != 0&lt;/p&gt;&lt;p&gt;내부코드 : { printf(&quot;내부코드&quot;); }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;동작 순서는.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;while은 조건-&amp;gt; 내부코드 순이면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;do while은 내부코드 -&amp;gt; 조건 순이다&lt;/p&gt;&lt;p&gt;그렇기에 do while문은 내부코드가 무조건 1번은 실행된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;// 조건 -&amp;gt; 내부코드&lt;/p&gt;&lt;p&gt;// 조건 -&amp;gt; 내부코드&lt;/p&gt;&lt;p&gt;// 조건 -&amp;gt; 내부코드&lt;/p&gt;&lt;p&gt;// 조건 -&amp;gt; 내부코드&lt;/p&gt;&lt;p&gt;// 조건 -&amp;gt; 내부코드&lt;/p&gt;&lt;p&gt;// 조건 참이면&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int Count = 0;&lt;/p&gt;&lt;p&gt;while (Count != 0)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;%d\n&quot;, Count);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Count += 1;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;// 내부코드 -&amp;gt; 조건&lt;/p&gt;&lt;p&gt;// 내부코드 -&amp;gt; 조건&lt;/p&gt;&lt;p&gt;// 내부코드 -&amp;gt; 조건&lt;/p&gt;&lt;p&gt;// 내부코드 -&amp;gt; 조건&lt;/p&gt;&lt;p&gt;// 내부코드를 한번은 꼭 실행해준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Count = 0;&lt;/p&gt;&lt;p&gt;do&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;%d\n&quot;, Count);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Count += 1;&lt;/p&gt;&lt;p&gt;} while (Count == 0);&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/22</guid>
      <comments>https://younggwan.tistory.com/22#entry22comment</comments>
      <pubDate>Fri, 25 Jan 2019 03:18:26 +0900</pubDate>
    </item>
    <item>
      <title>C++ for (반복문)</title>
      <link>https://younggwan.tistory.com/21</link>
      <description>&lt;p&gt;for 반복문&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;for (int i = 0; i &amp;lt; 100; i++)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;prtinf(&quot;%d&quot;,i);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;코드가 있을때.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int i = 0&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= 초기화문 (시작 조건)&lt;/p&gt;&lt;p&gt;i &amp;lt; 100&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= 조건문&amp;nbsp; &amp;nbsp; (종결 조건)&lt;/p&gt;&lt;p&gt;i++&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= 증감문&amp;nbsp; &amp;nbsp; (조건 변화식)&lt;/p&gt;&lt;p&gt;{ printf(&quot;%d&quot;,i) }&amp;nbsp;= 내부코드&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;순서&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;초기화문 -&amp;gt;&lt;/p&gt;&lt;p&gt;조건문 -&amp;gt; 내부코드 -&amp;gt; 증감문&lt;/p&gt;&lt;p&gt;조건문 -&amp;gt; 내부코드 -&amp;gt; 증감문&lt;/p&gt;&lt;p&gt;조건문 -&amp;gt; 내부코드 -&amp;gt; 증감문&lt;/p&gt;&lt;p&gt;조건문 -&amp;gt; 내부코드 -&amp;gt; 증감문&lt;/p&gt;&lt;p&gt;조건문 -&amp;gt; 내부코드 -&amp;gt; 증감문&lt;/p&gt;&lt;p&gt;조건문 -&amp;gt; 내부코드 -&amp;gt; 증감문&lt;/p&gt;&lt;p&gt;조건문 -&amp;gt; 내부코드 -&amp;gt; 증감문&lt;/p&gt;&lt;p&gt;조건문 -&amp;gt; 내부코드 -&amp;gt; 증감문&lt;/p&gt;&lt;p&gt;조건문 -&amp;gt; 내부코드 -&amp;gt; 증감문&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;의 반복이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;for (int i = 0; i &amp;lt; 100; i++)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;for (int a = 0; a &amp;lt; 100;)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;for (int b = 0;;)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int c = 0;&lt;/p&gt;&lt;p&gt;for ( ; c &amp;lt; 100 ; c++)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int d = 0;&lt;/p&gt;&lt;p&gt;for (;; d++)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;for(;;)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;초기화문, 조건문, 증감문이 없어도 for문은 실행된다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;조건문(종결 조건)이 명확하지 않으면 무한 루프에 빠진다.&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/21</guid>
      <comments>https://younggwan.tistory.com/21#entry21comment</comments>
      <pubDate>Fri, 25 Jan 2019 03:08:28 +0900</pubDate>
    </item>
    <item>
      <title>C++ SWITCH CASE (제어문)</title>
      <link>https://younggwan.tistory.com/20</link>
      <description>&lt;p&gt;switch case&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;if, else if, else 문으로 여러 조건을 비교할 수 있었지만 가독성이 좋지 않다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;if 문은 되도록이면 최선을 다해 한 두가지 경우의 수가 나오는 경우에만 사용하는 편이 코드를 다시 읽게 될 때 이해하기가 편하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여러 경우의 수가 나오는 경우 swtich case 문을 사용할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;문법:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;switch (비교할 대상)&amp;nbsp;&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;case 비교값1:&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; &amp;nbsp; break;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;case 비교값2&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; &amp;nbsp; break;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;deafult:&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; &amp;nbsp; break;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;switch (비교 대상)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;비교할 대상으로 올수 있는 값은 기본 타입&lt;/p&gt;&lt;p&gt;char, short, int, long, float, double&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;case 비교값:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;상수값만 올 수 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;case 문은 마치 if (비교대상 == 비교값) 같은 역할을 한다.&lt;/p&gt;&lt;p&gt;case 문의 끝은 반드시 break; 로 처리해야 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;default:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;마치 if, else if 후 else 구문 같은 역할을 한다.&lt;/p&gt;&lt;p&gt;case 문에 모두 만족하지 않으면 default 구문이 실행된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int done = 0;&lt;/p&gt;&lt;p&gt;char c = getchar();&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;switch (c) {&lt;/p&gt;&lt;p&gt;case 'q':&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; done = 1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; break;&lt;/p&gt;&lt;p&gt;default:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; break;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;switch case 의 함정&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;break 문&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;case 조건문1:&lt;/p&gt;&lt;p&gt;case 조건문2:&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;break;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;조건문1 과 조건문2 사이에 break 문이 없다.&lt;/p&gt;&lt;p&gt;만약에 조건문1과 일치하여 조건문1이 수행되고 나면 조건문2가 실행된다.&lt;/p&gt;&lt;p&gt;break; 문을 만나지 않으면 계속 실행이 된다.&lt;/p&gt;&lt;p&gt;간혹 이러한 특성이 도움이 되기도 하지만 실수로 break; 문을 빠뜨리는 경우가 많다.&lt;/p&gt;&lt;p&gt;주의하자.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-코드-&lt;/p&gt;&lt;p&gt;#include &quot;pch.h&quot;&lt;/p&gt;&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;/p&gt;&lt;p&gt;#include &amp;lt;conio.h&amp;gt; // _getch()를 실행하기 위해 참조.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;// 자동완성기능의 강력함은 ENUM과 같이 써봐야 한다.&lt;/p&gt;&lt;p&gt;enum PLAYERJOB&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;FIGHTER,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;ARCHER,&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;MAGE,&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int Number = 2;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int b = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int c = 100;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;switch (Number)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;case 0:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;// 지역변수의 내부 선언이 안된다.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;// 사용은 된다.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;// 쓸려면 이렇게 스택을 따로 만들어내는 수가 있다.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;// int d&amp;nbsp;= 100; 는 에러를.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // int d;&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // d = 100; //된다&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;c = 100;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;case 0:\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;case 1:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;case 1:\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;case 2:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;case 2:\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;default:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;Default:\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;__int8 i8 = 'b';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char ch = '0';&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;switch (_getch())&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;case 'a':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;case 'A':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;a || A\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;case 'b':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;case 'B':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;b || B\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;case 'c':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;case 'C':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;c || C\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;default:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/20</guid>
      <comments>https://younggwan.tistory.com/20#entry20comment</comments>
      <pubDate>Fri, 25 Jan 2019 02:50:20 +0900</pubDate>
    </item>
    <item>
      <title>C++ atoi(StringToInt) ,itoa(IntToString) 구현하기</title>
      <link>https://younggwan.tistory.com/19</link>
      <description>&lt;p&gt;atoi 함수는&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;char Arr[10] = &quot;987654&quot;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int Value&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Arr배열의 &quot;987654&quot;를 int형인 987654로 변환해주고&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;itoa 함수는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;char Arr[10]&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int Value = 987654&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int 987654를 Arr배열에 &quot;987654&quot;로 바꿔주는 함수이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 코드와 같이 구현해보았다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;#include &quot;pch.h&quot;&lt;/p&gt;&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int StringToInt(char* _char)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int value = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;while (*_char)&lt;span style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt;&amp;nbsp; &amp;nbsp;// NULL까지&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;value = (value * 10) + *_char - '0';&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&amp;nbsp;// 자리수를 올려주며 수를 가져옴 char(숫자(0~) - 0char(숫자(0)) int숫자.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;_char++;&lt;span style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt;&amp;nbsp; &amp;nbsp;// 다음 문자 주소로 넘김&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;return value;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;void IntToString(int _num, char* _char)&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int i = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int radix = 10;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 진수&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int deg = 1;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 자리수 만약 12345가 들어오면 10000가될거고&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int count = 0;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 자리수 count는 4가될거다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;while (1)&lt;span style=&quot;white-space:pre&quot;&gt;		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; // 자리수의 수를 뽑는다&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if ((_num / deg) &amp;gt; 0)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;count++;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;else&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;deg /= radix; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;//한자리수 더 높게 연산되어 한번 나누어준다.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;deg *= radix;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;for (i = 0; i &amp;lt; count; i++)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 자리수만큼 순회&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;*(_char + i) = _num / deg + '0';&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; //가장 큰 자리수 12345면 배열0번째 자리에 12345 / 10000 = int 1&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;_num -= ((_num / deg) * deg);&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;//12345 - ((12345 / 10000) * 10000) = 2345&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;deg /= radix;&lt;span style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt;//10000 / 10 = 1000&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;*(_char + i) = '\0';&lt;span style=&quot;white-space:pre&quot;&gt;					&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;// 문자열의 끝은 NULL&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char Arr[10] = &quot;987654&quot;;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int Value = StringToInt(Arr);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;%d\n&quot;, Value);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int Value2 = 456789;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char Arr2[10];&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;IntToString(Value2, Arr2);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;%s\n&quot;, Arr2);&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/19</guid>
      <comments>https://younggwan.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 25 Jan 2019 01:44:38 +0900</pubDate>
    </item>
    <item>
      <title>C++ IF (조건문)</title>
      <link>https://younggwan.tistory.com/18</link>
      <description>&lt;p&gt;C++에서 가장 기본적인 조건문은 if 명령문이다. (if statement)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;-----------코드-----------&lt;/div&gt;&lt;div&gt;if(expression1)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div style=&quot;margin-left: 2em;&quot;&gt;//expression1 = true 실행&amp;nbsp;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;else if(expression2)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div style=&quot;margin-left: 2em;&quot;&gt;//expression2 = true&amp;nbsp;실행&amp;nbsp;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;else&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div style=&quot;margin-left: 2em;&quot;&gt;//expression1 = true || expression2 = true&amp;nbsp;외&amp;nbsp;실행&amp;nbsp;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;-----------코드-----------&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;위에서 'expression'을 조건식(conditional expression)이라고 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;조건식이 true(0이 아님)로 평가되면 if 문이 실행된다. 표현식이 false로 평가되면 else 문이 실행된다(else 문이 있는 경우).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-----------코드-----------&lt;/p&gt;&lt;p&gt;#include &quot;pch.h&quot;&lt;/p&gt;&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (true)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;TRUE 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (false)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;FALSE 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (0)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;0 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (42389472389)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;42389472389 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (0 &amp;amp;&amp;amp; 312321)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;if (0 &amp;amp;&amp;amp; 312321) 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int b = 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (b)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;if (b) 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (b)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;if (b) 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (0 != b)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;if (b) 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (1, 2)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;if (1, 2) 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (1, 2, 3)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;if (1, 2, 3) 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;// 가장 오른쪽만 본다.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (0, 0, 3)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;if (0, 0, 3) 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if (false)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;else if (false)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;else if (true)1 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;else if (false)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;else if (false)2 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;else {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;else 실행\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;----------실행 결과----------&lt;/p&gt;&lt;p&gt;TRUE 실행&lt;/p&gt;&lt;p&gt;42389472389 실행&lt;/p&gt;&lt;p&gt;if (b) 실행&lt;/p&gt;&lt;p&gt;if (b) 실행&lt;/p&gt;&lt;p&gt;if (b) 실행&lt;/p&gt;&lt;p&gt;if (1, 2) 실행&lt;/p&gt;&lt;p&gt;if (1, 2, 3) 실행&lt;/p&gt;&lt;p&gt;if (0, 0, 3) 실행&lt;/p&gt;&lt;p&gt;else 실행&lt;/p&gt;&lt;p&gt;와 같다.&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/18</guid>
      <comments>https://younggwan.tistory.com/18#entry18comment</comments>
      <pubDate>Thu, 24 Jan 2019 00:56:42 +0900</pubDate>
    </item>
    <item>
      <title>C++ 논리연산자</title>
      <link>https://younggwan.tistory.com/17</link>
      <description>&lt;p&gt;C++ 논리연산자에는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. !a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;(a가 true면 false로)&lt;/p&gt;&lt;p&gt;2. a &amp;amp;&amp;amp; b&amp;nbsp; &amp;nbsp; &amp;nbsp; (a와 b가 둘다 참이면 참)&lt;/p&gt;&lt;p&gt;3. a&amp;nbsp;||&amp;nbsp;b&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(a와 b중 하나만 참이여도 참)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;가 존재한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래와 같은 코드가 있을때&lt;/p&gt;&lt;p&gt;int FuncTrue()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;FuncTrue Progress\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;return 1;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int FuncFalse()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;printf_s(&quot;FuncFalse Progress\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;return 0;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int Left = 3;&lt;/p&gt;&lt;p&gt;int Right = 7;&lt;/p&gt;&lt;p&gt;bool Result;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Result = !Left;&lt;/p&gt;&lt;p&gt;printf_s(&quot;!Left 3 %d\n&quot;, Result);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Result = Left &amp;amp;&amp;amp; Right;&lt;/p&gt;&lt;p&gt;printf_s(&quot;Left 3 &amp;amp;&amp;amp; Right 7 %d\n&quot;, Result);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Result = Left || Right;&lt;/p&gt;&lt;p&gt;printf_s(&quot;Left 3 || Right 7 %d\n&quot;, Result);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. Result = FuncTrue() || FuncFalse();&lt;/p&gt;&lt;p&gt;2. Result = FuncFalse() &amp;amp;&amp;amp; FuncTrue() &amp;amp;&amp;amp; FuncTrue();&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Result = !Right;&lt;/p&gt;&lt;p&gt;printf_s(&quot;!Right 7 %d\n&quot;, Result);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. FuncFalse() 와 2. FuncTure&amp;amp;&amp;amp; FuncTrue() 부분이&amp;nbsp;실행될것이라고 오해하는 경우가 많다.&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;실행결과&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. !Left 3 0&lt;/p&gt;&lt;p&gt;2. Left 3 &amp;amp;&amp;amp; Right 7 1&lt;/p&gt;&lt;p&gt;3. Left 3 || Right 7 1&lt;/p&gt;&lt;p&gt;4. FuncTrue Progress&lt;/p&gt;&lt;p&gt;5. FuncFalse Progress&lt;/p&gt;&lt;p&gt;6. !Right 7 0&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. 3은 true !연산자 -&amp;gt; 0(false)&lt;/p&gt;&lt;p&gt;2. 3,7은 true &amp;amp;&amp;amp;연산자 -&amp;gt; 1(true)&lt;/p&gt;&lt;p&gt;3. 3,7은 true ||연산자 -&amp;gt; 1(true)&lt;/p&gt;&lt;p&gt;4. ||연산자는 한쪽만 true여도 true를 리턴한다 그래서 FuncTure()함수가 실행되고 true인걸 확인하고 뒤에있는 FuncFlase()를 실행하지않는다.&lt;/p&gt;&lt;p&gt;5. &amp;amp;&amp;amp;연산자는 양쪽이 true야 true를 리턴한다. 그래서 FuncFalse(0함수가 먼저 실행되고 false를 리턴받아 뒤에있는 FuncTrue() &amp;amp;&amp;amp; FuncTrue()&amp;nbsp;나머지 함수가 실행하지 않는다.&lt;/p&gt;&lt;p&gt;6. 7은 true !연산자 -&amp;gt; 0(false)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/17</guid>
      <comments>https://younggwan.tistory.com/17#entry17comment</comments>
      <pubDate>Wed, 23 Jan 2019 06:39:13 +0900</pubDate>
    </item>
    <item>
      <title>꽈이입니다.</title>
      <link>https://younggwan.tistory.com/notice/16</link>
      <description>&lt;p&gt;꽈이입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;꽈하!&lt;/p&gt;</description>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/notice/16</guid>
      <pubDate>Wed, 23 Jan 2019 06:24:17 +0900</pubDate>
    </item>
    <item>
      <title>C++ 비교연산자</title>
      <link>https://younggwan.tistory.com/15</link>
      <description>&lt;p&gt;C++ 비교연산자에는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1.&amp;nbsp; a == b&amp;nbsp;&amp;nbsp; &amp;nbsp;(a와 b는 같다)&lt;/p&gt;&lt;p&gt;2.&amp;nbsp; a&amp;nbsp; != b&amp;nbsp; &amp;nbsp; (a와 b는 다르다)&lt;br /&gt;3.&amp;nbsp; a&amp;nbsp; &amp;gt;&amp;nbsp; b&amp;nbsp; &amp;nbsp; (a가 b보다 크다)&lt;/p&gt;&lt;p&gt;4.&amp;nbsp; a&amp;nbsp; &amp;lt;&amp;nbsp; b&amp;nbsp; &amp;nbsp; (a가 b보다 작다)&lt;br /&gt;5.&amp;nbsp; a &amp;gt;= b&amp;nbsp; &amp;nbsp; (a가 b보다 크거나 같다)&lt;br /&gt;6.&amp;nbsp; a&amp;nbsp;&amp;lt;= b&amp;nbsp;&amp;nbsp; &amp;nbsp;(a가 b보다 작거나 같다)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;가 존재한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;비교연산자는 참이면 true 거짓이면 false 프로그래밍은 무조건 비트 어떤 데이터의 범위가 있을때&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;단 한개의 비트라도 1이 있다면 참(1), 모두 0이라면 거짓(0) 이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;리턴 값은&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;true = 1&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;false = 0&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 683px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9902A5485C47889213&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9902A5485C47889213&quot; width=&quot;683&quot; height=&quot;281&quot; filename=&quot;비교연산자1.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 683px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9902A9485C47889313&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9902A9485C47889313&quot; width=&quot;683&quot; height=&quot;357&quot; filename=&quot;비교연산자2.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/15</guid>
      <comments>https://younggwan.tistory.com/15#entry15comment</comments>
      <pubDate>Wed, 23 Jan 2019 06:19:49 +0900</pubDate>
    </item>
    <item>
      <title>C++ 비트연산자</title>
      <link>https://younggwan.tistory.com/14</link>
      <description>&lt;p&gt;C++ 비트연산자에는&lt;/p&gt;&lt;p&gt;1. AND&lt;/p&gt;&lt;p&gt;2. OR&lt;/p&gt;&lt;p&gt;3. XOR&lt;/p&gt;&lt;p&gt;4. NOT&lt;/p&gt;&lt;p&gt;5. 왼쪽&amp;nbsp;쉬프트&lt;/p&gt;&lt;p&gt;6. 오른쪽&amp;nbsp;쉬프트&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;6가지가 존재한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 683px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991EAE345C47824410&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991EAE345C47824410&quot; width=&quot;683&quot; height=&quot;741&quot; filename=&quot;비트1.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 683px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991F0F345C47824510&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991F0F345C47824510&quot; width=&quot;683&quot; height=&quot;350&quot; filename=&quot;비트2.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 기초</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/14</guid>
      <comments>https://younggwan.tistory.com/14#entry14comment</comments>
      <pubDate>Wed, 23 Jan 2019 05:52:16 +0900</pubDate>
    </item>
    <item>
      <title>C++ 콘솔RPG게임[클래스사용, 간단..]</title>
      <link>https://younggwan.tistory.com/13</link>
      <description>&lt;p&gt;#include &quot;pch.h&quot;&lt;/p&gt;&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;/p&gt;&lt;p&gt;#include &amp;lt;conio.h&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int PLEVEL = 1;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class RpgMonster&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;private:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MATT;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MHP;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MLEVEL = 1;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int GETATT()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return MATT;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int GETMHP()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return MHP;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void StatusRender()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;몬스터-------------------------\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;레&amp;nbsp; 벨 : %d\n&quot;, this-&amp;gt;MLEVEL);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;공격력 : %d\n&quot;, this-&amp;gt;MATT);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;체&amp;nbsp; 력 : %d\n&quot;, this-&amp;gt;MHP);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;-------------------------------\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void Damage(int _ATT)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;MHP -= _ATT;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;HpControl();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;this-&amp;gt;StatusRender();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;플레이어가 %d의 공격력으로 몬스터를 때렸다.\n&quot;, _ATT);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;_getch();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;몬스터는 HP가 %d 만큼 남았다.\n&quot;, MHP);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;DieCheck();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void HpControl()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (MHP &amp;lt; 0)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;MHP = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void DieCheck()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (MHP == 0)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;printf_s(&quot;몬스터가 죽었습니다.\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;MLEVEL += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;PLEVEL += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;MHP = 50 * MLEVEL;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;MATT = 2 * MLEVEL;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;RpgMonster() : MATT(2), MHP(50)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;RpgMonster(int _ATT, int _HP) : MATT(_ATT), MHP(_HP)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class RpgPlayer&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;private:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int PATT;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int PHP;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int GETATT()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return PATT;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int GETPHP()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return PHP;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void SETPLEVEL()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;PLEVEL += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void StatusRender()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;플레이어-----------------------\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;레&amp;nbsp; 벨 : %d\n&quot;, PLEVEL);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;공격력 : %d\n&quot;, this-&amp;gt;PATT);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;체&amp;nbsp; 력 : %d\n&quot;, this-&amp;gt;PHP);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;-------------------------------\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void Damage(int _ATT,RpgMonster _RM)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;RpgMonster __RM = _RM;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;PHP -= _ATT;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;HpControl();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;this-&amp;gt;StatusRender();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;__RM.StatusRender();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;몬스터가 %d의 공격력으로 플레이어를 때렸다.\n&quot;, _ATT);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;_getch();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;플레이어는 HP가 %d 만큼 남았다.\n&quot;, PHP);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;DieCheck();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void HpControl()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (PHP &amp;lt; 0)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;PHP = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void DieCheck()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (PHP == 0)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;printf_s(&quot;플레이어가 죽었습니다.\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;RpgPlayer(int _ATT, int _HP) : PATT(_ATT), PHP(_HP)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;RpgPlayer RP = { 10, 200 };&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;RpgMonster RM;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;RP.StatusRender();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;RM.StatusRender();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;while (true)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;_getch();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;system(&quot;cls&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;RP.StatusRender();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;RM.Damage(RP.GETATT());&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;_getch();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;system(&quot;cls&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;RP.Damage(RM.GETATT(),RM);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (0 &amp;gt;= RP.GETPHP())&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;_getch();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;간단한 소스입니다.. 과제에 사용하시면 F..&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 게임</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/13</guid>
      <comments>https://younggwan.tistory.com/13#entry13comment</comments>
      <pubDate>Wed, 23 Jan 2019 01:34:07 +0900</pubDate>
    </item>
    <item>
      <title>C++ 콘솔슈팅게임[클래스 미사용, 간단..]</title>
      <link>https://younggwan.tistory.com/12</link>
      <description>&lt;p&gt;#include &quot;pch.h&quot;&lt;/p&gt;&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;/p&gt;&lt;p&gt;#include &amp;lt;conio.h&amp;gt;&lt;/p&gt;&lt;p&gt;#include &amp;lt;stdlib.h&amp;gt;;&lt;/p&gt;&lt;p&gt;#include &amp;lt;time.h&amp;gt;;&lt;/p&gt;&lt;p&gt;int rand_X()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int Rand_X = rand() % 49;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;return Rand_X;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int rand_Y()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int Rand_Y = rand() % 15;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;return Rand_Y;&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MapSizeY = 20;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MapSizeX = 52;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int KillCount = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MonsterCount = 3;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int FrameCount = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int BoomCount = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;bool Boom = false;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int BoomX = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int BoomY = 0;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int PlayerX = 25;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int PlayerY = 18;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MonsterX_1 = 10;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MonsterX_2 = 28;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MonsterX_3 = 42;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MonsterY_1 = 3;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MonsterY_2 = 5;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int MonsterY_3 = 7;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char ArrPixel[20][52];&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;memset((void*)ArrPixel, '*', sizeof(char) * MapSizeY * MapSizeX);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;for (int y = 0; y &amp;lt; 20; y++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ArrPixel[y][50] = '\n';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ArrPixel[y][51] = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;ArrPixel[MonsterY_1][MonsterX_1] = 'M';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;ArrPixel[MonsterY_2][MonsterX_2] = 'M';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;ArrPixel[MonsterY_2][MonsterX_3] = 'M';&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;while (true)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;system(&quot;cls&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ArrPixel[PlayerY][PlayerX] = '@';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;for (int y = 0; y &amp;lt; MapSizeY; y++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;printf_s(ArrPixel[y]);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;---------------------------------------------------- \n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;MONSTER : %d&amp;nbsp; &amp;nbsp; KILL : %d \n&quot;,MonsterCount ,KillCount);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;-----------------------조작법----------------------- \n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;이동 : W A S D \n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;총알 : K&amp;nbsp; \n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;폭탄 : B \n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;몬스터가 있는곳으로는 이동할 수 없습니다.\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;폭탄이 터지는 동안 폭탄을 재사용 할 수 없습니다.\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;승리 : 20 Kill\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;패배 : 20 MONSTER\n&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;printf_s(&quot;---------------------------------------------------- \n&quot;);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (Boom == true)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;BoomCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (BoomCount == 1)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (ArrPixel[BoomY][BoomX - 1] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY][BoomX + 1] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY + 1][BoomX] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY - 1][BoomX] == 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;KillCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;MonsterCount -= 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY][BoomX - 1] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY][BoomX + 1] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY + 1][BoomX] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY - 1][BoomX] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;else if (BoomCount == 2)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (ArrPixel[BoomY][BoomX - 2] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY][BoomX + 2] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY + 2][BoomX] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY - 2][BoomX] == 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;KillCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;MonsterCount -= 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY][BoomX - 2] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY][BoomX + 2] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY + 2][BoomX] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY - 2][BoomX] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;else if (BoomCount == 3)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (ArrPixel[BoomY][BoomX - 3] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY][BoomX + 3] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY + 3][BoomX] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY - 3][BoomX] == 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;KillCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;MonsterCount -= 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY][BoomX - 3] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY][BoomX + 3] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY + 3][BoomX] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY - 3][BoomX] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;else if (BoomCount == 4)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (ArrPixel[BoomY][BoomX - 4] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY][BoomX + 4] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY + 4][BoomX] == 'M'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;|| ArrPixel[BoomY - 4][BoomX] == 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;KillCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY][BoomX - 4] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY][BoomX + 4] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY + 4][BoomX] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[BoomY - 4][BoomX] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;else if (BoomCount == 5)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;for (int i = -4; i &amp;lt; 5; i++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[BoomY + i][BoomX] = '*';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[BoomY][BoomX + i] = '*';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;Boom = false;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;BoomCount = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (KillCount == 20)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;printf_s(&quot;Game Clear......&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (MonsterCount == 20)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;printf_s(&quot;Game Over......&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;for (int i = 0; i &amp;lt; MapSizeY; i++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;for (int j = 0; j &amp;lt; MapSizeX; j++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;if (ArrPixel[i][j] == '^')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;ArrPixel[i][j] = '*';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;if (ArrPixel[i - 1][j] == 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt;ArrPixel[i - 1][j] = '*';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt;KillCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt;MonsterCount -= 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;else&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt;if (i - 1 &amp;gt; 0)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;							&lt;/span&gt;ArrPixel[i - 1][j] = '^';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;						&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;switch (_getch())&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'a':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'A':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (PlayerX != 0 &amp;amp;&amp;amp; ArrPixel[PlayerY][PlayerX - 1] != 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[PlayerY][PlayerX] = '*';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[PlayerY][PlayerX - 1] = '@';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;PlayerX -= 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'd':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'D':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (PlayerX != (MapSizeX -3) &amp;amp;&amp;amp; ArrPixel[PlayerY][PlayerX + 1] != 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[PlayerY][PlayerX] = '*';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[PlayerY][PlayerX + 1] = '@';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;PlayerX += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'w':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'W':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (PlayerY != 0 &amp;amp;&amp;amp; ArrPixel[PlayerY - 1][PlayerX] != 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[PlayerY][PlayerX] = '*';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[PlayerY - 1][PlayerX] = '@';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;PlayerY -= 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 's':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'S':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (PlayerY != (MapSizeY -1) &amp;amp;&amp;amp; ArrPixel[PlayerY + 1][PlayerX] != 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[PlayerY][PlayerX] = '*';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[PlayerY + 1][PlayerX] = '@';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;PlayerY += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'r':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'R':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'k':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'K':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (ArrPixel[PlayerY - 1][PlayerX] == 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;KillCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;MonsterCount -= 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[PlayerY - 1][PlayerX] = '^';&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'b':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'B':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (Boom == false&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;&amp;amp;&amp;amp; PlayerY -3 -4 &amp;gt; -1&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;&amp;amp;&amp;amp; PlayerY -3 +4 &amp;lt; 20&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;&amp;amp;&amp;amp; PlayerX -4 &amp;gt; -1&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;&amp;amp;&amp;amp; PlayerX +4 &amp;lt; 50)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;if (ArrPixel[PlayerY - 3][PlayerX] == 'M')&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;KillCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;					&lt;/span&gt;MonsterCount -= 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;Boom = true;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;ArrPixel[PlayerY - 3][PlayerX] = 'B';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;BoomY = PlayerY - 3;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;BoomX = PlayerX;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;FrameCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (FrameCount % 10 == 0)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[rand_Y()][rand_X()] = 'M';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;MonsterCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;간단한 소스입니다 과제에 사용하시면 F...&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 게임</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/12</guid>
      <comments>https://younggwan.tistory.com/12#entry12comment</comments>
      <pubDate>Wed, 23 Jan 2019 01:32:15 +0900</pubDate>
    </item>
    <item>
      <title>C++ 콘솔슈팅게임[클래스사용, 간단..]</title>
      <link>https://younggwan.tistory.com/11</link>
      <description>&lt;p&gt;#include &quot;pch.h&quot;&lt;/p&gt;&lt;p&gt;#include &amp;lt;iostream&amp;gt;&lt;/p&gt;&lt;p&gt;#include &amp;lt;conio.h&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;#define GAMEX 20&lt;/p&gt;&lt;p&gt;#define GAMEY 10&lt;/p&gt;&lt;p&gt;#define PLAYERSTARTX (GAMEX - 2) / 2&lt;/p&gt;&lt;p&gt;#define PLAYERSTARTY (GAMEY / 3) * 2&lt;/p&gt;&lt;p&gt;#define OVERX GAMEX - 2&lt;/p&gt;&lt;p&gt;#define OVERY GAMEY&amp;nbsp;&lt;/p&gt;&lt;p&gt;#define LINEINDEX GAMEX - 2&lt;/p&gt;&lt;p&gt;#define ZEROINDEX GAMEX - 1&lt;/p&gt;&lt;p&gt;#define BASECHAR '*'&lt;/p&gt;&lt;p&gt;#define BULLETMAX 100&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class Pos&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int X;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int Y;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Pos() : X(0), Y(0)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Pos(int _X, int _Y) : X(_X), Y(_Y)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class ConsoleScreen&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;private:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char ArrPixel[GAMEY][GAMEX];&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void PrintScreen()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;system(&quot;cls&quot;);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;for (int y = 0; y &amp;lt; GAMEY; y++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;printf_s(ArrPixel[y]);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void SetPixel(Pos _Pos, char _Pixel)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ArrPixel[_Pos.X][_Pos.Y] = _Pixel;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void SetPixel(int _X, int _Y, char _Pixel)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ArrPixel[_Y][_X] = _Pixel;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void ScreenInit()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;memset((void*)ArrPixel, BASECHAR, sizeof(char) * GAMEY * GAMEX);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;for (int y = 0; y &amp;lt; GAMEY; y++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[y][LINEINDEX] = '\n';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;ArrPixel[y][ZEROINDEX] = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class ScreenObj&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;private:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Pos m_ScreenPos;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;bool IsOnOff;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;ConsoleScreen* m_pScreen;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;protected:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;char RenderCh;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int GetX() const&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return m_ScreenPos.X;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int GetY() const&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return m_ScreenPos.Y;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void SetRenderCh(char _ch)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;RenderCh = _ch;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void On() {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;IsOnOff = true;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void Off() {&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;IsOnOff = false;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void PosSet(Pos _Pos)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;m_ScreenPos = _Pos;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void PosSet(int _X, int _Y)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;m_ScreenPos.X = _X;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;m_ScreenPos.Y = _Y;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void MoveLeft() { --m_ScreenPos.X; }&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void MoveRight() { ++m_ScreenPos.X; }&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void MoveUp() { --m_ScreenPos.Y; }&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void MoveDown() { ++m_ScreenPos.Y; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void SetScreen(ConsoleScreen* _pScreen)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;m_pScreen = _pScreen;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void Render()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (false == IsOnOff)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;return;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (-1 &amp;gt;= m_ScreenPos.X)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;return;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (-1 &amp;gt;= m_ScreenPos.Y)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;return;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (OVERX &amp;lt;= m_ScreenPos.X)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;return;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (OVERY &amp;lt;= m_ScreenPos.Y)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;return;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;m_pScreen-&amp;gt;SetPixel(m_ScreenPos.X, m_ScreenPos.Y, RenderCh);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;ScreenObj() : m_ScreenPos(-1, -1), RenderCh(' '), IsOnOff(true)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{}&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class Bullet : public ScreenObj&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void Update()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;MoveUp();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Bullet()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;RenderCh = '^';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;class FlyPlayer : public ScreenObj&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;private:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;bool FireCheck;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int BulletCount = 0;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;bool IsFire()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;bool Check = FireCheck;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;FireCheck = false;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return Check;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int GetBulletCount()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;return BulletCount;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;void Control()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;FireCheck = false;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;switch (_getch())&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'a':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'A':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;MoveLeft();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'd':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'D':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;MoveRight();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'w':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'W':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;MoveUp();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 's':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'S':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;MoveDown();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'r':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'R':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'f':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;case 'F':&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;FireCheck = true;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;BulletCount += 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if (BulletCount == BULLETMAX)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;				&lt;/span&gt;BulletCount = 1;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;break;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;public:&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;FlyPlayer()&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;RenderCh = '@';&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;};&lt;/p&gt;&lt;p&gt;int main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;ConsoleScreen Screen = ConsoleScreen();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Screen.ScreenInit();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;FlyPlayer NewPlayer = FlyPlayer();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;NewPlayer.SetScreen(&amp;amp;Screen);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;NewPlayer.SetRenderCh('@');&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;NewPlayer.PosSet(PLAYERSTARTX, PLAYERSTARTY);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Bullet OneBullet[BULLETMAX];&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;for (int i = 0; i &amp;lt; BULLETMAX; i++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;OneBullet[i].SetScreen(&amp;amp;Screen);&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;OneBullet[i].SetRenderCh('^');&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;OneBullet[i].Off();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;while (true)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;size_t Test = 0;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;int BulletCount = NewPlayer.GetBulletCount();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;for (size_t i = 0; i &amp;lt; 20000000; ++i)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;Test = i;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;NewPlayer.Render();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;for (int i = 0; i &amp;lt; BULLETMAX; i++)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;OneBullet[i].Render();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;OneBullet[i].Update();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;Screen.PrintScreen();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;Screen.ScreenInit();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (1 == _kbhit())&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;NewPlayer.Control();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if (true == NewPlayer.IsFire())&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;{&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;OneBullet[BulletCount].PosSet(NewPlayer.GetX(), NewPlayer.GetY());&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;OneBullet[BulletCount].On();&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;}&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;간단한 코드니 과제에 사용하시면 아마 F나옵니다 ㅠ&lt;/p&gt;</description>
      <category>게임 프로그래밍/C++ 게임</category>
      <author>꽈이렁</author>
      <guid isPermaLink="true">https://younggwan.tistory.com/11</guid>
      <comments>https://younggwan.tistory.com/11#entry11comment</comments>
      <pubDate>Wed, 23 Jan 2019 01:27:24 +0900</pubDate>
    </item>
  </channel>
</rss>