<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko-KR"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://xn--9p4bn7dwj.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://xn--9p4bn7dwj.com/" rel="alternate" type="text/html" hreflang="ko-KR" /><updated>2026-07-09T00:01:35+09:00</updated><id>https://xn--9p4bn7dwj.com/feed.xml</id><title type="html">양수영</title><subtitle>코딩과 일상을 차분히 기록하는 개인 블로그</subtitle><entry><title type="html">[C#]람다란?</title><link href="https://xn--9p4bn7dwj.com/coding/csharp/2026/07/09/c/" rel="alternate" type="text/html" title="[C#]람다란?" /><published>2026-07-09T00:01:00+09:00</published><updated>2026-07-09T00:01:00+09:00</updated><id>https://xn--9p4bn7dwj.com/coding/csharp/2026/07/09/c</id><content type="html" xml:base="https://xn--9p4bn7dwj.com/coding/csharp/2026/07/09/c/"><![CDATA[<hr />

<p>##</p>

<p><img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRrgXEznfY1mjCJERl-NctsbXIDiGyDyTb7AxQ3WUgGsw&amp;s=10" alt="람다 - 나무위키" /></p>

<h2 id="1-람다가-만들어진-이유">1. 람다가 만들어진 이유</h2>

<p>아래와 같은 코드가 있다고 해보자</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">int</span> <span class="nf">Add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span>
<span class="p">{</span>
		<span class="k">return</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>위 함수를 사용하려면</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">result</span> <span class="p">=</span> <span class="nf">Add</span><span class="p">(</span><span class="m">3</span><span class="p">,</span> <span class="m">5</span><span class="p">);</span>

<span class="m">8</span>
</code></pre></div></div>

<h3 id="문제상황">문제상황</h3>

<blockquote>
  <p>이 함수는 한번만 사용할 건데?</p>
</blockquote>

<p>이런경우 굳이 public int Add ~~~ 이런식으로 길게 만드는것이 귀찮다.</p>

<p>그래서</p>

<blockquote>
  <p>“함수를 변수처럼 만들어서 바로 전달하자”</p>
</blockquote>

<p>라는 개념이 등장하는데 그게 오늘 설명할 람다이다.</p>

<h2 id="2-람다의-기본-문법">2. 람다의 기본 문법</h2>

<h3 id="1-일반함수">1. 일반함수</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">int</span> <span class="nf">Add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span>
<span class="p">{</span>
		<span class="k">return</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="2-람다">2. 람다</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span>
</code></pre></div></div>

<p>두 코드의 의미는 거의 같다.</p>

<p>람다식을 읽는 방법은 다음과 같다.</p>

<blockquote>
  <p>매개변수(왼쪽)을 가지고(⇒) 오른쪽을 실행한다</p>
</blockquote>

<h2 id="3-return은-어디로갔는가">3. Return은 어디로갔는가?</h2>

<h3 id="일반-함수">일반 함수</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">Add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span>
<span class="p">{</span>
		<span class="k">return</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="람다">람다</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span>
</code></pre></div></div>

<p>한 줄이면 return 을 생략한다.</p>

<h2 id="하지만-여러줄이라면">하지만 여러줄이라면?</h2>

<p>다시 리턴을 사용해야한다.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="p">=&gt;</span> 
<span class="p">{</span>
		<span class="kt">int</span> <span class="n">c</span> <span class="p">=</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span><span class="p">;</span>
		<span class="k">return</span> <span class="n">c</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="4-람다는-변수에-저장할-수-있다">4. 람다는 변수에 저장할 수 있다.</h2>

<p>예를 들어</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Func</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span> <span class="k">add</span> <span class="p">=</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">a</span> <span class="p">+</span> <span class="n">b</span><span class="p">;</span>
</code></pre></div></div>

<p>사용</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">result</span> <span class="p">=</span> <span class="k">add</span><span class="p">(</span><span class="m">3</span><span class="p">,</span> <span class="m">5</span><span class="p">);</span>
</code></pre></div></div>

<p>출력</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="m">8</span>
</code></pre></div></div>

<p>여기서 알아야 할 것은 add는 변수이자 함수 라는것이다.</p>

<h2 id="5-func이란">5. Func이란?</h2>

<p>가장 많이 보는 형태</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Func</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span>
</code></pre></div></div>

<p>이건</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">입력</span> <span class="p">:</span> <span class="kt">int</span>

<span class="err">출력</span> <span class="p">:</span> <span class="kt">int</span>
</code></pre></div></div>

<h3 id="사용">사용</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Func</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span> <span class="n">square</span> <span class="p">=</span> <span class="n">x</span> <span class="p">=&gt;</span> <span class="n">x</span> <span class="p">*</span> <span class="n">x</span><span class="p">;</span>

<span class="nf">square</span><span class="p">(</span><span class="m">5</span><span class="p">)</span>

<span class="m">25</span>
</code></pre></div></div>

<h3 id="매개변수가--두-개-라면">매개변수가  두 개 라면</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Func</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span>
</code></pre></div></div>

<h3 id="의미">의미</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">입력</span> <span class="p">:</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">int</span>
<span class="err">출력</span> <span class="p">:</span> <span class="kt">int</span>
</code></pre></div></div>

<h3 id="매개변수가--세-개라면">매개변수가  세 개라면</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Func</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">&gt;</span>
</code></pre></div></div>

<h3 id="의미-1">의미</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">입력</span> <span class="p">:</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">int</span>
<span class="err">출력</span> <span class="p">:</span> <span class="kt">int</span>
</code></pre></div></div>

<p>마지막 타입이 항상 반환형 이다.</p>

<h2 id="6-action이란">6. Action이란?</h2>

<blockquote>
  <p>반환값이 없는 함수이다.</p>
</blockquote>

<p>예를들어</p>

<h3 id="사용용">사용용</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">void</span> <span class="nf">Print</span><span class="p">(</span><span class="kt">string</span> <span class="n">Text</span><span class="p">)</span>
<span class="p">{</span>
		<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">text</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="람다-1">람다</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Action</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="n">print</span> <span class="p">=</span> <span class="n">text</span> <span class="p">=&gt;</span> <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">text</span><span class="p">);</span>
</code></pre></div></div>

<h3 id="사용-1">사용</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">print</span><span class="p">(</span><span class="s">"Hello"</span><span class="p">)</span>
</code></pre></div></div>

<p>즉</p>

<blockquote>
  <p>Func ⇒ 반환값 있음, Action ⇒ 반환값 없음</p>
</blockquote>

<h2 id="7-람다가-쓰이는-이유">7. 람다가 쓰이는 이유</h2>

<p>예를 들어 숫자들이 있다고 가정해보자.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">List</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">numbers</span> <span class="p">=</span> <span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">3</span><span class="p">,</span> <span class="m">4</span><span class="p">,</span> <span class="m">5</span><span class="p">];</span>
</code></pre></div></div>

<p>이중에서 짝수만 찾고 싶다면?</p>

<h3 id="예전방식">예전방식</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">foreach</span><span class="p">(</span><span class="kt">var</span> <span class="n">n</span> <span class="k">in</span> <span class="n">numbers</span><span class="p">)</span>
<span class="p">{</span>
		<span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="p">%</span> <span class="m">2</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span> <span class="n">console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="람다-사용">람다 사용</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numbers</span><span class="p">.</span><span class="k">where</span><span class="p">(</span><span class="n">x</span> <span class="err">⇒</span> <span class="n">x</span>  <span class="p">%</span> <span class="m">2</span> <span class="p">==</span> <span class="m">0</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="8-람다를-사용하는-경우">8. 람다를 사용하는 경우</h2>

<p>람다는 짧고 간단한 동작에 가장 적합하다.</p>

<p>코드 아래 로직이 복잡하다면 일반 메서드가 사용하는데 훨씬 용이하니 여러 코드를 작성해 보면서 판단해 보도록 하자.</p>]]></content><author><name>swimming</name></author><category term="coding" /><category term="csharp" /><category term="람다" /><category term="C#" /><category term="기초문법" /><summary type="html"><![CDATA[람다에 대하여 알아보자.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRrgXEznfY1mjCJERl-NctsbXIDiGyDyTb7AxQ3WUgGsw&amp;s=10" /><media:content medium="image" url="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRrgXEznfY1mjCJERl-NctsbXIDiGyDyTb7AxQ3WUgGsw&amp;s=10" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">UART 통신(1)</title><link href="https://xn--9p4bn7dwj.com/coding/cs/2026/07/07/uart-1/" rel="alternate" type="text/html" title="UART 통신(1)" /><published>2026-07-07T23:18:00+09:00</published><updated>2026-07-07T23:18:00+09:00</updated><id>https://xn--9p4bn7dwj.com/coding/cs/2026/07/07/uart-1</id><content type="html" xml:base="https://xn--9p4bn7dwj.com/coding/cs/2026/07/07/uart-1/"><![CDATA[<p><img src="data:image/png;base64,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XHJJlSpVcHrFFVfEx8d/8skn2dnZOC21eETycBvHWSXeKgmU6CJglwRDrPryYRGtZtHNJ+FRBgIgaAbQJKmWLidWoVReAqlSQzeeoAQD7scyXDOHqAq9DUEGVLfL5brooouweacoSp8+fRISEubNm1dG1Y2WY0XCPU/aT+FegTL0j1tu6dKlv//+e61atbp36260lJaWduGFF+K2fPvtt40UhiRAAiRAAhFCAHobI1m2bNnq1auhuqGujZTU1FTE8WEYqtswsFCMEskEaD9F8uocYWwOh2PWrFm40/r162cym4Klu3Xrhg80P/3005o1a4KJjJAACZBA+RJga6UjACNp5syZUN0DBgxQVRURo53u3btnZGRAdQf/BiiYZRRgGFEEaD9F1HIcbjD9+/d/880327dvHywUFxc3efJkJJ522mnBRESsVuvEiROnT5/epEkTnFJIgARIgATCRcBQ3R06dAgOwGazQXVDRTds2BCJhv8JEYvF8vTTTyMdqttINEJkUSKQAO2nCFwUDokEjpIAi5EACZAACYSHAO2n8HBnryRAAiRAAiRAAtFLgPZT2daOtUmABEiABEiABGKPAO2n2FtzzpgESIAESIAESKBsBGg/lY0fa5MACZAACZAACcQeAdpPsbfmnDEJkEBkEOAoSIAEopcA7afoXTuOnARIgARIgARIIDwEaD+Fhzt7jQwCHAUJkAAJkAAJlIYA7afSUGMdEiABEiABEiCBWCYQbvspltlz7iRAAiRAAiRAAtFJgPZTdK4bR00CJEACJBBeAuw9tgnQfort9efsSYAESIAESIAEjp0A7adjZ8YaJEACkUGAoyABEiCBcBGg/RQu8uyXBEiABEiABEggWgnQforWlYuMcXMUJEACJEACJBCLBGg/RdCq+/1+jCYYbtu2benSpQsXLly1apXH40EWwo0bN27atCkvLw+nQcnMzERifn4+Uvbs2fPnn3+uW7duw4YNiCPFEKNZI86QBEiABEigHAlAwULQIMLt27dDdS9YsOCXX37xeX1IRPhP4AhV3SiZnZ0NlW6obmRBdUOgvXfv3o1alONMoKzN034qK8Fyr68oSmFh4ZNPPvnwww+/8sorb7/99qRJkx544IHNmzfv3Llz1KhRjzzyyHPPPRfa79y5c0eOHLly5Uok/vbbb+PGjRs7duyYMWMGDhx4xx13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mwRIgARIgARIIFwEaD+Fi3xk9MtRkAAJkAAJkAAJHDsB2k/Hzow1SIAESIAESIAEwksg3L3Tfgr3CrB/EiABEiABEiCBaCNA+ynaVozjJQESIIHIIMBRkEAsE6D9FMurz7mTAAmQAAmQAAmUhgDtp9JQYx0SiAwCHAUJkAAJkEB4CNB+Cg939koCJEACJEACJBC9BGg/lW3tWJsESIAESIAESCD2CNB+ir0154xJgARIgARIgATKRoD2U9n4sTYJkAAJkAAJkEDsEaD9FHtrzhmTAAlEBgGOggRIIHoJ0H6K3rXjyEmABEiABEiABMJDgPZTeLiz18ggwFGQAAmQAAmQQGkI0H4qDTXWIQESIAESIAESiGUC4bafYpk9504CJEACJEACJBCdBGg/Ree6cdQkQAIkQALhJcDeY5sA7afYXn/OngRIgARIgARI4NgJ0H46dmasQQIkEBkEOAoSIAESCBcB2k/hIs9+SYAESIAESIAEopUA7adoXbnIGDdHQQIkQAIkQAKxSID2UyyuOudMAiRAAiRAArFNoKyzp/1UVoKsTwIkQAIkQAIkEGsEaD/F2opzviRAAiQQGQQ4ChKIZgK0n6J59Th2EiABEiABEiCBcBCg/RQO6uyTBCKDAEdBAiRAAiRQOgK0n0rHjbVIgARIgARIgARilwDtp/CuPXsnARIgARIgARKIPgK0n6JvzThiEiABEiABEgg3gVjvn/ZTrF8BnD8JkAAJkAAJkMCxEqD9dKzEWJ4ESIAEIoMAR0ECJBA+ArSfwseePZMACZAACZAACUQnAdpP0bluHHVkEOAoSIAESIAEYpMA7afYXHfOmgRIgARIgARIoPQEot1+Kv3MWZMESIAESIAESIAESkeA9lPpuLEWCZAACZAACZSFAOtGNwHaT9G9fhw9CZAACZAACZBAxROg/VTxzNkjCZBAZBDgKEiABEigtARoP5WWHOuRAAmQAAmQAAnEKgHaT7G68pExb46CBEiABEiABKKRAO2naFw1jpkESIAESIAESCCcBGg/hZM++yYBEiABEiABEohGArSfonHVOGYSIAESIAESIIFwEqD9FE767JsESIAESIAESCAaCfwfAAD//2MMj6UAAAAGSURBVAMAk0KuWtGzVQcAAAAASUVORK5CYII=" alt="" /></p>

<h2 id="uart통신이란">UART통신이란?</h2>

<hr />

<blockquote>
  <p>UART(Universal Asynchronous Receiver/Transmitter)는 병렬 데이터를 비동기식 직렬 데이터로 변환하여 송수신하는 직렬 통신 인터페이스이다.</p>
</blockquote>

<ul>
  <li>UART를 학습하기전 정의를 확실히 알고 가보자.</li>
</ul>

<h2 id="병렬-데이터란">병렬 데이터란?</h2>

<hr />

<blockquote>
  <p>여러 비트(Bit)를 동시에 처리하거나 전달하는 데이터 형태</p>
</blockquote>

<p>예를 하나 들어보자. 문자 ‘A’를 ASCII 코드로 표현하면</p>

<div class="language-smalltalk highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">A</span> <span class="nf">=</span> <span class="m">65</span> <span class="nf">=</span> <span class="m">01000001</span>
</code></pre></div></div>

<p>이 8 비트를 CPU 내부에서는</p>

<p>Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 0     1     0     0     0     0     0     1</p>

<p>의 형태로 8개의 비트(Bit)가 동시에 존재한다.</p>

<p>즉 0 1 0 0 0 0 0 1 이 8 개의 값이 한순간에 모두 존재하는 형태를 병렬 데이터 (Parallel Data) 라고한다.</p>

<h3 id="왜-병렬-이라고-부를까">왜 ‘병렬’ 이라고 부를까?</h3>

<p>병렬의 정의는 <strong>여러 개가 동시에</strong> 라는 의미를 가지고 있다.</p>

<p>예를들어 8개의 신호선을 사용하고 있다면.</p>

<div class="language-smalltalk highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">D7</span>  <span class="err">──</span> <span class="m">0</span>
<span class="nf">D6</span>  <span class="err">──</span> <span class="m">1</span>
<span class="nf">D5</span>  <span class="err">──</span> <span class="m">0</span>
<span class="nf">D4</span>  <span class="err">──</span> <span class="m">0</span>
<span class="nf">D3</span>  <span class="err">──</span> <span class="m">0</span>
<span class="nf">D2</span>  <span class="err">──</span> <span class="m">0</span>
<span class="nf">D1</span>  <span class="err">──</span> <span class="m">0</span>
<span class="nf">D0</span>  <span class="err">──</span> <span class="m">1</span>
</code></pre></div></div>

<p>8개의 선을 통해 8비트를 동시에 전달 할 수 있다.</p>

<p>그래서 이를 병렬 전송(Parallel Transmission) 이라고 한다.</p>

<blockquote>
  <p>참고로 우리가 흔히 CPU 에서 말하는 32비트 64비트 는 한번에 32, 64개의 비트를 처리할 수 있는 것이다.</p>
</blockquote>

<h2 id="동기--비동기란">동기 / 비동기란?</h2>

<h3 id="동기-synchonous">동기 (Synchonous)</h3>

<blockquote>
  <p><strong>요청(Request)과 응답(Response)이 하나의 흐름으로 이어지는 방식</strong>이다.</p>
</blockquote>

<p><strong>작업을 요청한 후, 결과가 올 때까지 기다리는 방식</strong>이다.</p>

<h3 id="비동기asynchronous">비동기(Asynchronous)</h3>

<blockquote>
  <p>비동기란 <strong>요청한 후 결과를 기다리지 않고 다음 작업을 수행하는 방식</strong>이다.</p>
</blockquote>

<p><strong>작업을 요청하고 바로 다른 일을 한다. 결과는 나중에 전달받는다.</strong></p>

<h3 id="uart에서의-비동기는">UART에서의 비동기는</h3>

<blockquote>
  <p>송신 장치와 수신 장치가 공통의 클럭 신호 없이 통신한다.</p>
</blockquote>

<p>자바에서는 동기 비동기를 응답과 요청을 기준으로 판단하지만, UART에서의 비동기는 클럭신호라는것을 공유하는가 공유하지 않는가로 나뉜다고 한다.</p>

<h2 id="클럭신호란">클럭신호란?</h2>

<blockquote>
  <p>클럭 신호(Clock Signal)는 전자 장치들이 “언제 동작해야 하는지”를 알려주는 기준 신호이다.</p>
</blockquote>

<p>컴퓨터에서는 클럭이 들어오는 순간마다</p>

<ul>
  <li>데이터를 읽고</li>
  <li>데이터를 보내고</li>
  <li>연산을 수행한다.</li>
</ul>

<h3 id="클럭이-필요한-이유는">클럭이 필요한 이유는?</h3>

<hr />

<p>예를들어 송신장치가</p>

<div class="language-smalltalk highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="m">10110010</span>
</code></pre></div></div>

<p>을 보낸다고 해보자.</p>

<p>수신장치는 각비트를 언제 읽을지를 알아야 한다. 그래서 클럭을 같이 보내면</p>

<p>수신장치는 클럭이 올라갈 때 마다 데이터를 읽으면 된다고 알 수 있다.</p>

<p>UART는 클럭을 보내지 않는다. 오직 데이터만 전송한다.</p>

<p>그럼 언제 데이터를 읽을까?</p>

<ul>
  <li>Baud Rate</li>
  <li>Start Bit</li>
  <li>Stop Bit</li>
</ul>

<p>를 사용하여 데이터를 읽는 시점을 맞춘다.</p>

<h2 id="직렬통신이란">직렬통신이란?</h2>

<hr />

<blockquote>
  <p>직렬 통신은 데이터를 1비트씩 순차적으로 전송하는 통신 방식이다.</p>
</blockquote>

<p>다시 예를들어 문자 ‘A’를 전송한다고 하자</p>

<div class="language-smalltalk highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">A</span> <span class="nf">=</span> <span class="m">01000001</span>
</code></pre></div></div>

<p>직렬통신에서는 이 데이터를</p>

<div class="language-smalltalk highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="m">0</span> <span class="err">→</span> <span class="m">1</span> <span class="err">→</span> <span class="m">0</span> <span class="err">→</span> <span class="m">0</span> <span class="err">→</span> <span class="m">0</span> <span class="err">→</span> <span class="m">0</span> <span class="err">→</span> <span class="m">0</span> <span class="err">→</span> <span class="m">1</span>
</code></pre></div></div>

<p>처럼 1비트씩 차례대로 전송한다.</p>

<p>즉, 여러 비트를 한번에 보내는 것이 아니라 한 줄로 순서대로 보내는 통신방식이다.</p>

<h3 id="왜-직렬통신을-사용하는가">왜 직렬통신을 사용하는가?</h3>

<hr />

<p>병렬 통신은 빠르지만, 데이터 비트 수 만큼 신호선이 필요하다.</p>

<p>예를 들어 8비트를 전송하려면 최소 8개의 데이터 선이 필요하다.</p>

<p>반면 직렬 통신은 데이터를 순차적으로 전송하기 때문에 적은 배선만으로도 통신이 가능하다.</p>

<p>UART는 이러한 직렬 통신 방식을 사용하는 대표적인 통신 인터페이스이다.</p>]]></content><author><name>swimming</name></author><category term="coding" /><category term="cs" /><category term="UART 통신" /><category term="임베디드" /><category term="통신" /><summary type="html"><![CDATA[UART 통신방식에 대해서 알아보자.]]></summary></entry><entry><title type="html">프로퍼티(Property)에 대해 알아보자</title><link href="https://xn--9p4bn7dwj.com/coding/csharp/2026/07/06/property/" rel="alternate" type="text/html" title="프로퍼티(Property)에 대해 알아보자" /><published>2026-07-06T22:25:00+09:00</published><updated>2026-07-06T22:25:00+09:00</updated><id>https://xn--9p4bn7dwj.com/coding/csharp/2026/07/06/property</id><content type="html" xml:base="https://xn--9p4bn7dwj.com/coding/csharp/2026/07/06/property/"><![CDATA[<p>##</p>

<h2 id="프로퍼티란">프로퍼티란?</h2>

<blockquote>
  <p>객체의 데이터를 안전하게 읽고(Get) 수정(Set)하기 위한 C#의 기능.</p>
</blockquote>

<p>변수(Field)를 직접 공개하지 않고 대신 사용하는 창구 라고 생각해보자</p>

<h3 id="먼저-변수가-있다고-가정하자">먼저 변수가 있다고 가정하자</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Person</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">name</span><span class="p">;</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">age</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>이것을 사용한다고 하면</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Person</span> <span class="n">person</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Person</span><span class="p">();</span>

<span class="n">person</span><span class="p">.</span><span class="n">name</span> <span class="p">=</span> <span class="s">"Ysw1mst"</span><span class="p">;</span>
<span class="n">person</span><span class="p">.</span><span class="n">age</span> <span class="p">=</span> <span class="m">30</span><span class="p">;</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">person</span><span class="p">.</span><span class="n">name</span><span class="p">);</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">person</span><span class="p">.</span><span class="n">age</span><span class="p">);</span>
</code></pre></div></div>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Ysw1mst</span>
</code></pre></div></div>

<p>이제 취약점을 생각해보자.</p>

<p>누군가가</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">person</span><span class="p">.</span><span class="n">name</span> <span class="p">=</span> <span class="s">""</span><span class="p">;</span>
</code></pre></div></div>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">person</span><span class="p">.</span><span class="n">name</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
</code></pre></div></div>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">person</span><span class="p">.</span><span class="n">name</span> <span class="p">=</span> <span class="s">"dog"</span><span class="p">;</span>
<span class="n">person</span><span class="p">.</span><span class="n">age</span> <span class="p">=</span> <span class="p">-</span><span class="m">100</span><span class="p">;</span>
</code></pre></div></div>

<h3 id="검사해서-막으면-되지-않을까">검사해서 막으면 되지 않을까?</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span><span class="p">(</span><span class="n">person</span><span class="p">.</span><span class="n">age</span> <span class="p">&lt;</span> <span class="m">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="p">}</span>
</code></pre></div></div>

<p>이런식으로 검사하면 물론 되긴 하지만, 좋은코드는 아니다 100개의 객체가 있다고하면 100번을 검사해야한다. 한번이라도 실수한다면 잘못된코드, 프로그램이 되기 마련이다.</p>

<h3 id="그래서-등장한것이-property이다">그래서 등장한것이 Property이다.</h3>

<blockquote>
  <p>데이터를 직접 건드리지 않으며 Property를 통해서만 접근할 수 있게 한다.</p>
</blockquote>

<p>일종의 검문소라고 생각하면 편하다.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="kt">int</span> <span class="n">age</span><span class="p">;</span>

<span class="k">public</span> <span class="kt">int</span> <span class="n">Age</span>
<span class="p">{</span>
    <span class="k">get</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">age</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">set</span>
    <span class="p">{</span>
        <span class="k">if</span><span class="p">(</span><span class="k">value</span> <span class="p">&gt;=</span> <span class="m">0</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">age</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>age를 private변수로 선언하여 직접 접근할 수 없으며 프로퍼티를 통해서만 값을 Set(변화)  할 수 있다.</p>

<h2 id="field와-property의-차이">Field와 Property의 차이</h2>

<h3 id="field">Field</h3>

<blockquote>
  <p>일반 변수</p>
</blockquote>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">int</span> <span class="n">age</span><span class="p">;</span>
</code></pre></div></div>

<h3 id="property">Property</h3>

<blockquote>
  <p>검문소 : 변수를 관리하는 기능</p>
</blockquote>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">int</span> <span class="n">Age</span>
<span class="p">{</span>
		<span class="k">get</span><span class="p">;</span>
		<span class="k">set</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="예제">예제</h2>

<h3 id="1-프로퍼티-없이">1. 프로퍼티 없이</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">PropertyStudy</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Person</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Age</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">class</span> <span class="nc">Program</span>
<span class="p">{</span>
    <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Person</span> <span class="n">person</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Person</span><span class="p">();</span>

        <span class="n">person</span><span class="p">.</span><span class="n">Age</span> <span class="p">=</span> <span class="m">25</span><span class="p">;</span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">person</span><span class="p">.</span><span class="n">Age</span><span class="p">);</span>

        <span class="n">person</span><span class="p">.</span><span class="n">Age</span> <span class="p">=</span> <span class="p">-</span><span class="m">100</span><span class="p">;</span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">person</span><span class="p">.</span><span class="n">Age</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="m">25</span>
<span class="p">-</span><span class="m">100</span>
</code></pre></div></div>

<h3 id="2-프로퍼티-사용">2. 프로퍼티 사용</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">PropertyPRC</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Person</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="kt">int</span> <span class="n">age</span><span class="p">;</span>

    <span class="k">public</span> <span class="kt">int</span> <span class="n">Age</span>
    <span class="p">{</span>
        <span class="k">get</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="n">age</span><span class="p">;</span>
        <span class="p">}</span>
        
        <span class="k">set</span>
        <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="k">value</span> <span class="p">&gt;=</span> <span class="m">0</span><span class="p">)</span>
            <span class="p">{</span>
                <span class="n">age</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="k">else</span>
            <span class="p">{</span>
                <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"You are not a person."</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">class</span> <span class="nc">Program</span>
<span class="p">{</span>
    <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Person</span> <span class="n">person</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Person</span><span class="p">();</span>

        <span class="n">person</span><span class="p">.</span><span class="n">Age</span> <span class="p">=</span> <span class="m">25</span><span class="p">;</span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">person</span><span class="p">.</span><span class="n">Age</span><span class="p">);</span>

        <span class="n">person</span><span class="p">.</span><span class="n">Age</span> <span class="p">=</span> <span class="p">-</span><span class="m">100</span><span class="p">;</span>

        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">person</span><span class="p">.</span><span class="n">Age</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>프로퍼티에서 value의 값이 0 이상이라면 age에 value값을 주입한다.</p>

<p>0보다 작다면 You are not a person을 출력하게 된다.</p>

<p>Program Class에서</p>

<p>person이라는 Person객체를 만들고</p>

<p>Age에 25를 주입한다 이때 Age는 25가 들어있게되고 그대로 Age를 출력한다.</p>

<p>이후 Age에 -100을 주입하려하지만 프로퍼티 조건에 의해 값은 주입되지않고 그대로 25가 유지되며</p>

<p>You are not a person을 출력한 후</p>

<p>원래 Age값인 25를 한번 더 출력하게 된다.</p>]]></content><author><name>swimming</name></author><category term="coding" /><category term="csharp" /><category term="C#" /><category term="Property" /><category term="프로퍼티" /><summary type="html"><![CDATA[프로퍼티에 대해 알아보자.]]></summary></entry><entry><title type="html">01. 스택(Stack) , 큐(Queue) , 덱(Deque)</title><link href="https://xn--9p4bn7dwj.com/coding/cs/2026/07/05/01-stack-queue-deque/" rel="alternate" type="text/html" title="01. 스택(Stack) , 큐(Queue) , 덱(Deque)" /><published>2026-07-05T19:51:00+09:00</published><updated>2026-07-05T19:51:00+09:00</updated><id>https://xn--9p4bn7dwj.com/coding/cs/2026/07/05/01-stack-queue-deque</id><content type="html" xml:base="https://xn--9p4bn7dwj.com/coding/cs/2026/07/05/01-stack-queue-deque/"><![CDATA[<p><span class="text-size-large">기본적으로 자료를 저장하기위에 사용하는 자료구조인 스택, 큐, 덱에 대하여 알아보자.  </span></p>

<p><span class="text-size-large">1. 스텍</span></p>

<hr />

<blockquote>
  <p>스택이란 마지막에 들어간 자료가 가장 먼저 나오는 자료구조를 뜻한다.</p>
</blockquote>

<p><span class="text-font-sans">자연적으로 스택이라는 자료구조에서는 새로운 자료를 넣는연산과 자료를 꺼내는 연산이 필요하다. 이러한 연산에서 사용되는 연산들은 크게 아래와 같다.</span></p>]]></content><author><name>swimming</name></author><category term="coding" /><category term="cs" /><category term="자료구조" /><category term="CS" /><summary type="html"><![CDATA[기본적인 자료구조인 스택, 큐, 덱에 대해서 알아봅시다.]]></summary></entry><entry><title type="html">WPF와, MVVM, 간단한 예제</title><link href="https://xn--9p4bn7dwj.com/coding/wpf/2026/06/03/wpfbasic/" rel="alternate" type="text/html" title="WPF와, MVVM, 간단한 예제" /><published>2026-06-03T00:00:00+09:00</published><updated>2026-06-03T00:00:00+09:00</updated><id>https://xn--9p4bn7dwj.com/coding/wpf/2026/06/03/wpfbasic</id><content type="html" xml:base="https://xn--9p4bn7dwj.com/coding/wpf/2026/06/03/wpfbasic/"><![CDATA[<p>자바, 웹만 공부하던 개발자였던 나에게 (사실 자바 웹도 AI로 바이브코딩하는게 대부분이었다)
방산이라는 분야로 개발하겠다고 마음먹은지 얼마 되지않아 이무것도 모르는 시기에 운이좋게 취업이 되었다.</p>

<p>나를 뽑아주신 분들은 금방 배울것같다고 나를 뽑아주셨었고, 처음 해본것들에 치이면서 2달정도된 현재 무엇이 WPF고 MVVM인지는 알지만
내부 구조를 정확히 파악하지 못하는것 같아 블로그에 정리하면서 다시 복습하는 시간을 가져 보려고한다.</p>

<h2 id="wpf란">WPF란?</h2>

<p><img src="/assets/images/posts/coding/wpf/wpf01.png" alt="WPF와 데스크톱 UI 개요" /></p>

<p>첫번째로 WPF는 무엇인지 알아보자.</p>

<blockquote>
  <p>WPF(Windows Presentation Foundation)는 마이크로소프트가 개발한 윈도우 데스크톱 애플리케이션용 UI(사용자 인터페이스) 프레임워크</p>
</blockquote>

<p>WPF의 특징으로는 <br /></p>
<ol>
  <li>화면 디자인인 (UI)는 XML 기반의 XAML 코드로 작성하며, 프로그램 동작 로직은 C#으로 개발한다.</li>
  <li>MVVM 패턴을 사용하기에 최적화 되어있어, 유지보수가 용이하다.</li>
  <li>윈도우 폼에 비해 디자인, 커스터마이징이 자유롭다.</li>
</ol>

<p>다음은 MVVM을 알아보자</p>

<h2 id="mvvm-패턴이란">MVVM 패턴이란</h2>

<blockquote>
  <p>Model-View-View Model.</p>
</blockquote>

<p><img src="/assets/images/posts/coding/wpf/wpf02.png" alt="Model View ViewModel 구조도" /></p>

<p>MVVM 패턴은 Model, View, ViewModel로 이루어진 아키텍쳐 패턴으로 각각의 역할을 아래와 같다.</p>

<ol>
  <li>View : XAML로 화면을 구성하고, DataContext에 ViewModel을 연결해서 데이터를 표시하는 역할.</li>
  <li>View와 Model 사이의 중개자. INotifyPropertyChanged로 속성 변경을 View에 알리고, ICommand(RelayCommand)로 버튼 클릭 같은 이벤트를 처리함.</li>
  <li>UI와 완전히 무관한 순수한 데이터 구조. DB 엔티티, DTO, 비즈니스 규칙 등이 여기 들어감.</li>
</ol>

<p>여기서 중요한것은 View와 모델은 서로의 존재를 몰라야 한다는 것이다. 두 클래스 간 데이터 교류는 모두 ViewModel을 통해서 이루어진다.</p>

<p>이론적으로는 개인적으로 이런게 있고 대충 이런거구나 정도만 알고 실전 예제를 한번 해보는게 이해하는게 더 쉽지 않을까 싶다.</p>

<p>간단하게 숫자를 입력하면 x 2를 한 결과를 보여주는 WPF 프로젝트를 만들어보자</p>

<p><img src="/assets/images/posts/coding/wpf/wpf03.png" alt="WPF 예제 프로젝트 디렉터리 구조" /></p>

<p>디렉터리 구조는 위와같이 잡는다.</p>

<p>나는 보통 MVVM에 더하여 Service까지 디렉토리로 만들어 역할 분리를 하는 편이다.</p>

<p>서비스는 주로 로직을 담당한다. 위 프로젝트에서는 x2를 해주는 로직이 서비스에 들어가게 된다.</p>

<p>첫번째로 볼 파일은 ViewModel 내부에 있는 RelayCommand와 ViewModelBase이다.</p>

<p>각각의 역할은 다음과 같다.</p>
<ol>
  <li>ViewModelbase
    <blockquote>
      <p>INotifyPropertyChanged 구현을 한 곳에 모아두는 베이스 클래스야. 모든 ViewModel이 이걸 상속받아서 중복 코드를 없애는 용도.</p>
    </blockquote>
  </li>
  <li>RelayCommand
    <blockquote>
      <p>ICommand를 간편하게 구현한 클래스야. WPF에서 버튼 클릭 같은 이벤트를 ViewModel에서 처리하려면 ICommand가 필요한데, 매번 클래스를 새로 만들기 번거러우니까 Action을 받아서 재사용하는 구조</p>
    </blockquote>
  </li>
</ol>

<p>위 두 코드는 거의 모든 WPF에서 사용되니 기억해뒀다가 재사용 할 수 있도록 하자.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">ViewModelBase</span> <span class="p">:</span> <span class="n">INotifyPropertyChanged</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">event</span> <span class="n">PropertyChangedEventHandler</span> <span class="n">PropertyChanged</span><span class="p">;</span>

    <span class="k">protected</span> <span class="k">void</span> <span class="nf">OnPropertyChanged</span><span class="p">([</span><span class="n">CallerMemberName</span><span class="p">]</span> <span class="kt">string</span> <span class="n">name</span> <span class="p">=</span> <span class="k">null</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">PropertyChanged</span><span class="p">?.</span><span class="nf">Invoke</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="k">new</span> <span class="nf">PropertyChangedEventArgs</span><span class="p">(</span><span class="n">name</span><span class="p">));</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">RelayCommand</span> <span class="p">:</span> <span class="n">ICommand</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="k">readonly</span> <span class="n">Action</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">&gt;</span> <span class="n">_execute</span><span class="p">;</span>
    <span class="k">private</span> <span class="k">readonly</span> <span class="n">Func</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">,</span> <span class="kt">bool</span><span class="p">&gt;</span> <span class="n">_canExecute</span><span class="p">;</span>

    <span class="k">public</span> <span class="nf">RelayCommand</span><span class="p">(</span><span class="n">Action</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">&gt;</span> <span class="n">execute</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">,</span> <span class="kt">bool</span><span class="p">&gt;</span> <span class="n">canExecute</span> <span class="p">=</span> <span class="k">null</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">_execute</span> <span class="p">=</span> <span class="n">execute</span><span class="p">;</span>
        <span class="n">_canExecute</span> <span class="p">=</span> <span class="n">canExecute</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="kt">bool</span> <span class="nf">CanExecute</span><span class="p">(</span><span class="kt">object</span> <span class="n">parameter</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">_canExecute</span><span class="p">?.</span><span class="nf">Invoke</span><span class="p">(</span><span class="n">parameter</span><span class="p">)</span> <span class="p">??</span> <span class="k">true</span><span class="p">;</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Execute</span><span class="p">(</span><span class="kt">object</span> <span class="n">parameter</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nf">_execute</span><span class="p">(</span><span class="n">parameter</span><span class="p">);</span>
    <span class="k">public</span> <span class="k">event</span> <span class="n">EventHandler</span> <span class="n">CanExecuteChanged</span>
    <span class="p">{</span>
        <span class="k">add</span> <span class="p">=&gt;</span> <span class="n">CommandManager</span><span class="p">.</span><span class="n">RequerySuggested</span> <span class="p">+=</span> <span class="k">value</span><span class="p">;</span>
        <span class="k">remove</span> <span class="p">=&gt;</span> <span class="n">CommandManager</span><span class="p">.</span><span class="n">RequerySuggested</span> <span class="p">-=</span> <span class="k">value</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>본인은 ViewModel 내부에 Base라는 폴더를 만들어 넣어놓는다.</p>

<p>ViewModelBase와 RelayCommand는 추후 다른글로 다뤄보도록 하겠다.</p>

<p>다음은 Model을 정의해보자.</p>

<p><img src="/assets/images/posts/coding/wpf/wpf04.png" alt="NumberInfo 모델 파일 생성 화면" /></p>

<p>Models에 NumberInfo.cs를 만든다.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">WpfBasicPrc.Models</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">class</span> <span class="nc">NumberInfo</span>
    <span class="p">{</span>
        <span class="k">public</span> <span class="kt">int</span> <span class="n">Number</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
        <span class="k">public</span> <span class="kt">int</span> <span class="n">FinalNumber</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>다음 ViewModel을 보자.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Linq</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Text</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Threading.Tasks</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Windows.Input</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">WpfBasicPrc.Models</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">WpfBasicPrc.Services</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">WpfBasicPrc.ViewModels.Base</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">WpfBasicPrc.ViewModels</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">class</span> <span class="nc">MainViewModel</span> <span class="p">:</span> <span class="n">ViewModelBase</span>
    <span class="p">{</span>
        <span class="c1">// CalculateService: x2 계산 로직을 담당하는 서비스</span>
        <span class="k">private</span> <span class="k">readonly</span> <span class="n">CalculateService</span> <span class="n">_calculateService</span><span class="p">;</span>

        <span class="c1">// NumberInfo: 입력값(Number)과 결과값(FinalNumber)을 담는 모델</span>
        <span class="k">private</span> <span class="n">NumberInfo</span> <span class="n">_numberInfo</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">NumberInfo</span><span class="p">();</span>

        <span class="c1">// 계산 전 숫자 - View의 입력 TextBox와 바인딩</span>
        <span class="k">public</span> <span class="kt">int</span> <span class="n">Number</span>
        <span class="p">{</span>
            <span class="k">get</span> <span class="p">=&gt;</span> <span class="n">_numberInfo</span><span class="p">.</span><span class="n">Number</span><span class="p">;</span>
            <span class="k">set</span> <span class="p">{</span> <span class="n">_numberInfo</span><span class="p">.</span><span class="n">Number</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span> <span class="nf">OnPropertyChanged</span><span class="p">();</span> <span class="p">}</span>
        <span class="p">}</span>

        <span class="c1">// 계산 후 숫자 - View의 결과 TextBox와 바인딩</span>
        <span class="k">public</span> <span class="kt">int</span> <span class="n">FinalNumber</span>
        <span class="p">{</span>
            <span class="k">get</span> <span class="p">=&gt;</span> <span class="n">_numberInfo</span><span class="p">.</span><span class="n">FinalNumber</span><span class="p">;</span>
            <span class="k">set</span> <span class="p">{</span> <span class="n">_numberInfo</span><span class="p">.</span><span class="n">FinalNumber</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span> <span class="nf">OnPropertyChanged</span><span class="p">();</span> <span class="p">}</span>
        <span class="p">}</span>

        <span class="c1">// 계산 버튼 클릭 시 실행되는 커맨드 - View의 Button과 바인딩</span>
        <span class="k">public</span> <span class="n">ICommand</span> <span class="n">CalculateCommand</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

        <span class="c1">// 생성자: 서비스 초기화 및 커맨드 등록</span>
        <span class="k">public</span> <span class="nf">MainViewModel</span><span class="p">()</span>
        <span class="p">{</span>
            <span class="c1">// 서비스 인스턴스 생성</span>
            <span class="n">_calculateService</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">CalculateService</span><span class="p">();</span>

            <span class="c1">// 버튼 클릭 시 Service에 Model을 넘겨 계산 후 결과를 FinalNumber에 저장</span>
            <span class="n">CalculateCommand</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">RelayCommand</span><span class="p">(</span><span class="n">_</span> <span class="p">=&gt;</span>
            <span class="p">{</span>
                <span class="n">FinalNumber</span> <span class="p">=</span> <span class="n">_calculateService</span><span class="p">.</span><span class="nf">Double</span><span class="p">(</span><span class="n">_numberInfo</span><span class="p">);</span>
            <span class="p">});</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>위 예제에서 ViewModel은 Model &lt;-&gt; ViewModel, ViewModel &lt;-&gt; Service를 담당한다. 이떄 최종 처리된 값은 추후 View에서 사용하게 된다.</p>

<p>다음 Service를 보자.</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Linq</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Text</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Threading.Tasks</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">WpfBasicPrc.Models</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">WpfBasicPrc.Services</span>
<span class="p">{</span>
    <span class="k">class</span> <span class="nc">CalculateService</span>
    <span class="p">{</span>
        <span class="c1">//들어온 인자를 2배해서 리턴</span>
        <span class="k">public</span> <span class="kt">int</span> <span class="nf">Double</span><span class="p">(</span><span class="n">NumberInfo</span> <span class="n">numberInfo</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="n">numberInfo</span><span class="p">.</span><span class="n">Number</span> <span class="p">*</span> <span class="m">2</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

</code></pre></div></div>

<p>들어온 값을 2배해서 넘겨주는 로직이다. 예제에서는 간단하지만 DB연결과같은 처리를 보통 서비스에서 해준다.</p>

<p>마지막으로 View를 보겠다. WPF의 속성같은건 다른 글에서 다루니 일단은 따라치면서 흐름을 이해하는 용도로 사용하였으면 한다.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">&lt;</span><span class="n">Window</span> <span class="n">x</span><span class="p">:</span><span class="n">Class</span><span class="p">=</span><span class="s">"WpfBasicPrc.MainWindow"</span>
        <span class="n">xmlns</span><span class="p">=</span><span class="s">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span>
        <span class="n">xmlns</span><span class="p">:</span><span class="n">x</span><span class="p">=</span><span class="s">"http://schemas.microsoft.com/winfx/2006/xaml"</span>
        <span class="n">xmlns</span><span class="p">:</span><span class="n">d</span><span class="p">=</span><span class="s">"http://schemas.microsoft.com/expression/blend/2008"</span>
        <span class="n">xmlns</span><span class="p">:</span><span class="n">mc</span><span class="p">=</span><span class="s">"http://schemas.openxmlformats.org/markup-compatibility/2006"</span>
        <span class="n">xmlns</span><span class="p">:</span><span class="n">local</span><span class="p">=</span><span class="s">"clr-namespace:WpfBasicPrc"</span>
        <span class="n">xmlns</span><span class="p">:</span><span class="n">vm</span><span class="p">=</span><span class="s">"clr-namespace:WpfBasicPrc.ViewModels"</span>
        <span class="n">mc</span><span class="p">:</span><span class="n">Ignorable</span><span class="p">=</span><span class="s">"d"</span>
        <span class="n">Title</span><span class="p">=</span><span class="s">"MainWindow"</span> <span class="n">Height</span><span class="p">=</span><span class="s">"450"</span> <span class="n">Width</span><span class="p">=</span><span class="s">"800"</span><span class="p">&gt;</span>

    <span class="p">&lt;!--</span> <span class="n">DataContext</span><span class="p">:</span> <span class="n">MainViewModel</span><span class="err">을</span> <span class="n">View</span><span class="err">와</span> <span class="err">연결</span> <span class="p">--&gt;</span>
    <span class="p">&lt;</span><span class="n">Window</span><span class="p">.</span><span class="n">DataContext</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="n">vm</span><span class="p">:</span><span class="n">MainViewModel</span><span class="p">/&gt;</span>
    <span class="p">&lt;/</span><span class="n">Window</span><span class="p">.</span><span class="n">DataContext</span><span class="p">&gt;</span>

    <span class="p">&lt;</span><span class="n">Grid</span><span class="p">&gt;</span>
        <span class="p">&lt;</span><span class="n">StackPanel</span> <span class="n">HorizontalAlignment</span><span class="p">=</span><span class="s">"Center"</span> <span class="n">VerticalAlignment</span><span class="p">=</span><span class="s">"Center"</span><span class="p">&gt;</span>
            <span class="p">&lt;</span><span class="n">StackPanel</span> <span class="n">Orientation</span><span class="p">=</span><span class="s">"Horizontal"</span><span class="p">&gt;</span>

                <span class="p">&lt;!--</span> <span class="err">입력값</span><span class="p">:</span> <span class="n">Number</span> <span class="err">프로퍼티에</span> <span class="err">바인딩</span><span class="p">,</span> <span class="err">입력</span> <span class="err">즉시</span> <span class="err">업데이트</span> <span class="p">--&gt;</span>
                <span class="p">&lt;</span><span class="n">TextBox</span> <span class="n">Width</span><span class="p">=</span><span class="s">"200"</span>
                         <span class="n">Text</span><span class="p">=</span><span class="s">"{Binding Number, UpdateSourceTrigger=PropertyChanged}"</span><span class="p">/&gt;</span>

                <span class="p">&lt;!--</span> <span class="err">계산</span> <span class="err">버튼</span><span class="p">:</span> <span class="n">CalculateCommand</span> <span class="err">실행</span> <span class="p">--&gt;</span>
                <span class="p">&lt;</span><span class="n">Button</span> <span class="n">Content</span><span class="p">=</span><span class="s">"x2 계산"</span>
                        <span class="n">Command</span><span class="p">=</span><span class="s">"{Binding CalculateCommand}"</span>
                        <span class="n">Margin</span><span class="p">=</span><span class="s">"10 0 0 0"</span><span class="p">/&gt;</span>

                <span class="p">&lt;!--</span> <span class="err">결과값</span><span class="p">:</span> <span class="n">FinalNumber</span> <span class="err">프로퍼티에</span> <span class="err">바인딩</span><span class="p">,</span> <span class="err">읽기</span> <span class="err">전용</span> <span class="p">--&gt;</span>
                <span class="p">&lt;</span><span class="n">TextBox</span> <span class="n">Width</span><span class="p">=</span><span class="s">"200"</span>
                         <span class="n">Text</span><span class="p">=</span><span class="s">"{Binding FinalNumber}"</span>
                         <span class="n">IsReadOnly</span><span class="p">=</span><span class="s">"True"</span>
                         <span class="n">Margin</span><span class="p">=</span><span class="s">"10 0 0 0"</span><span class="p">/&gt;</span>

            <span class="p">&lt;/</span><span class="n">StackPanel</span><span class="p">&gt;</span>
        <span class="p">&lt;/</span><span class="n">StackPanel</span><span class="p">&gt;</span>
    <span class="p">&lt;/</span><span class="n">Grid</span><span class="p">&gt;</span>
<span class="p">&lt;/</span><span class="n">Window</span><span class="p">&gt;</span>
</code></pre></div></div>

<p><img src="/assets/images/posts/coding/wpf/wpf05.png" alt="숫자를 두 배로 계산하는 WPF 예제 실행 결과" /></p>

<p>결과물이다. 단순한 예제였고, 처음은 그냥 따라치면서 흐름, 이런게 WPF고 MVVM이구나 라는 느낌만 가져갔으면 좋겠다. 
추후 후임이 들어오거나, WPF를 가르쳐야 하는 경우가 있을 경우를 대비하여 공부하면서 초보자가 읽어도 이해할 수 있는 수준으로 글을 작성하고 싶다.</p>

<p>댓글로 잘못된 정보나 추가했으면 하는 내용을 편하게 남겨주면 좋겠다.</p>]]></content><author><name>swimming</name></author><category term="coding" /><category term="wpf" /><summary type="html"><![CDATA[데스크톱 UI, MVVM, 바인딩, XAML 기록]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://xn--9p4bn7dwj.com/assets/images/posts/coding/wpf/wpf01.png" /><media:content medium="image" url="https://xn--9p4bn7dwj.com/assets/images/posts/coding/wpf/wpf01.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">첫번째 글입니다.</title><link href="https://xn--9p4bn7dwj.com/life/2026/06/01/1/" rel="alternate" type="text/html" title="첫번째 글입니다." /><published>2026-06-01T23:41:00+09:00</published><updated>2026-06-01T23:41:00+09:00</updated><id>https://xn--9p4bn7dwj.com/life/2026/06/01/1</id><content type="html" xml:base="https://xn--9p4bn7dwj.com/life/2026/06/01/1/"><![CDATA[<p>두번째 글이자 처음 마크다운을 직접 작성하는 글 입니다.
티스토리로 글을 작성하고 있었는데 디자인의 한계와, 뭔가 불편한 것들이 많아 깃허브 페이지로 옮겨보려고 합니다.</p>

<p>이제 막 2달차로 진입한 C# 방산 개발자로서 아직은 회사 일의 모든것이 어렵고, 낯선 느낌입니다.</p>

<p>MVVM이 뭐며, WPF 같이 처음 들어본 툴을 사용해보기도 하면서 개발자로서 한걸음 앞으로 간 느낌입니다.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="k">public</span> <span class="k">class</span> <span class="nc">Program</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"꾸준히 현재에 안주하지 않고, 개발이며, 체력이며 유지하며 발전해 나가보려고 합니다."</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>아직은 마크다운으로 무엇을 작성한다는게 어색하고, 블로그 디자인도 AI로 만들어 어색하지만, 조금씩 바꿔보려고 합니다.</p>

<p>언젠가는 여러 개발자, 개발 지망생 분들이 정보를 얻어가는 공간이 되었으면 좋겠습니다.</p>]]></content><author><name>swimming</name></author><category term="life" /><category term="start" /><category term="blog" /><summary type="html"><![CDATA[두번째 글이자 처음 마크다운을 직접 작성하는 글 입니다. 티스토리로 글을 작성하고 있었는데 디자인의 한계와, 뭔가 불편한 것들이 많아 깃허브 페이지로 옮겨보려고 합니다.]]></summary></entry><entry><title type="html">C# 테스트 글</title><link href="https://xn--9p4bn7dwj.com/coding/2026/06/01/csharp-test-post/" rel="alternate" type="text/html" title="C# 테스트 글" /><published>2026-06-01T20:50:00+09:00</published><updated>2026-06-01T20:50:00+09:00</updated><id>https://xn--9p4bn7dwj.com/coding/2026/06/01/csharp-test-post</id><content type="html" xml:base="https://xn--9p4bn7dwj.com/coding/2026/06/01/csharp-test-post/"><![CDATA[<p>C# 게시판에 글 목록이 어떻게 보이는지 확인하기 위한 테스트 글입니다.</p>

<p>나중에 실제 기록을 쓰기 시작하면 이 글은 지우거나 첫 C# 메모로 바꿔도 됩니다.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">Program</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Hello, C# archive."</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>swimming</name></author><category term="coding" /><category term="C#" /><category term="test" /><summary type="html"><![CDATA[C# 게시판에 글 목록이 어떻게 보이는지 확인하기 위한 테스트 글입니다.]]></summary></entry><entry><title type="html">블로그를 시작하며</title><link href="https://xn--9p4bn7dwj.com/life/2026/05/31/welcome/" rel="alternate" type="text/html" title="블로그를 시작하며" /><published>2026-05-31T10:00:00+09:00</published><updated>2026-05-31T10:00:00+09:00</updated><id>https://xn--9p4bn7dwj.com/life/2026/05/31/welcome</id><content type="html" xml:base="https://xn--9p4bn7dwj.com/life/2026/05/31/welcome/"><![CDATA[<p>첫 글입니다.</p>

<p>이 블로그에는 코딩하면서 배운 점, 프로젝트를 만들며 남기고 싶은 기록, 그리고 일상에서 오래 기억하고 싶은 순간들을 적어보려고 합니다.</p>

<p>작게 시작하고, 꾸준히 다듬어가겠습니다.</p>]]></content><author><name>swimming</name></author><category term="life" /><category term="start" /><category term="blog" /><summary type="html"><![CDATA[첫 글입니다.]]></summary></entry></feed>