<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발자 김고파</title>
    <link>https://kimgopa.tistory.com/</link>
    <description>채워나가는 중</description>
    <language>ko</language>
    <pubDate>Wed, 24 Jun 2026 18:16:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>김고파</managingEditor>
    <image>
      <title>개발자 김고파</title>
      <url>https://tistory1.daumcdn.net/tistory/4328336/attach/50d0710bbc1a4be9a66ffa96062350f9</url>
      <link>https://kimgopa.tistory.com</link>
    </image>
    <item>
      <title>섹션 2 - 변수와 기본적인 자료</title>
      <link>https://kimgopa.tistory.com/27</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.1 기본 자료형 소개&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 1 byte = 8 bits&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #000000; text-align: start; border-collapse: collapse; width: 100%; height: 357px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;Group&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;Type names&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;Notes on size /precision&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 68px;&quot; rowspan=&quot;4&quot;&gt;Character types&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Exactly one byte in size. At least 8 bits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;char16_t&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Not smaller than&lt;span&gt;&amp;nbsp;&lt;/span&gt;char. At least 16 bits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;char32_t&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Not smaller than&lt;span&gt;&amp;nbsp;&lt;/span&gt;char16_t. At least 32 bits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;wchar_t&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Can represent the largest supported character set.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 85px;&quot; rowspan=&quot;5&quot;&gt;Integer types (signed)&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;signed char&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Same size as&lt;span&gt;&amp;nbsp;&lt;/span&gt;char. At least 8 bits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;i&gt;signed&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;short&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;int&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Not smaller than&lt;span&gt;&amp;nbsp;&lt;/span&gt;char. At least 16 bits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;i&gt;signed&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;int&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Not smaller than&lt;span&gt;&amp;nbsp;&lt;/span&gt;short. At least 16 bits.&lt;br /&gt;대부분 4 btytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;i&gt;signed&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;long&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;int&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Not smaller than&lt;span&gt;&amp;nbsp;&lt;/span&gt;int. At least 32 bits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;i&gt;signed&lt;/i&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;long long&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;int&lt;/i&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Not smaller than&lt;span&gt;&amp;nbsp;&lt;/span&gt;long. At least 64 bits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 85px;&quot; rowspan=&quot;5&quot;&gt;Integer types (unsigned)&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;unsigned char&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 85px;&quot; rowspan=&quot;5&quot;&gt;(same size as their signed counterparts)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;unsigned short&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;int&lt;/i&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;int&lt;/i&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;unsigned long&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;int&lt;/i&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;unsigned long long&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;int&lt;/i&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 51px;&quot; rowspan=&quot;3&quot;&gt;Floating-point types&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;float&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;double&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Precision not less than&lt;span&gt;&amp;nbsp;&lt;/span&gt;float&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;long double&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Precision not less than&lt;span&gt;&amp;nbsp;&lt;/span&gt;double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Boolean type&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;bool&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Void type&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;no storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;Null pointer&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;b&gt;decltype(nullptr)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cplusplus.com/doc/tutorial/variables/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://cplusplus.com/doc/tutorial/variables/&lt;/a&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;* (Signed) int는 음의 정수, 0, 양의 정수(자연수)를, unsigned int는 양의 정수와 0을 포함한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Signed와 Unsigned는 저장되는 방식이 달라서 Unsigned가 특정 연산을 할 때는 더 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741781201350&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	float fValue = 3.141592f;	// float는 끝에 f를 붙여줘야 float로 인식한다.
	double dValue = 3.141592;

	auto aValue = 3.141592;
	auto aValue2 = 3.141592f;

	cout &amp;lt;&amp;lt; fValue &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; dValue &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;pre id=&quot;code_1741781457196&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	int a(123);	// direct initialization
	int b{ 123 };	// uniform initialization
	int c = 123;	// copy initialization
    
	int a1(3.14);	// warning
	int b2{ 3.14 };	// error&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;uniform initialization이 더 엄격하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.2 정수형&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0&lt;/span&gt;0000000 00000000 00000000 00000001&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int형은 4 bytes = 32 bits&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 bit에는 0과 1 두가지로 구분이 되므로 총&amp;nbsp;2^32개의 숫자를 표현할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 맨 처음 비트는 부호에 사용&lt;/p&gt;
&lt;pre id=&quot;code_1741783322523&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	short s = 1;
	int i = 1;
	long l = 1;
	long long ll = 1;

	cout &amp;lt;&amp;lt; sizeof(short) &amp;lt;&amp;lt; endl;	// 2 = 2^16 가짓수
	cout &amp;lt;&amp;lt; sizeof(int) &amp;lt;&amp;lt; endl;	// 4 = 2^32 가짓수
	cout &amp;lt;&amp;lt; sizeof(long) &amp;lt;&amp;lt; endl;	// 4 = 2^32 가짓수
	cout &amp;lt;&amp;lt; sizeof(long long) &amp;lt;&amp;lt; endl;	// 8 = 2^64 가짓수&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;오버플로우 (overflow)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1741784766742&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cmath&amp;gt;
#include &amp;lt;limits&amp;gt;

using namespace std;

int main()
{
	short s = 1;	// 2 bytes = 16 bits

	cout &amp;lt;&amp;lt; std::pow(2, sizeof(short) * 8 - 1) - 1 &amp;lt;&amp;lt; endl;	// 32767 : 표현할 수 있는 가장 큰 숫자
	cout &amp;lt;&amp;lt; std::numeric_limits&amp;lt;short&amp;gt;::max() &amp;lt;&amp;lt; endl;	// 32767 : 표현할 수 있는 가장 큰 숫자
	cout &amp;lt;&amp;lt; std::numeric_limits&amp;lt;short&amp;gt;::min() &amp;lt;&amp;lt; endl;	// -32768 : 표현할 수 있는 가장 작은 숫자
	cout &amp;lt;&amp;lt; std::numeric_limits&amp;lt;short&amp;gt;::lowest() &amp;lt;&amp;lt; endl;	// -32768

	s = 32767;
	s += 1;

	cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;	// -32768 : overflow

	s = -32768;
	s -= 1;

	cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;	// 32767 : overflow

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;short가&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;숫자는&amp;nbsp;32767이다. &lt;br /&gt;그런데&amp;nbsp;32767에&amp;nbsp;1을&amp;nbsp;더하면&amp;nbsp;32768이&amp;nbsp;나오지&amp;nbsp;않고&amp;nbsp;-32768이&amp;nbsp;나온다. &lt;br /&gt;표현할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;숫자를&amp;nbsp;넘어가서,&amp;nbsp;2진수로&amp;nbsp;표현할&amp;nbsp;때&amp;nbsp;가장&amp;nbsp;작은&amp;nbsp;수가&amp;nbsp;되는&amp;nbsp;것이다. &lt;br /&gt;이런&amp;nbsp;것을&amp;nbsp;오버플로우라고&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;* 다른 데이터 타입에서도 오버플로우 발생 테스트 해보기 *&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;int, long, long long, unsigned short, unsigned int&lt;/u&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;cf) unsigned int에 -1을 넣으면 오버플로우가 발생한다.&lt;/p&gt;
&lt;pre id=&quot;code_1741786999895&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	unsigned int i = -1;
	cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; endl;	// 4294967295&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.3 고정 너비 정수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 플랫폼이든지 똑같은 데이터 사이즈를 사용하는 것&lt;/p&gt;
&lt;pre id=&quot;code_1742560431710&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main()
{
	std::int16_t i(5);	// 해당 플랫폼에서 16bit = 2byte 짜리 데이터 타입으로 바꾼다.
	std::int8_t myint = 65;

	cout &amp;lt;&amp;lt; myint &amp;lt;&amp;lt; endl;	// A

	std::int_fast8_t fi(5);
	std::int_least64_t fl(5);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int16_t : 해당 플랫폼에서 16bit = 2byte 짜리 데이터 타입으로 바꾼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int8_t는 1byte이므로 char 형으로 처리가 된다. 따라서 위 예제에서 변수 myint의 값 65는 char로 처리가 되어 A를 출력하게 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fast8_t : 8bit 데이터 타입 중 가장 빠른 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;least64_t : 적어도 8byte를 갖는 데이터 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.4 무치형 (Void)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void는 함수를 선언할 때 타입이 없다는 뜻으로 사용한다. 즉, 리턴타입이 없을 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void는 메모리를 차지하지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1742560806446&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main()
{
	int i = 123;
	float f = 123.456f;

	void* my_void;

	my_void = (void*)&amp;amp;i;	// i의 주소
	my_void = (void*)&amp;amp;f;	// f의 주소

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 타입이 다르고, 데이터 타입의 사이즈가 다르더라도 주소의 데이터 사이즈는 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 void로 형변환하여 변수의 주소값을 담을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.5 부동소수점 수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터는 실수를 다루기 위해 부동소수점 수(Floating Point Numbers)를 이용한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 61.743%; height: 123px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Category&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Type&lt;/td&gt;
&lt;td style=&quot;width: 19.5386%;&quot;&gt;최소 크기&lt;/td&gt;
&lt;td style=&quot;width: 28.3588%;&quot;&gt;전형적인 크기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;부동소수점&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;float&lt;/td&gt;
&lt;td style=&quot;width: 19.5386%;&quot;&gt;4 바이트&lt;/td&gt;
&lt;td style=&quot;width: 28.3588%;&quot;&gt;4 바이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;double&lt;/td&gt;
&lt;td style=&quot;width: 19.5386%;&quot;&gt;8 바이트&lt;/td&gt;
&lt;td style=&quot;width: 28.3588%;&quot;&gt;8 바이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;long double&lt;/td&gt;
&lt;td style=&quot;width: 19.5386%;&quot;&gt;8 바이트&lt;/td&gt;
&lt;td style=&quot;width: 28.3588%;&quot;&gt;8, 12, 16 바이트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에 나오는 언어들은 double을 기본으로 사용한다. 하지만 float에 비해 double은 사이즈가 2배이기 때문에, 컴퓨터의 연산 속도나 메모리에 부담이 될 수 있다. 숫자를 많이 다루는 경우에는 float를 많이 사용한다. 예로, 딥러닝 같은 경우에는 GPU 계산을 할 때 float 위주로 작업된다.&lt;/p&gt;
&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;pre id=&quot;code_1742821437641&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;iomanip&amp;gt;
#include &amp;lt;limits&amp;gt;

using namespace std;

int main()
{
	float f;
	double d;
	long double ld;

	cout &amp;lt;&amp;lt; sizeof(f) &amp;lt;&amp;lt; endl;	// 4 sizeof(float)와 동일하다.
	cout &amp;lt;&amp;lt; sizeof(d) &amp;lt;&amp;lt; endl;	// 8
	cout &amp;lt;&amp;lt; sizeof(ld) &amp;lt;&amp;lt; endl;	// 8

	cout &amp;lt;&amp;lt; numeric_limits&amp;lt;float&amp;gt;::max() &amp;lt;&amp;lt; endl;	// 3.40282e+38
	cout &amp;lt;&amp;lt; numeric_limits&amp;lt;double&amp;gt;::max() &amp;lt;&amp;lt; endl;	// 1.79769e+308
	cout &amp;lt;&amp;lt; numeric_limits&amp;lt;long double&amp;gt;::max() &amp;lt;&amp;lt; endl;	// 1.79769e+308

	cout &amp;lt;&amp;lt; numeric_limits&amp;lt;float&amp;gt;::min() &amp;lt;&amp;lt; endl;	// 1.17549e-38
	cout &amp;lt;&amp;lt; numeric_limits&amp;lt;double&amp;gt;::min() &amp;lt;&amp;lt; endl;	// 2.22507e-308
	cout &amp;lt;&amp;lt; numeric_limits&amp;lt;long double&amp;gt;::min() &amp;lt;&amp;lt; endl;	// 2.22507e-308

	cout &amp;lt;&amp;lt; numeric_limits&amp;lt;float&amp;gt;::lowest() &amp;lt;&amp;lt; endl;	// -3.40282e+38
	cout &amp;lt;&amp;lt; numeric_limits&amp;lt;double&amp;gt;::lowest() &amp;lt;&amp;lt; endl;	// -1.79769e+308
	cout &amp;lt;&amp;lt; numeric_limits&amp;lt;long double&amp;gt;::lowest() &amp;lt;&amp;lt; endl;	// -1.79769e+308

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* min은 표현할 수 있는 가장 작은 값의 절대값을 리턴한다. 최소값을 알고 싶으면 lowest()를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742822063208&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	cout &amp;lt;&amp;lt; 3.14 &amp;lt;&amp;lt; endl;
	cout &amp;lt;&amp;lt; 31.4e-1 &amp;lt;&amp;lt; endl;	// 3.14 = 3.14 * 10^-1
	cout &amp;lt;&amp;lt; 31.4e-2 &amp;lt;&amp;lt; endl;	// 0.314 = 31.4 * 10^-2
	cout &amp;lt;&amp;lt; 31.4e1 &amp;lt;&amp;lt; endl;		// 314	= 31.4 * 10^1
	cout &amp;lt;&amp;lt; 31.4e2 &amp;lt;&amp;lt; endl;		// 3140 = 31.4 * 10^2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742822431756&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	cout &amp;lt;&amp;lt; 1.0 / 3.0 &amp;lt;&amp;lt; endl;	// 0.333333
	cout &amp;lt;&amp;lt; setprecision(16);
	cout &amp;lt;&amp;lt; 1.0 / 3.0 &amp;lt;&amp;lt; endl;	// 0.3333333333333333
	
	float f(123456789.0f);	// 10 significant digits
	cout &amp;lt;&amp;lt; setprecision(9);
	cout &amp;lt;&amp;lt; f &amp;lt;&amp;lt; endl;	// 123456792

	double d(0.1);
	cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; endl;	// 0.1
	cout &amp;lt;&amp;lt; setprecision(17);
	cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; endl;	// 0.10000000000000001

	double d1(1.0);
	double d2(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);
	cout &amp;lt;&amp;lt; d1 &amp;lt;&amp;lt; endl;	// 1
	cout &amp;lt;&amp;lt; d2 &amp;lt;&amp;lt; endl;	// 0.99999999999999989
	// 부동소수점 오차의 누적&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1742822924823&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cmath&amp;gt;

using namespace std;

int main()
{
	double zero = 0.0;
	double posinf = 5.0 / zero;
	double neginf = -5.0 / zero;
	double nan = zero / zero;

	cout &amp;lt;&amp;lt; posinf &amp;lt;&amp;lt; endl;	// inf
	cout &amp;lt;&amp;lt; neginf &amp;lt;&amp;lt; endl;	// -inf
	cout &amp;lt;&amp;lt; nan &amp;lt;&amp;lt; endl;	// -nan(ind)

	cout &amp;lt;&amp;lt; isnan(nan) &amp;lt;&amp;lt; endl;	// 1
	cout &amp;lt;&amp;lt; isnan(1.0) &amp;lt;&amp;lt; endl;	// 0

	cout &amp;lt;&amp;lt; isinf(posinf) &amp;lt;&amp;lt; endl;	// 1
	cout &amp;lt;&amp;lt; isinf(neginf) &amp;lt;&amp;lt; endl;	// 1

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* isnan : nan인지 확인하는 함수 (include cmath)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* isinf : inf인지 확인하는 함수 (include cmath)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.6 Boolean 자료형과 조건문 if&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Boolean 자료형은 조건을 판단할 때 많이 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Boolean 자료형이 가질 수 있는 값은 true(1), false(0) 두 가지 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743423911493&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main()
{
	bool b1 = true;	// copy initialization
	bool b2(false);	// direct initialization
	bool b3{ true };	// uniform initialization
	b3 = false;

	cout &amp;lt;&amp;lt; std::noboolalpha;
	cout &amp;lt;&amp;lt; b3 &amp;lt;&amp;lt; endl;	// 0
	cout &amp;lt;&amp;lt; b1 &amp;lt;&amp;lt; endl;	// 1

	cout &amp;lt;&amp;lt; std::boolalpha;
	cout &amp;lt;&amp;lt; b3 &amp;lt;&amp;lt; endl;	// false
	cout &amp;lt;&amp;lt; b1 &amp;lt;&amp;lt; endl;	// true

	// not operator
	cout &amp;lt;&amp;lt; !true &amp;lt;&amp;lt; endl;	// false
	cout &amp;lt;&amp;lt; !false &amp;lt;&amp;lt; endl;	// true

	cout &amp;lt;&amp;lt; (true &amp;amp;&amp;amp; true) &amp;lt;&amp;lt; endl;	// true
	cout &amp;lt;&amp;lt; (true &amp;amp;&amp;amp; false) &amp;lt;&amp;lt; endl;	// false
	cout &amp;lt;&amp;lt; (false &amp;amp;&amp;amp; true) &amp;lt;&amp;lt; endl;	// false
	cout &amp;lt;&amp;lt; (false &amp;amp;&amp;amp; false) &amp;lt;&amp;lt; endl;	// false

	cout &amp;lt;&amp;lt; (true || true) &amp;lt;&amp;lt; endl;	// true
	cout &amp;lt;&amp;lt; (true || false) &amp;lt;&amp;lt; endl;	// true
	cout &amp;lt;&amp;lt; (false || true) &amp;lt;&amp;lt; endl;	// true
	cout &amp;lt;&amp;lt; (false || false) &amp;lt;&amp;lt; endl;	// false

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.7 문자형 char&lt;/h2&gt;
&lt;pre id=&quot;code_1743505856691&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main()
{
	char c1(65);
	char c2('A');

	cout &amp;lt;&amp;lt; c1 &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; c2 &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; int(c1) &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; int(c2) &amp;lt;&amp;lt; endl;	// A A 65 65

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* c-style casting &lt;br /&gt;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;(char)65&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;cout &amp;lt;&amp;lt; (int)'A' &amp;lt;&amp;lt; endl;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* c++ stlye casting &lt;br /&gt;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;char(65)&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;int('A')&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 컴파일러에 casting이 문제 없는지 확인하는 과정을 거친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;static_cast&amp;lt;char&amp;gt;(65)&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl; &lt;br /&gt;cout&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;static_cast&amp;lt;int&amp;gt;('A')&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;endl;&lt;/p&gt;
&lt;pre id=&quot;code_1743505933397&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main()
{
	char c1(65);

	cin &amp;gt;&amp;gt; c1;
	cout &amp;lt;&amp;lt; c1 &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; static_cast&amp;lt;int&amp;gt;(c1) &amp;lt;&amp;lt; endl;

	cin &amp;gt;&amp;gt; c1;
	cout &amp;lt;&amp;lt; c1 &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; static_cast&amp;lt;int&amp;gt;(c1) &amp;lt;&amp;lt; endl;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 abc를 입력하면, 처음 cin에선 c1이 char형이기 때문에 a만 처리된다. 그리고 나머지 bc는 버퍼에 저장되어 있다가 두번째 cin에서 b가 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743506220885&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

int main()
{
	char c1(65);

	cout &amp;lt;&amp;lt; sizeof(char) &amp;lt;&amp;lt; endl;	// 1
	cout &amp;lt;&amp;lt; (int)numeric_limits&amp;lt;char&amp;gt;::max() &amp;lt;&amp;lt; endl;	// 127
	cout &amp;lt;&amp;lt; (int)numeric_limits&amp;lt;char&amp;gt;::lowest() &amp;lt;&amp;lt; endl;	// -128

	cout &amp;lt;&amp;lt; sizeof(unsigned char) &amp;lt;&amp;lt; endl;	// 1
	cout &amp;lt;&amp;lt; (int)numeric_limits&amp;lt;unsigned char&amp;gt;::max() &amp;lt;&amp;lt; endl;	// 255
	cout &amp;lt;&amp;lt; (int)numeric_limits&amp;lt;unsigned char&amp;gt;::lowest() &amp;lt;&amp;lt; endl;	// 0

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\n : new line&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\t : tab&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* endl과 \n의 차이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;endl은 버퍼에 있는걸 무조건 화면에 출력하고 줄을 바꾼다. 하지만 \n은 버퍼에 남아있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;std::flush는 버퍼에 있는걸 출력하고 줄을 바꾸지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wchar_t&amp;nbsp;c; &lt;br /&gt;char32_t&amp;nbsp;c3;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.8 리터럴 상수 (Literal Constants)&lt;/h2&gt;
&lt;pre id=&quot;code_1743509386195&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	float pi = 3.14f;
	unsigned int n = 5u;
	long n2 = 5L;
	double d = 6.0e-10;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* float는 초기화 변수 끝에 f를 붙여 준다. f를 붙이지 않으면 double로 인식한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;float pi = 3.14;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 선언하면 3.14가 double에서 float로 casting 되어 pi에 저장된다.&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;* Decimal (10진수) : 0 1 2 3 4 5 6 7 8 9 10&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* Octal (8진수) : 0 1 2 3 4 5 6 7 10 11 12 13&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* Hexa (16진수) : 0 1 2 3 4 5 6 7 8 9 A B C D E F 10&lt;/p&gt;
&lt;pre id=&quot;code_1743509594193&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	int x1 = 012;	// 8진수의 표현 -&amp;gt; 앞에 0 붙인다.
	cout &amp;lt;&amp;lt; x1 &amp;lt;&amp;lt; endl;	// 10

	int x2 = 0xF;	// 16진수의 표현 -&amp;gt; 앞에 0x 붙인다.
	cout &amp;lt;&amp;lt; x2 &amp;lt;&amp;lt; endl;	// 15

	int x3 = 0b1010;	// 2진수의 표현 -&amp;gt; 앞에 0b 붙인다.: c++14부터 가능하다.
	cout &amp;lt;&amp;lt; x3 &amp;lt;&amp;lt; endl;	// 10

	int x4 = 100'000'000;	// c++14부터 숫자 사이에 입력된 '는 컴파일러가 무시한다. 수를 구분하기 위해 사용하면 유용하다.
	cout &amp;lt;&amp;lt; x4 &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;* magic number 대신 const로 선언해서 사용하는게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.9 심볼릭 상수 (Symbolic constants)&lt;/h2&gt;
&lt;pre id=&quot;code_1743510218540&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	const double gravity{ 9.8 };	// gravity 값을 바꿀 수 없는 상수로 지정한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const는 고정된 숫자로 만들 때 사용한다.&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;pre id=&quot;code_1743510463011&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

// 파라미터로 전달된 값은 바꿀 필요가 없으므로 const를 붙여서 선언한다.
void printNumber(const int my_number)
{
	int n = my_number;	// 만약 바꾸려면 새로운 변수에 넣어서 사용한다.
	cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; endl;
}

int main()
{
	printNumber(123);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743510889795&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	int number;
	cin &amp;gt;&amp;gt; number;

	const int my_const(123);
	const int special_number(number);

	// number는 바꿀 수 있지만, special_number는 못 바꾼다.

	// my_const는 컴파일 시 정해진다. (컴파일 상수)
	// special_number는 실행을 해 봐야 알 수 있다. (런타임 상수)

	constexpr int my_const2(1234);	// 컴파일 시 결정되는 상수임을 명시한다.
	constexpr int special_number2(number);	// error&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;* define는 지양한다. 적용 범위가 너무 넓어서 디버깅이 힘들기 때문에. const를 사용하기로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;const가 여기저기 있으면 헷갈리기 때문에 따로 모아 놓고 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1743511301271&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// MY_CONSTANTS.h
namespace constants
{
	constexpr double pi(3.141592);
	constexpr float gravity(9.8);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1743511371420&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &quot;MY_CONSTANTS.h&quot;

int main()
{
	double a = 2 * constants::pi;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>C, C++, MFC/따배C++</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/27</guid>
      <comments>https://kimgopa.tistory.com/27#entry27comment</comments>
      <pubDate>Wed, 12 Mar 2025 22:43:53 +0900</pubDate>
    </item>
    <item>
      <title>섹션 1 - C++의 기초적인 사용법</title>
      <link>https://kimgopa.tistory.com/26</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.8 연산자와의 첫 만남&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*삼항 연산자(Ternary operator)&lt;/p&gt;
&lt;pre id=&quot;code_1719835987009&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int y = (x &amp;gt; 0) ? 1 : 2; // y = 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(조건) ? 조건이 참일 경우 return : 조건이 거짓일 경우 return;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.12 헤더 가드가 필요한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더 가드 (Header Guards)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더가 중복으로 선언되었을 경우를 대비하여 사용하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#pragma&amp;nbsp;once&lt;/p&gt;
&lt;pre id=&quot;code_1719836817674&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// MY_ADD가 이미 include 되어 있으면, 다시 include 하지 말라는 뜻
#ifndef MY_ADD
#define MY_ADD

void doSomething()
{
	add(1, 2);
}

#endif&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 전처리기는 아래로 대체가 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1719836903189&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#pragma once

#include &quot;add.h&quot;

void doSomething()
{
	add(1, 2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.13 네임스페이스 (명칭 공간, Namespace)&lt;/h2&gt;
&lt;pre id=&quot;code_1719837280787&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

namespace MySpace1
{
	int doSomething(int a, int b)
	{
		return a + b;
	}
}

int doSomething(int a, int b)
{
	return a * b;
}

using namespace std;

int main()
{
	cout &amp;lt;&amp;lt; MySpace1::doSomething(3, 4) &amp;lt;&amp;lt; endl;	// 7
	cout &amp;lt;&amp;lt; doSomething(3, 4) &amp;lt;&amp;lt; endl;	// 12

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1719837835019&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

namespace MySpace1
{
	namespace InnerSpace
	{
		int my_function()
		{
			return 0;
		}
	}

	int doSomething(int a, int b)
	{
		return a + b;
	}
}

namespace MySpace2
{
	int doSomething(int a, int b)
	{
		return a - b;
	}
}

using namespace std;

int ex1()
{
	using namespace MySpace1;

	cout &amp;lt;&amp;lt; doSomething(3, 4) &amp;lt;&amp;lt; endl; // 7
	cout &amp;lt;&amp;lt; InnerSpace::my_function() &amp;lt;&amp;lt; endl; // 0

	return 0;
}

int ex2()
{
	using namespace MySpace1::InnerSpace;

	cout &amp;lt;&amp;lt; my_function() &amp;lt;&amp;lt; endl; // 0

	return 0;
}


int main()
{
	ex1();
	ex2();

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1.14 전처리기와의 첫 만남&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전처리기 (Preprocessor)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전처리기는 빌드 전에 결정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 OS가 윈도우인지, 리눅스인지 확인할 때, 그래픽카드를 확인할 때 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1719838477191&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;

using namespace std;

#define MY_NUMBER 8
#define MY_WORD &quot;Hello, World&quot;
#define MAX(a, b) (((a) &amp;gt; (b)) ? (a) : (b))
#define LIKE_APPLE

int main()
{
	cout &amp;lt;&amp;lt; MY_NUMBER &amp;lt;&amp;lt; endl; // 8
	cout &amp;lt;&amp;lt; MY_WORD &amp;lt;&amp;lt; endl; // Hello, World
	cout &amp;lt;&amp;lt; MAX(1, 3) &amp;lt;&amp;lt; endl; // 3

#ifdef LIKE_APPLE
	cout &amp;lt;&amp;lt; &quot;Apple&quot; &amp;lt;&amp;lt; endl; // LIKE_APPLE이 정의되어 있을 경우
#endif

#ifndef LIKE_APPLE
	cout &amp;lt;&amp;lt; &quot;Orange&quot; &amp;lt;&amp;lt; endl; // LIKE_APPLE이 정의되어 있지 않을 경우
#endif

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** #define은 선언된 cpp 파일 내에서만 사용 가능하다.&lt;/p&gt;</description>
      <category>C, C++, MFC/따배C++</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/26</guid>
      <comments>https://kimgopa.tistory.com/26#entry26comment</comments>
      <pubDate>Mon, 1 Jul 2024 21:57:29 +0900</pubDate>
    </item>
    <item>
      <title>섹션 0 - 시작해봅시다</title>
      <link>https://kimgopa.tistory.com/25</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;0.4.0 통합개발환경의 기본적인 사용법 - 윈도우즈 비쥬얼 스튜디오&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 통합개발환경 : Integrated Development Environment (IDE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Menu - [File] - [New] - [Project] - Create a new project - Windows Desktop Wizard&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/obQ5L/btsDUK45p3q/Fn6TEBk8WJgdFBgbEvKJWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/obQ5L/btsDUK45p3q/Fn6TEBk8WJgdFBgbEvKJWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/obQ5L/btsDUK45p3q/Fn6TEBk8WJgdFBgbEvKJWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FobQ5L%2FbtsDUK45p3q%2FFn6TEBk8WJgdFBgbEvKJWK%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;1014&quot; height=&quot;675&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JHMNY/btsDLMjlnHc/ZE8AnzAgptmi6RTN926kO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JHMNY/btsDLMjlnHc/ZE8AnzAgptmi6RTN926kO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JHMNY/btsDLMjlnHc/ZE8AnzAgptmi6RTN926kO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJHMNY%2FbtsDLMjlnHc%2FZE8AnzAgptmi6RTN926kO0%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;1014&quot; height=&quot;675&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhpu1g/btsDQ6VDSXs/2tAx5KPS3SaksakZOgJdy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhpu1g/btsDQ6VDSXs/2tAx5KPS3SaksakZOgJdy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhpu1g/btsDQ6VDSXs/2tAx5KPS3SaksakZOgJdy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhpu1g%2FbtsDQ6VDSXs%2F2tAx5KPS3SaksakZOgJdy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;439&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Application type&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows Application (.exe)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Console Application (.exe)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dynamic Link Library (.dll) : 다른 프로젝트에 기능을 제공하기 위한 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Static Library (.lib) : : 다른 프로젝트에 기능을 제공하기 위한 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Additional Options&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Empty project : 빈 프로젝트 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Precompiled Header : 소스 파일이 많을 경우 빌드 타임을 줄여 줄 수 있다. 멀티 플렛폼 코드를 짤 때는 사용하지 않는다. (리눅스에선 빌드 되지 않음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부등호(larger-than/less-than)를 angle bracket이나 carot으로 부르기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; left angle bracket, left carot&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; right angle bracket, right carot&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vcxproj : 프로젝트 정보를 담고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Source.cpp 파일을 빌드하면&amp;nbsp;Source.obj 파일이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스 파일이 obj 파일로 생성된다. obj 파일이 여러개 있으면 링크를 시켜 exe 파일을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH58nk/btsDQ5PXMH8/enRoEqTaIJK1qHSDuNFwtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH58nk/btsDQ5PXMH8/enRoEqTaIJK1qHSDuNFwtK/img.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;725&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;37.55&quot; style=&quot;width: 37.1139%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH58nk/btsDQ5PXMH8/enRoEqTaIJK1qHSDuNFwtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH58nk%2FbtsDQ5PXMH8%2FenRoEqTaIJK1qHSDuNFwtK%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;774&quot; height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFQzJa/btsDSqGeBIo/HNhzVf3lYhjwjfii09bm4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFQzJa/btsDSqGeBIo/HNhzVf3lYhjwjfii09bm4K/img.png&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;628&quot; data-is-animation=&quot;false&quot; style=&quot;width: 61.7233%;&quot; data-widthpercent=&quot;62.45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFQzJa/btsDSqGeBIo/HNhzVf3lYhjwjfii09bm4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFQzJa%2FbtsDSqGeBIo%2FHNhzVf3lYhjwjfii09bm4K%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;/&gt;&lt;/span&gt;&lt;/div&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;Debug : Debug할 때 도움이 되는 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Release : 배포할 때 필요한 것만 최소한으로 들어있기 때문에 사이즈가 작다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Debug / Release 속도 차이가 난다. Release 모드가 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x86 : 32bit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x64 : 64bit, 메모리 사용이 큼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;0.4.1&lt;span&gt; 통합개발환경의 기본적인 사용법 - 윈도우즈 리눅스 코드블럭스&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. Code::Blocks 설치 및 다운로드&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1770&quot; data-origin-height=&quot;926&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sVgqS/btsEPIFKn3l/G0eDrrqsWbMoKT0IegJkkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sVgqS/btsEPIFKn3l/G0eDrrqsWbMoKT0IegJkkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sVgqS/btsEPIFKn3l/G0eDrrqsWbMoKT0IegJkkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsVgqS%2FbtsEPIFKn3l%2FG0eDrrqsWbMoKT0IegJkkK%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;1770&quot; height=&quot;926&quot; data-origin-width=&quot;1770&quot; data-origin-height=&quot;926&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드블럭스는 GCC 컴파일러를 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 받은 설차파일을 실행하여 코드블럭스 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Default 설치 진행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 프로젝트 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 코드블럭스 실행 &amp;gt; File &amp;gt; New &amp;gt; Project &amp;gt; Empty project&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yJUCZ/btsEGRjEUzr/Rix1HCa4PuZAAIWiZmFbUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yJUCZ/btsEGRjEUzr/Rix1HCa4PuZAAIWiZmFbUk/img.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;511&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yJUCZ/btsEGRjEUzr/Rix1HCa4PuZAAIWiZmFbUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyJUCZ%2FbtsEGRjEUzr%2FRix1HCa4PuZAAIWiZmFbUk%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;534&quot; height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qO5tB/btsEJct7Gx2/fP3LTJd8mbLm3sdwkb1VH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qO5tB/btsEJct7Gx2/fP3LTJd8mbLm3sdwkb1VH1/img.png&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;511&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qO5tB/btsEJct7Gx2/fP3LTJd8mbLm3sdwkb1VH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqO5tB%2FbtsEJct7Gx2%2FfP3LTJd8mbLm3sdwkb1VH1%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;534&quot; height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/div&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;2) New file &amp;gt; Empty file &amp;gt; main.cpp 파일 추가 &amp;gt; Build &amp;gt; Run&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1033&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8MytG/btsEORQivnO/45joiYXZd25QKvEgqOk1yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8MytG/btsEORQivnO/45joiYXZd25QKvEgqOk1yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8MytG/btsEORQivnO/45joiYXZd25QKvEgqOk1yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8MytG%2FbtsEORQivnO%2F45joiYXZd25QKvEgqOk1yK%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;1920&quot; height=&quot;1033&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1033&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;0.4.2 비쥬얼 스튜디오 솔루션, 프로젝트 관리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt; 솔루션 아래에 여러 개의 프로젝트를 만들 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;솔루션&lt;br /&gt;- 프로젝트1&lt;br /&gt;- 프로젝트2&lt;br /&gt;- ...&lt;/blockquote&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>C, C++, MFC/따배C++</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/25</guid>
      <comments>https://kimgopa.tistory.com/25#entry25comment</comments>
      <pubDate>Tue, 13 Feb 2024 20:41:03 +0900</pubDate>
    </item>
    <item>
      <title>컴파일 날짜 표시 : __DATE__</title>
      <link>https://kimgopa.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 날짜를 표시해야 할 일이 있어서 전처리 매크로인 __DATE__를 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;__DATE__ : 컴파일 날짜&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;__TIME__ : 컴파일 시간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;__DATE__는 출력 시 Apr 5 2022 라고 나오기 때문에 용도에 맞게 변환이 필요했다.&lt;/p&gt;
&lt;pre id=&quot;code_1649158834712&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char s_month[5];
int month, day, year;
static const char month_names[] = &quot;JanFebMarAprMayJunJulAugSepOctNovDec&quot;;
sscanf(__DATE__, &quot;%s %d %d&quot;, s_month, &amp;amp;day, &amp;amp;year);
month = (strstr(month_names, s_month) - month_names) / 3 + 1;

CString strVersion;
strVersion.Format(_T(&quot;%d%02d%02d&quot;), year, month, day); // YYYYMMDD&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ikpil.com/1279&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.ikpil.com/1279&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://code-examples.net/en/q/1aee96&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://code-examples.net/en/q/1aee96&lt;/a&gt;&lt;/p&gt;</description>
      <category>C, C++, MFC</category>
      <category>__DATE__</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/23</guid>
      <comments>https://kimgopa.tistory.com/23#entry23comment</comments>
      <pubDate>Tue, 5 Apr 2022 20:45:33 +0900</pubDate>
    </item>
    <item>
      <title>자료구조와 알고리즘</title>
      <link>https://kimgopa.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램은 자료를 처리하기 위해 &lt;b&gt;자료구조(data structure)&lt;/b&gt;를 사용한다. 또한 주어진 문제를 처리하는 절차를 &lt;b&gt;알고리즘(algorithm)&lt;/b&gt;이라고 한다. 예를 들어 자료를 저장하는 배열이 자료구조가 되고, 배열에 저장된 값 중 가장 큰 값을 찾는 절차를 알고리즘이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;프로그램 = 자료구조 + 알고리즘&lt;/i&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0개 이상의 입력이 존재해야 한다.&lt;/li&gt;
&lt;li&gt;1개 이상의 출력이 존재해야 한다.&lt;/li&gt;
&lt;li&gt;각 명령어의 의미는 모호하지 않고 명확해야 한다.&lt;/li&gt;
&lt;li&gt;한정된 수의 단계 후에는 반드시 종료되어야 한다.&lt;/li&gt;
&lt;li&gt;각 명령어들은 실행 가능한 연산이어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Data Structure</category>
      <category>algorithm</category>
      <category>dataStructure</category>
      <category>알고리즘</category>
      <category>자료구조</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/21</guid>
      <comments>https://kimgopa.tistory.com/21#entry21comment</comments>
      <pubDate>Fri, 7 Jan 2022 22:00:21 +0900</pubDate>
    </item>
    <item>
      <title>MFC Excel Automation (엑셀 자동화)</title>
      <link>https://kimgopa.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일을 하다가 MFC에서 엑셀 라이브러리를 사용할 일이 있어 정리해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. 개발 환경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* windows 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Visual Studio 2015&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Excel 2016&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, ExcelAutomation이라는 프로젝트를 생성했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. TypeLib의 MFC 클래스 추가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 마우스 우측 버튼 클릭 후 [추가] - [클래스] 메뉴에서 TypeLib의 MFC 클래스를 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CGJJa/btrpMQx0mWB/IbfQSnJo00rxznjKBtQSM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CGJJa/btrpMQx0mWB/IbfQSnJo00rxznjKBtQSM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CGJJa/btrpMQx0mWB/IbfQSnJo00rxznjKBtQSM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCGJJa%2FbtrpMQx0mWB%2FIbfQSnJo00rxznjKBtQSM1%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;941&quot; height=&quot;653&quot; data-filename=&quot;1.PNG&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;653&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;MSDN에는 레지스트리에서 &lt;span style=&quot;background-color: #ffffff; color: #171717;&quot;&gt;Microsoft Excel 10.0 Object Library를 선택하라고 나오는데, 내 개발 환경에서 해당 라이브러리는 보이지 않았다. 그래서 파일을 선택하고 엑셀 설치 경로에서 EXCEL.EXE 파일을 지정해준다.&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #171717;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 나면 인터페이스가 뜨는데, 필요한 것들을 선택해준다. MDSN을 참고하여 아래의 인터페이스를 선택했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;_Application&lt;/li&gt;
&lt;li&gt;_Workbook&lt;/li&gt;
&lt;li&gt;_Worksheet&lt;/li&gt;
&lt;li&gt;Range&lt;/li&gt;
&lt;li&gt;Workbooks&lt;/li&gt;
&lt;li&gt;Worksheets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCPci5/btrpJRYJNWk/wA8dmjiorHUCK3bJXyI8KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCPci5/btrpJRYJNWk/wA8dmjiorHUCK3bJXyI8KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCPci5/btrpJRYJNWk/wA8dmjiorHUCK3bJXyI8KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCPci5%2FbtrpJRYJNWk%2FwA8dmjiorHUCK3bJXyI8KK%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;667&quot; height=&quot;606&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;606&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;그러면 아래와 같이 프로젝트에 해당 클래스들이 추가된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.PNG&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n9Kwm/btrpKlyu2zU/MG7sFhTmJ1Pu5Yw6ZyX080/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n9Kwm/btrpKlyu2zU/MG7sFhTmJ1Pu5Yw6ZyX080/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n9Kwm/btrpKlyu2zU/MG7sFhTmJ1Pu5Yw6ZyX080/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn9Kwm%2FbtrpKlyu2zU%2FMG7sFhTmJ1Pu5Yw6ZyX080%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;252&quot; height=&quot;224&quot; data-filename=&quot;3.PNG&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;224&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;h2 data-ke-size=&quot;size26&quot;&gt;2. 빌드 에러 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 빌드를 하면 에러가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가한 모든 엑셀 관련 클래스들의 헤더 파일 상단 import 구문을 주석처리한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.PNG&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWgnP0/btrpDLq2wSQ/RRcMtPRIAxRvFY1Kj3kza0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWgnP0/btrpDLq2wSQ/RRcMtPRIAxRvFY1Kj3kza0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWgnP0/btrpDLq2wSQ/RRcMtPRIAxRvFY1Kj3kza0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWgnP0%2FbtrpDLq2wSQ%2FRRcMtPRIAxRvFY1Kj3kza0%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;944&quot; height=&quot;118&quot; data-filename=&quot;4.PNG&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 빌드 후 CRange.h에서 에러가 발생하는데, 아래와 같이 CRange.h의 DialogBox 함수 앞에 _를 붙이거나 주석처리해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.PNG&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9sgwi/btrpHGCY1rU/UEJYRjKgaR45I3TS8x4vtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9sgwi/btrpHGCY1rU/UEJYRjKgaR45I3TS8x4vtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9sgwi/btrpHGCY1rU/UEJYRjKgaR45I3TS8x4vtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9sgwi%2FbtrpHGCY1rU%2FUEJYRjKgaR45I3TS8x4vtk%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;818&quot; height=&quot;103&quot; data-filename=&quot;5.PNG&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게되면 MFC 엑셀 개발 환경이 갖춰지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Source Code&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크는 관련 테스트 프로젝트 소스이다.&lt;/p&gt;
&lt;figure id=&quot;og_1641215231896&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - kimgopa/mfc_project: visual c++ mfc project&quot; data-og-description=&quot;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/ExcelAutomation&quot; data-og-url=&quot;https://github.com/kimgopa/mfc_project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/epB0ev/hyMXGy4Wxn/4MgMYnwIQaOfno5M6Oobm1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/kimgopa/mfc_project/tree/main/ExcelAutomation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/ExcelAutomation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/epB0ev/hyMXGy4Wxn/4MgMYnwIQaOfno5M6Oobm1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - kimgopa/mfc_project: visual c++ mfc project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 참고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 참고한 문서 및 블로그 링크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/previous-versions/office/troubleshoot/office-developer/automate-excel-from-mfc-fill-data&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/previous-versions/office/troubleshoot/office-developer/automate-excel-from-mfc-fill-data&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-KR/previous-versions/office/troubleshoot/office-developer/use-type-library-for-office-from-visual-c-net&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/ko-KR/previous-versions/office/troubleshoot/office-developer/use-type-library-for-office-from-visual-c-net&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://oceancoding.blogspot.com/2019/11/c-excel-automation.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://oceancoding.blogspot.com/2019/11/c-excel-automation.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C, C++, MFC</category>
      <category>ExcelAutomation</category>
      <category>MFC</category>
      <category>MFC엑셀</category>
      <category>엑셀자동화</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/20</guid>
      <comments>https://kimgopa.tistory.com/20#entry20comment</comments>
      <pubDate>Mon, 3 Jan 2022 22:12:20 +0900</pubDate>
    </item>
    <item>
      <title>토이 프로젝트 - 캘린더 프로그램 (2)</title>
      <link>https://kimgopa.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;캘린더를 수정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 내역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 이전 달, 다음 달 캘린더 확인 기능 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 오늘 날짜로 돌아오기 기능 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 리사이징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 캘린더 년도, 월 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;761&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0bZpr/btq6uHHw1M4/akir8uyZsBBIovDAAGD471/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0bZpr/btq6uHHw1M4/akir8uyZsBBIovDAAGD471/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0bZpr/btq6uHHw1M4/akir8uyZsBBIovDAAGD471/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0bZpr%2Fbtq6uHHw1M4%2Fakir8uyZsBBIovDAAGD471%2Fimg.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;761&quot; data-ke-mobilestyle=&quot;widthOrigin&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그밖에도 소스 정리도 좀 하고, 잘못된 코드도 고쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수 캘린더 뷰잉 기능은 완료했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가하거나 변경해야 할 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이쁜 UI&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오늘 날짜 표현하는 방밥 바꾸기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시작 요일 설정 (일요일부터, 월요일부터 ...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 아이콘 바꾸기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리사이징 잔상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1622727620406&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;kimgopa/mfc_project&quot; data-og-description=&quot;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/Calendar&quot; data-og-url=&quot;https://github.com/kimgopa/mfc_project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/by3AjY/hyKrGISy1G/NKMbzI5BxgUPCrXK6if3L1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/kimgopa/mfc_project/tree/main/Calendar&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/Calendar&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/by3AjY/hyKrGISy1G/NKMbzI5BxgUPCrXK6if3L1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;kimgopa/mfc_project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C, C++, MFC</category>
      <category>MFC</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/19</guid>
      <comments>https://kimgopa.tistory.com/19#entry19comment</comments>
      <pubDate>Thu, 3 Jun 2021 22:41:39 +0900</pubDate>
    </item>
    <item>
      <title>토이 프로젝트 - 캘린더 프로그램 (1)</title>
      <link>https://kimgopa.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MFC 프로그래밍 연습 겸 토이 프로젝트를 하나 만들었다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;761&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYDvSR/btq6fSCsjfb/kCRltPbwoWDXDhPH9psil0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYDvSR/btq6fSCsjfb/kCRltPbwoWDXDhPH9psil0/img.png&quot; data-alt=&quot;5월 31일 월요일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYDvSR/btq6fSCsjfb/kCRltPbwoWDXDhPH9psil0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYDvSR%2Fbtq6fSCsjfb%2FkCRltPbwoWDXDhPH9psil0%2Fimg.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;761&quot; data-ke-mobilestyle=&quot;widthOrigin&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;5월 31일 월요일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;761&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmk7pY/btq6fTVEvxO/7NHe8Op41LQmcYtIeH5ImK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmk7pY/btq6fTVEvxO/7NHe8Op41LQmcYtIeH5ImK/img.png&quot; data-alt=&quot;6월 6일 일요일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmk7pY/btq6fTVEvxO/7NHe8Op41LQmcYtIeH5ImK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmk7pY%2Fbtq6fTVEvxO%2F7NHe8Op41LQmcYtIeH5ImK%2Fimg.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;761&quot; data-ke-mobilestyle=&quot;widthOrigin&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;6월 6일 일요일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 만들어서 그런지 너무 지저분한 코드였다.&lt;/p&gt;
&lt;p 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;그냥 MFC 자체가 낯설었던 것 같다.&lt;/p&gt;
&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;- 이쁜 UI&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오늘 날짜 표현하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 년도 표기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1622457782171&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;kimgopa/mfc_project&quot; data-og-description=&quot;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/Calendar&quot; data-og-url=&quot;https://github.com/kimgopa/mfc_project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8w4rU/hyKoZa0lJa/bcH0qdamE7KNrlLkbLWHWk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/kimgopa/mfc_project/tree/main/Calendar&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/Calendar&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8w4rU/hyKoZa0lJa/bcH0qdamE7KNrlLkbLWHWk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;kimgopa/mfc_project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C, C++, MFC</category>
      <category>MFC</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/17</guid>
      <comments>https://kimgopa.tistory.com/17#entry17comment</comments>
      <pubDate>Mon, 31 May 2021 19:47:37 +0900</pubDate>
    </item>
    <item>
      <title>OpenCV 설치와 Visual Studio 2019에서의 사용법</title>
      <link>https://kimgopa.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 설치환경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenCV-4.5.2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Windows 10&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Visual Studio 2019&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OpenCV 설치 실행 파일을 이용한 설치&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. OpenCV 실행 파일 다운로드&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSYD39/btq2zCjn2wf/JX9guY5wOAkh6L6wDrkH70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSYD39/btq2zCjn2wf/JX9guY5wOAkh6L6wDrkH70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSYD39/btq2zCjn2wf/JX9guY5wOAkh6L6wDrkH70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSYD39%2Fbtq2zCjn2wf%2FJX9guY5wOAkh6L6wDrkH70%2Fimg.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OpenCV 사이트에서 Windows용 실행 파일을 다운로드한다. 그러면 opencv-4.5.2-vc14_vc15.exe 파일이 다운로드 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. OpenCV 실행 파일 압축 풀기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNlA5i/btq2x4Ovav4/H5o6DLVxZTFEDbo7qX1CJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNlA5i/btq2x4Ovav4/H5o6DLVxZTFEDbo7qX1CJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNlA5i/btq2x4Ovav4/H5o6DLVxZTFEDbo7qX1CJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNlA5i%2Fbtq2x4Ovav4%2FH5o6DLVxZTFEDbo7qX1CJ1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;exe 파일을 실행하면 위와 같이 경로를 선택하는 창이 뜬다. 나는 C 드라이브를 선택하고 압축을 풀었다. 그러면 C드라이브에 opencv라는 폴더가 생성되고, 그 아래에 OpenCV 관련 파일이 생성된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. OpenCV 환경 변수 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OpenCV 응용 프로그램을 실행하려면 OpenCV DLL 파일이 필요하다. 따라서 OpenCV DLL 파일이 있는 경로를 시스템 환경 변수에 추가해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYOYG8/btq2zdD2JGE/KCiuu94iqMcc8aBvodNwx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYOYG8/btq2zdD2JGE/KCiuu94iqMcc8aBvodNwx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYOYG8/btq2zdD2JGE/KCiuu94iqMcc8aBvodNwx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYOYG8%2Fbtq2zdD2JGE%2FKCiuu94iqMcc8aBvodNwx0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;사용자 변수에 OPENCV_DIR 이름의 환경 변수를 추가해준다.&lt;/p&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; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJHBbw/btq2C38b6QY/TlCIBs7SaZVE4A7Okgvfuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJHBbw/btq2C38b6QY/TlCIBs7SaZVE4A7Okgvfuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJHBbw/btq2C38b6QY/TlCIBs7SaZVE4A7Okgvfuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJHBbw%2Fbtq2C38b6QY%2FTlCIBs7SaZVE4A7Okgvfuk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;그리고 Path 환경 변수에 %OPENCV_DIR%\x64\vc15\bin를 추가해준다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. OpenCV 설치 확인&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ygOQw/btq2E8utiGY/2fr85Nt9JpuzJc7r7NihR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ygOQw/btq2E8utiGY/2fr85Nt9JpuzJc7r7NihR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ygOQw/btq2E8utiGY/2fr85Nt9JpuzJc7r7NihR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FygOQw%2Fbtq2E8utiGY%2F2fr85Nt9JpuzJc7r7NihR1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;환경 변수 설정을 제대로 했는지 확인하기 위해, cmd 창에서 opencv_version.exe를 쳐본다. 버전 정보가 나오면 완료한 것이다. 나는 환경 변수 설정을 완료한 뒤 윈도우 재시작을 했더니 됐다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Visual Studio 2019에서의 OpenCV 사용&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 프로젝트 생성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wvzNN/btq2CIDvVNK/bY9jFq4kvsSxUfsgvbs9uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wvzNN/btq2CIDvVNK/bY9jFq4kvsSxUfsgvbs9uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wvzNN/btq2CIDvVNK/bY9jFq4kvsSxUfsgvbs9uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwvzNN%2Fbtq2CIDvVNK%2FbY9jFq4kvsSxUfsgvbs9uk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;새 프로젝트 생성에서 Windows Desktop Wizard를 선택한다.&lt;/p&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; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rU46D/btq2ESZwUkP/Sijc33f2fEWzBNCQ2GljG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rU46D/btq2ESZwUkP/Sijc33f2fEWzBNCQ2GljG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rU46D/btq2ESZwUkP/Sijc33f2fEWzBNCQ2GljG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrU46D%2Fbtq2ESZwUkP%2FSijc33f2fEWzBNCQ2GljG1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;&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; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhemhk/btq2C4fgf2W/E5GhtJYsYIXFOlZCUuIZv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhemhk/btq2C4fgf2W/E5GhtJYsYIXFOlZCUuIZv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhemhk/btq2C4fgf2W/E5GhtJYsYIXFOlZCUuIZv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhemhk%2Fbtq2C4fgf2W%2FE5GhtJYsYIXFOlZCUuIZv0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;그리고 콘솔 응용 프로그램, 빈 프로젝트를 선택하고 OK를 누르면 새 프로젝트가 생성된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 솔루션 64비트 설정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK6Xsa/btq2D4y8GE2/ahEr0u3QZeKkLurtXExikK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK6Xsa/btq2D4y8GE2/ahEr0u3QZeKkLurtXExikK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK6Xsa/btq2D4y8GE2/ahEr0u3QZeKkLurtXExikK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK6Xsa%2Fbtq2D4y8GE2%2FahEr0u3QZeKkLurtXExikK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;OpenCV 라이브러리는 64비트로 빌드되었기 떄문에 Visual Studio에서도 64비트로 변경해 주어야 한다. 위와 같이 x64를 선택하여 64비트로 변경한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 소스 코드 작성&lt;/h3&gt;
&lt;p&gt;main.cpp 파일을 추가하고 아래와 같이 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1618418694588&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;opencv2/opencv.hpp&quot;
#include &amp;lt;iostream&amp;gt;

int main()
{
	std::cout &amp;lt;&amp;lt; &quot;Hello OpenCV &quot; &amp;lt;&amp;lt; CV_VERSION &amp;lt;&amp;lt; std::endl;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Visual Studio에 소스 코드를 입력하면 잘못되었다고 표시가 된다. &lt;span style=&quot;color: #333333;&quot;&gt;Visual Studio에서 OpenCV 라이브러리를 사용하려고 하는데 파일의 경로를 알 수 없기 때문이다. 따라서&amp;nbsp;&lt;/span&gt;파일이 위치한 폴더를 인식할 수 있도록 프로젝트 설정을 해줘야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. OpenCV 라이브러리 폴더 경로 설정&lt;/h3&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;h4 data-ke-size=&quot;size20&quot;&gt;OpenCV 헤더 파일 경로 (추가 포함 디렉터리)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0aobU/btq2yoM5j7c/g3Ak9gKNrid0JDwGzQ4IL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0aobU/btq2yoM5j7c/g3Ak9gKNrid0JDwGzQ4IL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0aobU/btq2yoM5j7c/g3Ak9gKNrid0JDwGzQ4IL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0aobU%2Fbtq2yoM5j7c%2Fg3Ak9gKNrid0JDwGzQ4IL1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[C/C++] - [General] 탭의 Additional Include Directories 항목에 &lt;b&gt;$(OPENCV_DIR)\include&lt;/b&gt;를 추가해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OpenCV 라이브러리 파일 경로 (추가 라이브러리 디렉터리)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uuezM/btq2D3tvZHn/fVky6qDeCBGtMcG7hoMq81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uuezM/btq2D3tvZHn/fVky6qDeCBGtMcG7hoMq81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uuezM/btq2D3tvZHn/fVky6qDeCBGtMcG7hoMq81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuuezM%2Fbtq2D3tvZHn%2FfVky6qDeCBGtMcG7hoMq81%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[Linker] - [General] 탭의 Additional Library Directories 항목에 &lt;b&gt;$(OPENCV_DIR)\x64\vc15\lib&lt;/b&gt;를 추가해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로젝트에서 사용할 OpenCV 라이브러리 이름 (추가 종속성)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6ctPX/btq2CIjg1gN/BKAKg2ZRWIYcPRRLM84y40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6ctPX/btq2CIjg1gN/BKAKg2ZRWIYcPRRLM84y40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6ctPX/btq2CIjg1gN/BKAKg2ZRWIYcPRRLM84y40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6ctPX%2Fbtq2CIjg1gN%2FBKAKg2ZRWIYcPRRLM84y40%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/couGEI/btq2CjYmd4e/3ec2ENXQx1GhPeHu5uQpEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/couGEI/btq2CjYmd4e/3ec2ENXQx1GhPeHu5uQpEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/couGEI/btq2CjYmd4e/3ec2ENXQx1GhPeHu5uQpEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcouGEI%2Fbtq2CjYmd4e%2F3ec2ENXQx1GhPeHu5uQpEK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;[Linker] - [Input] 탭의 Additional Dependencies 항목에 추가해준다. 이때, &lt;b&gt;Debug&lt;/b&gt; 모드에서는 &lt;b&gt;opencv_world452d.lib&lt;/b&gt;를 입력해주고, &lt;b&gt;Release&lt;/b&gt; 모드에서는 &lt;b&gt;opencv_world452.lib&lt;/b&gt;를 입력해준다. 즉, ~d.lib로 끝나는 파일은 Debug 모드에서 사용하는 파일이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 실행 결과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pw85Z/btq2BDvL9kj/MXda01s7KHHDk0RV7dTGr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pw85Z/btq2BDvL9kj/MXda01s7KHHDk0RV7dTGr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pw85Z/btq2BDvL9kj/MXda01s7KHHDk0RV7dTGr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpw85Z%2Fbtq2BDvL9kj%2FMXda01s7KHHDk0RV7dTGr0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;설정 후 소스 코드를 실행해보면 위와 같은 결과가 나오는 것을 확인할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;BMP 파일 출력 예제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에 사용한 HelloCV 프로젝트에 소스 코드를 추가하여 BMP 파일을 출력하는 예제를 작성해본다.&lt;/p&gt;
&lt;pre id=&quot;code_1618423264014&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;opencv2/opencv.hpp&quot;
#include &amp;lt;iostream&amp;gt;

using namespace cv;
using namespace std;

int main()
{
	cout &amp;lt;&amp;lt; &quot;Hello OpenCV &quot; &amp;lt;&amp;lt; CV_VERSION &amp;lt;&amp;lt; endl;

	Mat img;
	img = imread(&quot;lenna.bmp&quot;);	// bmp 파일을 불러와 img 변수에 저장

	if (img.empty())	// 예외 처리 - bmp 파일을 불러오지 못했을 경우 empty()는 true 반환
	{
		cerr &amp;lt;&amp;lt; &quot;Image load failed!&quot; &amp;lt;&amp;lt; endl;
		return -1;
	}

	namedWindow(&quot;image&quot;);	// 영상을 화면에 나타내기 위한 image라는 새로운 창 생성
	imshow(&quot;image&quot;, img);	// image라는 창에 img 객체 출력
	
	waitKey();	// 사용자의 키보드 입력을 기다리는 함수 - 사용자가 키보드를 누르면 다음 행으로 넘어감

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OpenCV에서 영상 데이터는 Mat 클래스를 이용하여 표현한다. Mat 클래스는 다양한 자료형의 행렬을 표현할 수 있는 범용 행렬 클래스이다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>OpenCV</category>
      <category>OpenCV</category>
      <category>opencv프로젝트설정</category>
      <category>VisualStudio2019</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/16</guid>
      <comments>https://kimgopa.tistory.com/16#entry16comment</comments>
      <pubDate>Thu, 15 Apr 2021 03:10:58 +0900</pubDate>
    </item>
    <item>
      <title>동적 링크 라이브러리(DLL) - DLL 생성과 암시적/명시적 연결</title>
      <link>https://kimgopa.tistory.com/13</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;정적 링크 라이브러리 / 동적 링크 라이브러리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정적 링크 라이브러리 (Static Link Library)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++는 기본적인 문법사항만을 규정하며, 프로그래밍에 필요한 많은 유용한 기능들은 라이브러리 형태로 제공된다. 예를 들어 strlen() 이라는 함수는 라이브러리 형태로 제공된다. 프로그램에서 strlen 함수를 사용하면 소스코드가 컴파일 된 후 링크될 때, 라이브러리 파일에서 strlen 함수의 기능이 구현된 부분이 실행파일에 덧붙여진다. 이렇게 생성된 실행파일은 단독으로 strlen 함수의 기능을 수행할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동적 링크 라이브러리 (Dynamic Link Library)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 기능이 실행 파일에 직접 덧붙여지지 않고, DLL 파일에 독립적으로 존재하다가 프로그램이 실행될 때 동적으로 링크되어 사용되는 것이다. 따라서 동적 링크 라이브러리는 실행 가능한 코드로 이루어지지만 단독으로는 실행될 수 없다. 단독으로 실행 가능한 다른 프로그램의 호출을 받아 그 프로그램의 기능을 일부 분담한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MFC 또한 일종의 라이브러리이다. 따라서 MFC도 프로그램에 정적으로 링크 될 것인지 동적으로 링크 될 것인지 설정할 수 있다. 아래 설정에서 MFC 라이브러리 설정을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caZPOs/btqXrDIhqyd/XXUUr9AD5nczkqwwYmlPDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caZPOs/btqXrDIhqyd/XXUUr9AD5nczkqwwYmlPDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caZPOs/btqXrDIhqyd/XXUUr9AD5nczkqwwYmlPDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaZPOs%2FbtqXrDIhqyd%2FXXUUr9AD5nczkqwwYmlPDk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Use MFC in a Shared DLL]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MFC 라이브러리가 실행 파일에 덧붙여지지 않고 프로그램을 실행할 때 동적으로 링크됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;실행 파일의 크기가 작음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로그램이 실행될 때 MFC 라이브러리가 담겨있는 DLL 파일이 반드시 필요함&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[Use MFC in a Static DLL]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MFC 라이브러리가 실행 파일에 덧붙여져 프로그램을 실행시킬 때 정적으로 링크됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 파일의 크기가 큼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 DLL 파일이 필요 없고 실행 파일을 단독으로 실행시킬 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;일반 DLL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 DLL 라이브러리를 작성하면 C++ 뿐만 아니라 다른 프로그래밍 언어에서도 사용할 수 있는 범용적인 DLL을 만들 수 있다. 외부에서 사용되기 위해 만들어지는 라이브러리 함수는 모두 C 함수의 형태로 만들어져야 한다. 클래스나 오버로딩 된 함수 등 C++의 특징들은 일반 DLL의 내부에서는 사용될 수 있으나, 다른 프로그램에서 호출할 수는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DLL 예제&lt;/h3&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cP7mPh/btqXD3Fce8q/BdCtkvNI0XKkN6MqlVOJmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cP7mPh/btqXD3Fce8q/BdCtkvNI0XKkN6MqlVOJmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cP7mPh/btqXD3Fce8q/BdCtkvNI0XKkN6MqlVOJmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP7mPh%2FbtqXD3Fce8q%2FBdCtkvNI0XKkN6MqlVOJmK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;DLL : SquareDLL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암시적 연결 방법 사용 : SquareImplicit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명시적 연결 방법 사용 : SquareExplicit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DLL 생성&lt;/h4&gt;
&lt;p&gt;새 프로젝트 생성 시 MFC DLL을 선택하여 생성한다. 프로젝트명은 SquareDLL 나머지 옵션은 그대로 둔다.&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; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LRPGg/btqXj7QzM6q/sdQzK8adx93X2mBAgVCZsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LRPGg/btqXj7QzM6q/sdQzK8adx93X2mBAgVCZsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LRPGg/btqXj7QzM6q/sdQzK8adx93X2mBAgVCZsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLRPGg%2FbtqXj7QzM6q%2FsdQzK8adx93X2mBAgVCZsk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SquareDLL.cpp 파일 끝에 제곱을 계산하는 기능을 추가한다. 일반 DLL에서 다른 프로그램에서 호출할 수 있는 라이브러리를 만들 때는 C 함수의 형태로 만들어야 한다. 또한 DLL 내부에서만 쓰이는 함수가 아니고, 다른 프로그램이 호출할 수 있게 하려면 함수를 다음과 같이 선언해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613465117909&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SquareDLL.cpp
extern &quot;C&quot; __declspec(dllexport) double Square(double input)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	return (input * input);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;extern &quot;C&quot;&lt;/b&gt;은&amp;nbsp;C++ 형태로 컴파일하지 말고, C 형태로 컴파일 하라는 뜻이고,&amp;nbsp;&lt;b&gt;__declspec(dllexport)&lt;/b&gt;은 DLL의 외부에서 이 함수를 호출할 수 있도록 하라는 뜻이다. 또한 이 함수를 MFC에서 호출할 수 있도록 하려면 함수의 맨 첫 줄에 &lt;b&gt;AFX_MANAGE_STATE&lt;/b&gt; 매크로를 추가해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프로젝트를 컴파일하면 Debug 폴더에 확장자가 DLL인 파일과 LIB인 파일이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1613477078464&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;kimgopa/mfc_project&quot; data-og-description=&quot;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/SquareDLL&quot; data-og-url=&quot;https://github.com/kimgopa/mfc_project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjlxS0/hyJiDUfbp2/4lwEqh9zthfH2jAD8akl1k/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420&quot;&gt;&lt;a href=&quot;https://github.com/kimgopa/mfc_project/tree/main/SquareDLL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/SquareDLL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjlxS0/hyJiDUfbp2/4lwEqh9zthfH2jAD8akl1k/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;kimgopa/mfc_project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;암시적 연결 방법으로 DLL 사용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트명은 SquareImplicit인 다이얼로그 기반 프로그램을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 만들어진 DLL을 연결하기 위해 SquareDLL 프로젝트의 Debug 폴더에 만들어진 SquareDLL.dll 파일과 SquareDLL.lib 파일을 SquareImplicit 프로젝트 디렉터리로 복사한다. 그리고 이 프로그램이 SquareDLL.dll에 있는 함수를 호출할 수 있도록 하기 위해 설정에 아래와 같이 SquareDLL.lib를 추가해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clPHTD/btqXDfTqIwB/lzfAyu63cshIEzddYXfP21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clPHTD/btqXDfTqIwB/lzfAyu63cshIEzddYXfP21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clPHTD/btqXDfTqIwB/lzfAyu63cshIEzddYXfP21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclPHTD%2FbtqXDfTqIwB%2FlzfAyu63cshIEzddYXfP21%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 아래와 같이 소스 한줄만 추가해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1613473197170&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#pragma comment(lib, &quot;SquareDLL.lib&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SquareDLL.lib 파일은 SquareDLL.dll 파일을 생성할 때 컴파일러가 같이 생성시켜 준 것으로 Import Library라고 부른다. 이 파일은 정적 링크 라이브러리처럼 lib라는 확장자를 가지고 있지만 정적 링크 라이브러리와는 다른 것이다. 정적 링크 라이브러리는 실제 실행 코드를 저장하고 있지만 Import Library는 DLL과 연결하는데 필요한 함수 이름과 DLL 파일명만을 가지고 있다. Import Library를 넣어줌으로써 이 프로젝트와 SquareDLL.dll이 연결된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로그램이 실행되면 운영체제는 다음과 같은 순서로 SquareDLL.dll 파일을 찾는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. DLL을 호출한 EXE 파일이 있는 디렉터리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 프로세스의 현재 디렉터리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 윈도우 시스템 디렉터리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. 윈도우 디렉터리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5. PATH 환경 변수에 지정된 디렉터리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 SquareDLL.dll 파일은 위 다섯 개 디렉터리 중 한곳에 존재해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DLL에 있는 함수를 사용하기 전에는 반드시 함수 선언을 해주어야 한다. 이 함수를 여러 곳에서 사용한다면 헤더 파일에 넣어 두는 것이 좋다. Edit 컨트롤의 EN_CHANGE 이벤트 처리기를 만들고, Square 함수를 호출하여 제곱 연산을 수행한다.&lt;/p&gt;
&lt;pre id=&quot;code_1613473706281&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extern &quot;C&quot; __declspec(dllimport) double Square(double input);

void CSquareImplicitDlg::OnEnChangeEditInput()
{
	UpdateData(TRUE);
	m_dOutput = Square(m_dInput);
	UpdateData(FALSE);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1613477109992&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;kimgopa/mfc_project&quot; data-og-description=&quot;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/SquareImplicit&quot; data-og-url=&quot;https://github.com/kimgopa/mfc_project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/i9l09/hyJisrC1ex/dk53RHcrYoFX7Q6L9gX0VK/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420&quot;&gt;&lt;a href=&quot;https://github.com/kimgopa/mfc_project/tree/main/SquareImplicit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/SquareImplicit&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/i9l09/hyJisrC1ex/dk53RHcrYoFX7Q6L9gX0VK/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;kimgopa/mfc_project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;명시적 연결 방법으로 DLL 사용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Import Library를 사용하지 않고 DLL의 파일명을 명시적으로 사용하여 DLL과 연결하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로젝트명은 SquareExplicit인 다이얼로그 기반 프로그램을 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SquareDLL 프로젝트의 Debug 폴더에 만들어진 SquareDLL.dll 파일을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SquareExplicit&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로젝트 디렉터리로 복사한다. 그리고 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;명시적 연결 방법을 사용할 때는 LoadLibrary 함수에 연결할 DLL 파일의 파일명을 적어줌으로써 DLL 파일과 연결한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613474906532&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SquareExplicitDlg.h
class CSquareExplicitDlg : public CDialogEx
{
	...

	HINSTANCE m_hDll;
};&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1613474741519&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SquareExplicitDlg.cpp
BOOL CSquareExplicitDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	...

	if ((m_hDll = LoadLibrary(&quot;SquareDLL.dll&quot;)) == NULL)
		AfxMessageBox(&quot;SquareDLL.dll 파일을 찾을 수 없습니다.&quot;);

	return TRUE;  // return TRUE  unless you set the focus to a control
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DLL 파일과 연결되지 않으면 LoadLibrary 함수는 NULL을 반환하며, DLL이 제대로 로딩되었으면 HINSTANCE형의 값을 반환한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;LoadLibrary 함수로 로딩한 DLL의 사용이 끝났으면 FreeLibrary 함수를 이용하여 명시적으로 해제시켜준다.&lt;/p&gt;
&lt;pre id=&quot;code_1613474961874&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SquareExplicitDlg.cpp
void CSquareExplicitDlg::OnDestroy()
{
	CDialogEx::OnDestroy();
	FreeLibrary(m_hDll);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;명시적으로 링크된 DLL에 있는 함수를 사용하려면 GetProcAddress 함수를 이용하여 함수의 포인터를 얻어야 한다. &lt;span style=&quot;color: #333333;&quot;&gt;GetProcAddress 함수는 첫번째 매개변수로 HINSTANCE를 두번째 매개변수로 함수명을 받아 그 함수의 포인터를 반환해 준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1613475023265&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SquareExplicitDlg.cpp
void CSquareExplicitDlg::OnEnChangeEditInput()
{
	UpdateData();

	typedef double (SquareInDLL)(double);
	SquareInDLL *pSquare;
	VERIFY(pSquare = (SquareInDLL *)GetProcAddress(m_hDll, &quot;Square&quot;));
	m_dOutput = (*pSquare)(m_dInput);

	UpdateData(FALSE);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1613477096943&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;object&quot; data-og-title=&quot;kimgopa/mfc_project&quot; data-og-description=&quot;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/SquareExplicit&quot; data-og-url=&quot;https://github.com/kimgopa/mfc_project&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bJQv7l/hyJizRPhze/1uZzfFtKIKgyccv27k0h01/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420&quot;&gt;&lt;a href=&quot;https://github.com/kimgopa/mfc_project/tree/main/SquareExplicit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/kimgopa/mfc_project/tree/main/SquareExplicit&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bJQv7l/hyJizRPhze/1uZzfFtKIKgyccv27k0h01/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;kimgopa/mfc_project&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;visual c++ mfc project. Contribute to kimgopa/mfc_project development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;암시적 연결 / 명시적 연결&lt;/h4&gt;
&lt;p&gt;명시적 연결 방법이 훨씬 번거롭다. 따라서 일반적으로 암시적 연결 방법을 사용하는 것이 좋다. 명시적 연결 방법은 DLL 파일을 지정하여 사용할 경우에 따라서는 유용하게 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DLL의 데이터&lt;/h3&gt;
&lt;p&gt;윈도우는 하나의 프로그램이 다른 프로그램의 영역에 침범하여 시스템에 손상을 주는 일을 방지하기 위해 각각의 프로세스가 다른 프로세스의 데이터 영역을 침범하지 못하도록 철저히 방어를 하고 있다. DLL의 데이터도 마찬가지여서 &lt;b&gt;DLL의 코드는 여러 프로그램에서 공유되지만 데이터는 프로그램마다 각각 독립적으로 관리&lt;/b&gt;된다. 서로 다른 프로세스가 메모리를 공유하려면 메모리 맵 파일(Memory Mapped File)이라고 하는 기술을 사용해야 한다.&lt;/p&gt;
&lt;p&gt;자동 변수는 스택에 저장된다. 각각의 프로세스는 자신의 스택을 갖고 있고, 거기에 자신의 자동 변수를 저장한다. 그런데 DLL은 자체 스택을 갖고 있지 않고, DLL을 호출한 프로그램의 스택을 이용한다. 따라서 &lt;b&gt;DLL의 자동변수는 DLL을 호출한 프로그램의 스택에 각각 독립적으로 저장&lt;/b&gt;된다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;DLL에서 할당한 전역 변수 역시 DLL 자신의 소유가 아니라, DLL을 호출한 프로그램의 소유&lt;/b&gt;가 된다. 따라서 DLL을 호출한 프로그램이 종료되면, DLL은 아직 살아 있다고 하더라도 이 프로그램이 할당한 모든 전역 메모리 공간이 해제된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DLL 디버깅&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DLL은 단독으로 실행될 수 없기 때문에 단독으로 디버깅도 할 수 없다. 따라서 DLL 프로젝트의 설정에서 아래와 같이 DLL을 사용하는 EXE 파일 경로를 적어주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cY7Rjh/btqXxent7EG/h7W9i2zRkjhuEkkr29ooB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cY7Rjh/btqXxent7EG/h7W9i2zRkjhuEkkr29ooB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cY7Rjh/btqXxent7EG/h7W9i2zRkjhuEkkr29ooB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcY7Rjh%2FbtqXxent7EG%2Fh7W9i2zRkjhuEkkr29ooB0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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, C++, MFC</category>
      <category>DLL</category>
      <category>DLL디버깅</category>
      <category>MFC</category>
      <category>SharedDLL</category>
      <category>StaticDLL</category>
      <category>동적링크라이브러리</category>
      <category>명시적연결</category>
      <category>암시적연결</category>
      <category>정적링크라이브러리</category>
      <author>김고파</author>
      <guid isPermaLink="true">https://kimgopa.tistory.com/13</guid>
      <comments>https://kimgopa.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 16 Feb 2021 20:58:16 +0900</pubDate>
    </item>
  </channel>
</rss>