<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>프로그래밍 on kenji.blog</title><link>http://kenji.blog/ko/tags/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/</link><description>Recent content in 프로그래밍 on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ko</language><copyright>kenjinote</copyright><lastBuildDate>Tue, 15 Jul 2025 18:03:03 +0900</lastBuildDate><atom:link href="http://kenji.blog/ko/tags/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/index.xml" rel="self" type="application/rss+xml"/><item><title>'콜라츠 추측'</title><link>http://kenji.blog/ko/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/</link><pubDate>Tue, 15 Jul 2025 18:03:03 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E4%BA%88%E6%83%B3/img.png" alt="Featured image of post '콜라츠 추측'" />&lt;h1 id="어떤-숫자든-마지막엔-1이-된다는-게-진짜야--콜라츠-추측을-즐겨보자">&amp;ldquo;어떤 숫자든 마지막엔 1이 된다&amp;quot;는 게 진짜야? ── 콜라츠 추측을 즐겨보자
&lt;/h1>&lt;p>안녕하세요! kenji입니다.&lt;/p>
&lt;p>갑작스럽지만, &amp;ldquo;어떤 숫자든 최종적으로 1이 되는 규칙&amp;quot;이라고 들으면,
조금 신기하지 않나요?&lt;/p>
&lt;blockquote>
&lt;p>예를 들어, 19나, 87이나, 1000000이라도.
적당한 규칙에 따라 숫자를 다루다 보면, 왠지 마지막은 &amp;ldquo;1&amp;quot;로 수렴합니다.&lt;/p>
&lt;/blockquote>
&lt;p>그런 꿈 같은 이야기가, &lt;strong>콜라츠 추측(Collatz Conjecture)&lt;/strong> 입니다.&lt;/p>
&lt;hr>
&lt;h2 id="애초에-콜라츠-추측이란-게-뭐야">애초에, 콜라츠 추측이란 게 뭐야?
&lt;/h2>&lt;p>먼저 규칙을 소개할게요.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>시작: 임의의 &lt;strong>양의 정수&lt;/strong> 를 선택합니다.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>조작:&lt;/p>
&lt;ul>
&lt;li>짝수라면 → 반으로 나눈다 (n → n / 2)&lt;/li>
&lt;li>홀수라면 → 3을 곱하고 1을 더한다 (n → 3n + 1)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>이것을 계～속 반복하면, &lt;strong>어떤 숫자도 최종적으로는 1에 도달한다&lt;/strong> 는 추측인 거죠.&lt;/p>
&lt;p>예를 들어, &lt;code>6&lt;/code>부터 시작하면:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>제대로 &amp;ldquo;1&amp;quot;이 되었습니다. 어서 오세요!&lt;/p>
&lt;hr>
&lt;h2 id="코드로-해보자-python으로-콜라츠">코드로 해보자: Python으로 콜라츠
&lt;/h2>&lt;p>자, 이럴 때는 코드로 시험해보는 게 빠릅니다!
Python으로 &amp;ldquo;콜라츠 수열&amp;quot;을 출력해봅시다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">%&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">steps&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 예: 19부터 시작해보기&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">19&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>실행하면:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">[19, 58, 29, 88, 44, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>멋지게 1에 도달합니다.
꽤 우회하는데도, 마지막은 확실하게 골인!&lt;/p>
&lt;p>참고로 29부터 시작해도, 마찬가지로 1에 도달합니다.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">pythonprint(collatz(29))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>실행하면&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">[27, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">121, 364, 182, 91, 274, 137, 412, 206, 103, 310, 155, 466, 233, 700, 350,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">175, 526, 263, 790, 395, 1186, 593, 1780, 890, 445, 1336, 668, 334, 167,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">502, 251, 754, 377, 1132, 566, 283, 850, 425, 1276, 638, 319, 958, 479,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644, 1822, 911,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>무려, 111스텝이나 걸립니다!&lt;/p>
&lt;p>게다가, 중간에 9000 이상까지 부풀어 오르는 장면도.
엄청나게 우회하고 나서 골인하는 패턴이네요.&lt;/p>
&lt;hr>
&lt;h2 id="그래서-결국-뭐가-대단한-거야">그래서, 결국 뭐가 대단한 거야?
&lt;/h2>&lt;p>이 추측의 무엇이 대단하냐면,&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>증명되지 않았는데, 어떤 수로 해도 1이 되는 것 같다&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>라는 점입니다.&lt;/p>
&lt;p>어? 그럼, 1조나, 1경(경)은&amp;hellip;?&lt;/p>
&lt;p>라고 생각하신 분, 예리합니다.
실제로 컴퓨터를 사용해서 &amp;ldquo;2의 68승&amp;rdquo; 정도까지는 확인되었고,
&lt;strong>모두 1에 도달&lt;/strong> 하고 있습니다. 믿을 수 없어&amp;hellip;&lt;/p>
&lt;p>하지만, &lt;strong>&amp;ldquo;전부 그렇게 된다&amp;quot;고 이론적으로 증명된 것은 아닙니다&lt;/strong>.
이것이 수학 세계에서 말하는 &amp;ldquo;미해결 문제&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="콜라츠-씨가-누구야">콜라츠 씨가 누구야?
&lt;/h2>&lt;p>자, 여기까지 읽고 &amp;ldquo;애초에 콜라츠가 누구야?&amp;ldquo;라고 생각하시죠.
제대로 소개할게요!&lt;/p>
&lt;ul>
&lt;li>이름: &lt;strong>로타르 콜라츠 (Lothar Collatz)&lt;/strong>&lt;/li>
&lt;li>국적: 독일&lt;/li>
&lt;li>생년: 1910년 ～ 1990년&lt;/li>
&lt;li>직함: 수학자 (함수 해석이나 정수론 분야에서 활약)&lt;/li>
&lt;/ul>
&lt;p>1937년에 이 추측을 제안했고,
그 후, 80년 이상에 걸쳐 &lt;strong>아무도 증명도 반증도 하지 못하고 있습니다&lt;/strong>.&lt;/p>
&lt;p>참고로, 이 문제는 너무 심플한데 심오해서,
그 폴 에어디시(초유명 수학자)조차 이렇게 말했다고 하죠.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;수학은 아직 콜라츠를 다루기에 미숙하다&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>즉, 인류의 수학이 이 수수께끼를 아직 따라잡지 못했다는 설&amp;hellip;&lt;/p>
&lt;hr>
&lt;h2 id="어려운-수식은-필요-없다">&amp;ldquo;어려운 수식&amp;quot;은 필요 없다
&lt;/h2>&lt;p>콜라츠 추측의 좋은 점은, &lt;strong>누구나 즐길 수 있다&lt;/strong> 는 것입니다.&lt;/p>
&lt;p>종이와 펜이 있으면 할 수 있습니다.
Python으로 코드를 작성하면, 자동으로 시험할 수 있습니다.
그러면서도, &lt;strong>최첨단의 수학자들이 진심으로 도전하고 있다&lt;/strong>.&lt;/p>
&lt;p>왠지, 두근두근하지 않나요?&lt;/p>
&lt;hr>
&lt;h2 id="덤-한-번에-시험하는-코드">덤: 한 번에 시험하는 코드
&lt;/h2>&lt;p>여러 숫자를 모아서 시험하는 코드도 실어둘게요.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">21&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">steps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collatz&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">steps&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">(스텝 수: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">steps&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>이것은 &amp;ldquo;1～20&amp;quot;의 콜라츠 수열을 한 번에 출력해 줍니다.&lt;/p>
&lt;hr>
&lt;h2 id="결론-이-세계-역시-신기하다">결론: 이 세계, 역시 신기하다
&lt;/h2>&lt;p>이런 이유로, 콜라츠 추측.&lt;/p>
&lt;ul>
&lt;li>엄청 심플한데&lt;/li>
&lt;li>아무도 증명하지 못해서&lt;/li>
&lt;li>수학계에서는 큰 문제&lt;/li>
&lt;/ul>
&lt;p>라는, 불가사의 덩어리 같은 존재였습니다.&lt;/p>
&lt;p>프로그래밍 초보자라도 시도해볼 수 있으니, 꼭 즐겨보세요～!&lt;/p>
&lt;hr>
&lt;h2 id="추천-링크-관심-있는-분용">추천 링크 (관심 있는 분용)
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://ko.wikipedia.org/wiki/%ec%bd%9c%eb%9d%bc%ec%b8%a0_%ec%b6%94%ec%b8%a1" target="_blank" rel="noopener"
>Wikipedia: 콜라츠 추측&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://arxiv.org/abs/1909.03562" target="_blank" rel="noopener"
>Terence Tao 논문 (영문)&lt;/a>&lt;/li>
&lt;li>Python의 시각화 버전을 만들어 보는 것도 재밌어요! (요청이 있으면 만들겠습니다)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>더 이런 &amp;ldquo;신기한 수학 × 프로그래밍&amp;rdquo; 소재를 알고 싶은 분은,
편하게 &amp;ldquo;더 알려줘&amp;quot;라고 요청해 보세요.
조만간, 리만 가설이나 소수 이야기 등, 여러 가지 소개할게요!&lt;/p>
&lt;hr>
&lt;p>📮끝!&lt;/p>
&lt;hr></description></item><item><title>Win32API + C++로 프로그램을 만드는 장점과 단점</title><link>http://kenji.blog/ko/p/win32api-c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/</link><pubDate>Sat, 12 Jul 2025 12:30:35 +0900</pubDate><guid>http://kenji.blog/ko/p/win32api-c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/</guid><description>&lt;img src="http://kenji.blog/p/win32api-c-%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%A8%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88/img_1.png" alt="Featured image of post Win32API + C++로 프로그램을 만드는 장점과 단점" />&lt;h1 id="win32api--c로-개발하는-매력과-과제">Win32API + C++로 개발하는 매력과 과제
&lt;/h1>&lt;p>Windows 앱 개발을 끝까지 파고들고 싶은 사람에게, &lt;strong>Win32API + C++&lt;/strong> 은 여전히 강력한 선택지입니다.
OS와 가장 가까운 거리에서 상호 작용할 수 있는 이 조합은 고속성과 유연성을 겸비하고 있습니다.&lt;/p>
&lt;p>반면에 현대의 개발 스타일과는 크게 다르기 때문에 습득에는 각오도 필요합니다.&lt;/p>
&lt;p>이 페이지에서는 &lt;strong>현직 Windows 앱 개발자의 관점&lt;/strong> 에서 그 장점과 단점을 알기 쉽게 해설합니다.&lt;/p>
&lt;hr>
&lt;h2 id="장점">장점
&lt;/h2>&lt;h3 id="초고속-네이티브-실행">초고속 네이티브 실행
&lt;/h3>&lt;p>C++와 Win32API는 OS에 가장 가까운 레이어에서 동작하기 때문에 불필요한 오버헤드가 거의 없습니다.
CPU나 메모리 사용 효율이 매우 높아 &lt;strong>압도적인 실행 속도&lt;/strong> 를 자랑합니다.&lt;/p>
&lt;h3 id="높은-유연성과-자유도">높은 유연성과 자유도
&lt;/h3>&lt;p>창 제어, 비동기 처리, COM 연동, 프로세스 관리 등 앱의 모든 동작을 &lt;strong>스스로 세밀하게 제어&lt;/strong> 할 수 있습니다.
목적에 특화된 도구나 자작 독자 프레임워크 등도 구축 가능합니다.&lt;/p>
&lt;h3 id="런타임이-필요-없어-배포하기-쉬움">런타임이 필요 없어 배포하기 쉬움
&lt;/h3>&lt;p>.NET이나 Java와 같은 외부 런타임이 필요하지 않으므로 &lt;strong>실행 파일 1개만으로 배포 가능&lt;/strong> 합니다.
재배포 시 트러블이 잘 일어나지 않아 인스톨러 없이도 동작시키기 쉬운 것이 매력입니다.&lt;/p>
&lt;h3 id="가벼운-앱을-만들-수-있음">가벼운 앱을 만들 수 있음
&lt;/h3>&lt;p>필요 최소한의 구성으로 끝나기 때문에 &lt;strong>메모리 풋프린트가 매우 작다&lt;/strong> 는 것이 특징입니다.
사양이 낮은 PC나 가상 머신 환경에서도 쾌적하게 동작합니다.&lt;/p>
&lt;h3 id="os-수준의-고도화된-제어가-가능">OS 수준의 고도화된 제어가 가능
&lt;/h3>&lt;p>마우스 및 키보드의 글로벌 후킹, 윈도우 스타일 미세 조정, 시스템 메뉴 조작 등
&lt;strong>일반적인 언어나 라이브러리로는 어려운 제어&lt;/strong> 도 실현할 수 있습니다.&lt;/p>
&lt;hr>
&lt;h2 id="단점">단점
&lt;/h2>&lt;h3 id="개발-효율이-낮음">개발 효율이 낮음
&lt;/h3>&lt;p>GUI 구축도 완전히 코드로 수행해야 하며, &lt;strong>버튼 하나 만드는 데 수십 줄의 코드&lt;/strong> 가 필요한 경우도 있습니다.
설계 변경 시 수정도 번거로워 UI 프레임워크를 사용한 개발에 비해 생산성은 낮은 편입니다.&lt;/p>
&lt;h3 id="유지-보수성이-떨어지기-쉬움">유지 보수성이 떨어지기 쉬움
&lt;/h3>&lt;p>메시지 루프나 윈도우 프로시저 등 &lt;strong>특수한 구조의 코드&lt;/strong> 가 많아 가독성이나 재사용성에 어려움이 있습니다.
팀 개발이나 장기 유지 보수에는 적합하지 않은 측면도 있습니다.&lt;/p>
&lt;h3 id="모던-ui-대응이-번거로움">모던 UI 대응이 번거로움
&lt;/h3>&lt;p>고DPI 대응, 터치 인터페이스, 접근성, 다크 모드 등 &lt;strong>최근 요구되는 UX 대응이 어렵습니다&lt;/strong>.
하나하나 수작업으로 대응해야 하므로 수고가 듭니다.&lt;/p>
&lt;h3 id="크로스-플랫폼-미지원">크로스 플랫폼 미지원
&lt;/h3>&lt;p>완전히 Windows 전용 API이기 때문에 &lt;strong>macOS나 Linux로는 이식 불가&lt;/strong> 합니다.
멀티 플랫폼 전개를 가정할 경우 다른 기술을 선택해야 합니다.&lt;/p>
&lt;h3 id="학습-비용이-매우-높음">학습 비용이 매우 높음
&lt;/h3>&lt;p>핸들, GDI, COM, OLE 등 &lt;strong>현대에는 잘 사용되지 않는 개념이나 구조&lt;/strong> 를 이해해야 합니다.
문서도 오래된 것이 많아 학습에는 시간과 끈기가 요구됩니다.&lt;/p>
&lt;hr>
&lt;h2 id="적합한-용도">적합한 용도
&lt;/h2>&lt;ul>
&lt;li>파일 런처나 단축키 지원 등의 &lt;strong>가벼운 도구&lt;/strong>&lt;/li>
&lt;li>클립보드 조작이나 IME 제어 등의 &lt;strong>시스템 유틸리티&lt;/strong>&lt;/li>
&lt;li>글로벌 훅이나 창 캡처 등의 &lt;strong>네이티브 제어계 앱&lt;/strong>&lt;/li>
&lt;li>하드웨어와 밀접하게 연동되는 &lt;strong>드라이버 보조 도구&lt;/strong>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="부적합한-용도">부적합한 용도
&lt;/h2>&lt;ul>
&lt;li>모던 UI·UX가 중시되는 &lt;strong>일반 소비자용 앱&lt;/strong>&lt;/li>
&lt;li>속도 우선으로 만드는 &lt;strong>프로토타이핑이나 MVP 개발&lt;/strong>&lt;/li>
&lt;li>장기 운용 및 팀 개발을 전제로 한 &lt;strong>대규모 프로젝트&lt;/strong>&lt;/li>
&lt;li>여러 OS에 대응할 필요가 있는 &lt;strong>크로스 플랫폼 제품&lt;/strong>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="평가-요약">평가 요약
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>관점&lt;/th>
&lt;th>평가&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>실행 속도&lt;/td>
&lt;td>◎ 매우 빠름&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>메모리 효율&lt;/td>
&lt;td>◎ 뛰어남&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>개발 속도&lt;/td>
&lt;td>× 느림&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>유지 보수성&lt;/td>
&lt;td>× 낮음&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>크로스 플랫폼 대응&lt;/td>
&lt;td>× 미지원&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>모던 UI 대응&lt;/td>
&lt;td>× 약함&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OS 제어 자유도&lt;/td>
&lt;td>◎ 압도적으로 높음&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="결론">결론
&lt;/h2>&lt;p>&lt;strong>Win32API + C++는 &amp;lsquo;OS의 모든 것을 스스로 다루고 싶은&amp;rsquo; 개발자에게 적합한 도구입니다.&lt;/strong>
그 파워는 매우 크지만 학습과 운용에는 그에 상응하는 각오가 필요합니다.&lt;/p>
&lt;blockquote>
&lt;p>&amp;lsquo;굳이 선택할&amp;rsquo; 가치가 있는지는 당신이 목표로 하는 앱의 성격에 달려 있습니다.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;p>GUI 프레임워크나 최신 언어에 의존하지 않고 &lt;code>#include &amp;lt;windows.h&amp;gt;&lt;/code>의 세계로 뛰어드는 것――
그 선택은 지금도 변함없이 의미가 있습니다.&lt;/p></description></item><item><title>'프로그래밍에서 사용할 수 있는 폰트 모음'</title><link>http://kenji.blog/ko/p/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E9%9B%86/</link><pubDate>Sat, 30 Mar 2024 02:21:31 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E9%9B%86/</guid><description>&lt;img src="http://kenji.blog/p/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E9%9B%86/img.png" alt="Featured image of post '프로그래밍에서 사용할 수 있는 폰트 모음'" />&lt;h2 id="jetbrains-mono">JetBrains Mono
&lt;/h2>&lt;p>JetBrains에서 제공하는 오픈 소스 프로그래밍 폰트입니다.&lt;/p>
&lt;p>다운로드: &lt;a class="link" href="https://www.jetbrains.com/ja-jp/lp/mono/" target="_blank" rel="noopener"
>https://www.jetbrains.com/ja-jp/lp/mono/&lt;/a>&lt;/p>
&lt;h2 id="hackgen">HackGen
&lt;/h2>&lt;p>백원(하쿠겐/HackGen)은 프로그래밍용 영문 폰트 Hack과 본고딕의 파생 폰트인 겐쥬고딕을 합성한 프로그래밍 폰트입니다.&lt;/p>
&lt;p>다운로드: &lt;a class="link" href="https://github.com/yuru7/HackGen/releases" target="_blank" rel="noopener"
>https://github.com/yuru7/HackGen/releases&lt;/a>&lt;/p>
&lt;h2 id="ricty-diminished">Ricty Diminished
&lt;/h2>&lt;p>&lt;code>Ricty Diminished&lt;/code>(릭티 디미니시드)는 &lt;code>Ricty&lt;/code>의 자매 폰트이며, &lt;code>Inconsolata&lt;/code>와 &lt;code>Migu 1M&lt;/code>이 아닌, &lt;code>Inconsolata&lt;/code>와 &lt;code>Circle M+ 1m&lt;/code>을 &lt;code>Ricty&lt;/code> 생성 스크립트로 합성한 폰트입니다. IPA 고딕의 글리프를 포함하지 않기 때문에 사용할 수 있는 한자 글리프 수가 적은 대신, &lt;code>SIL Open Font License&lt;/code> 하에 배포가 가능합니다.&lt;/p>
&lt;p>다운로드: &lt;a class="link" href="https://rictyfonts.github.io/diminished" target="_blank" rel="noopener"
>https://rictyfonts.github.io/diminished&lt;/a>&lt;/p>
&lt;h2 id="cica">Cica
&lt;/h2>&lt;p>영숫자, 기호류에 &lt;code>Hack&lt;/code> + &lt;code>DejaVu Sans Mono&lt;/code>.
그 외의 문자에 &lt;code>Rounded Mgen+&lt;/code>를 사용한 프로그래밍 폰트입니다.&lt;/p>
&lt;p>다운로드: &lt;a class="link" href="https://github.com/miiton/Cica/releases" target="_blank" rel="noopener"
>https://github.com/miiton/Cica/releases&lt;/a>&lt;/p>
&lt;p>참고:&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://sourcefoundry.org/hack/" target="_blank" rel="noopener"
>Hack&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="https://dejavu-fonts.github.io/" target="_blank" rel="noopener"
>DejaVu Sans Mono&lt;/a>&lt;/li>
&lt;li>&lt;a class="link" href="http://jikasei.me/font/rounded-mgenplus/" target="_blank" rel="noopener"
>Rounded Mgen+&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="migu">Migu
&lt;/h2>&lt;p>M+와 IPA의 합성 폰트입니다.&lt;/p>
&lt;p>다운로드: &lt;a class="link" href="https://itouhiro.github.io/mixfont-mplus-ipa/migu/" target="_blank" rel="noopener"
>https://itouhiro.github.io/mixfont-mplus-ipa/migu/&lt;/a>&lt;/p>
&lt;h2 id="osaka">Osaka
&lt;/h2>&lt;p>Mac OS 기본 폰트인 &lt;code>Osaka&lt;/code>를 Windows에서 사용할 수 있게 만든 폰트입니다.&lt;/p>
&lt;p>다운로드: &lt;a class="link" href="http://ifs.nog.cc/osakattf.hp.infoseek.co.jp/" target="_blank" rel="noopener"
>http://ifs.nog.cc/osakattf.hp.infoseek.co.jp/&lt;/a>&lt;/p>
&lt;h2 id="plemoljp">PlemolJP
&lt;/h2>&lt;p>IBM사가 릴리스한 오픈 소스 일본어 폰트 &lt;code>IBM Plex Sans JP&lt;/code>와 마찬가지로 IBM사의 Plex 시리즈인 &lt;code>IBM Plex Mono&lt;/code>를 조합한 프로그래밍 폰트입니다.&lt;/p>
&lt;p>다운로드: &lt;a class="link" href="https://github.com/yuru7/PlemolJP/releases" target="_blank" rel="noopener"
>https://github.com/yuru7/PlemolJP/releases&lt;/a>&lt;/p></description></item><item><title>【언어별】 온라인 코드 실행 환경 정리</title><link>http://kenji.blog/ko/p/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%BE%E3%81%A8%E3%82%81/</link><pubDate>Sun, 09 Apr 2023 14:01:00 +0900</pubDate><guid>http://kenji.blog/ko/p/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%BE%E3%81%A8%E3%82%81/</guid><description>&lt;img src="http://kenji.blog/p/%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83%E3%81%BE%E3%81%A8%E3%82%81/img.png" alt="Featured image of post 【언어별】 온라인 코드 실행 환경 정리" />&lt;h2 id="python">Python
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://colab.research.google.com/#create=true" target="_blank" rel="noopener"
>Google Colaboratory&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Google Colaboratory(콜라보래토리)란, 온라인상에서 실행 가능한 Python 실행 환경.&lt;/p>
&lt;ul>
&lt;li>GPU 이용도 가능.&lt;/li>
&lt;li>Colab 노트북을 사용하면 실행 가능한 코드와 리치 텍스트(이미지, HTML, LaTeX 등도 가능)를 하나의 문서로 작성 가능.&lt;/li>
&lt;/ul>
&lt;p>Jupyter Notebook을 기반으로 하고 있다.&lt;/p>
&lt;h2 id="rust">Rust
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://play.rust-lang.org/?version=stable&amp;amp;mode=debug&amp;amp;edition=2021" target="_blank" rel="noopener"
>Rust Playground&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="javascript">JavaScript
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://playcode.io/" target="_blank" rel="noopener"
>Javascript Playground&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="java">Java
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://paiza.io/ja/projects/new?language=java" target="_blank" rel="noopener"
>paiza.IO Online Java compiler&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="haskell">Haskell
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://play.haskell.org/" target="_blank" rel="noopener"
>Haskell Playground&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="swift">Swift
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://online.swiftplayground.run/" target="_blank" rel="noopener"
>Online Swift Playground&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="c">C++
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://www.onlinegdb.com/online_c&amp;#43;&amp;#43;_compiler" target="_blank" rel="noopener"
>C++ 14&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="기타">기타
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://aws.amazon.com/jp/cloud9/" target="_blank" rel="noopener"
>AWS Cloud9&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Amazon AWS에서 제공하는 온라인 통합 개발 환경. Node.js, JavaScript, Python, PHP, Ruby, Go, C++ 등 40개가 넘는 프로그래밍 언어용 도구가 미리 패키징되어 있습니다.&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://vscode.dev/" target="_blank" rel="noopener"
>Visual Studio Code for the Web&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Microsoft에서 제공하는 온라인 개발 환경. 단, 컴파일이 필요한 언어는 실행이나 디버깅을 할 수 없다.&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://paiza.io/projects/CGAcQLfW-IOXYy8Dq2OHBw?locale=ja-jp" target="_blank" rel="noopener"
>paiza.IO&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>C, C++, Java, Ruby, Python, PHP, Perl 등 주요 24개 언어를 지원하는 온라인 실행 환경.&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://codepen.io/" target="_blank" rel="noopener"
>CodePen&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>HTML, CSS, JavaScript의 온라인 실행 환경.&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://codeanywhere.com/" target="_blank" rel="noopener"
>codeanywhere&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>온라인 IDE. 코드 공유나 채팅을 할 수 있다.&lt;/p></description></item></channel></rss>