<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Byulpa 님의 블로그</title>
    <link>https://asdfg5661.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 7 Apr 2026 11:51:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Byulpa</managingEditor>
    <item>
      <title>ZedGraph를 이용한 시간별 Value 측정(2)</title>
      <link>https://asdfg5661.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://asdfg5661.tistory.com/13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.23 - [IT/C# Windows Form(.NET Framework)] - ZedGraph를 사용한 시간별 Value 측정(1)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbt6RC/btsLZXhH9X7/L1FngvrYhgGRsfd6tzELKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbt6RC/btsLZXhH9X7/L1FngvrYhgGRsfd6tzELKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbt6RC/btsLZXhH9X7/L1FngvrYhgGRsfd6tzELKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbt6RC%2FbtsLZXhH9X7%2FL1FngvrYhgGRsfd6tzELKk%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;600&quot; height=&quot;481&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;536&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;266&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XnTS8/btsLYRvQiVq/uUeTwwZaIMvZFVRIsckB5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XnTS8/btsLYRvQiVq/uUeTwwZaIMvZFVRIsckB5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XnTS8/btsLYRvQiVq/uUeTwwZaIMvZFVRIsckB5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXnTS8%2FbtsLYRvQiVq%2FuUeTwwZaIMvZFVRIsckB5k%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;227&quot; height=&quot;141&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Cbx_Color_SelectedIndexChanged]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Configuration에서 그래프에서 Line의 색상을 바꿔주는 이벤트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세 개의 comboBox가 이 이벤트에 묶여있으며, comboBox의 이름을 switch문으로 구분 한 다음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GetColorFromString을 호출하여 comboBox에서 사용자가 선택한 색상으로 반환한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMSHuE/btsLZWiOtd8/Fzw5xqF3h9DdZNwKUXKbbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMSHuE/btsLZWiOtd8/Fzw5xqF3h9DdZNwKUXKbbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMSHuE/btsLZWiOtd8/Fzw5xqF3h9DdZNwKUXKbbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMSHuE%2FbtsLZWiOtd8%2FFzw5xqF3h9DdZNwKUXKbbK%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;548&quot; height=&quot;137&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;137&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;253&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byKqbw/btsLXSvF5fY/M4zkJFNDulNjea7g8wOZY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byKqbw/btsLXSvF5fY/M4zkJFNDulNjea7g8wOZY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byKqbw/btsLXSvF5fY/M4zkJFNDulNjea7g8wOZY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyKqbw%2FbtsLXSvF5fY%2FM4zkJFNDulNjea7g8wOZY0%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;253&quot; height=&quot;88&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Cbx_TimeCycle_SelectedIndexChanged]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프의 Time Cycle을 변경하는 이벤트이다.&lt;br /&gt;comboBox에서 값을 변경하면 호출되고, 변경한 값이 TimeCycle 변수로 들어가게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lNKPf/btsLYqMc5Mt/Q5EhFb9gZEZ5Me7SF7Y8M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lNKPf/btsLYqMc5Mt/Q5EhFb9gZEZ5Me7SF7Y8M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lNKPf/btsLYqMc5Mt/Q5EhFb9gZEZ5Me7SF7Y8M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlNKPf%2FbtsLYqMc5Mt%2FQ5EhFb9gZEZ5Me7SF7Y8M0%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;540&quot; height=&quot;532&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;586&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;257&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqTRzP/btsLYoHDAiV/Bx4CzGhKOKqmiamIV1DEu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqTRzP/btsLYoHDAiV/Bx4CzGhKOKqmiamIV1DEu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqTRzP/btsLYoHDAiV/Bx4CzGhKOKqmiamIV1DEu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqTRzP%2FbtsLYoHDAiV%2FBx4CzGhKOKqmiamIV1DEu0%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;257&quot; height=&quot;55&quot; data-origin-width=&quot;257&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Cbx_SymbolType_SelectedIndexChanged]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프의 Symbol Type을 설정하는 이벤트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작동 흐름은 [Cbx_Color_SelectedIndexChanged] 과 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5AZdD/btsLZKv4w3Q/x0m9Q6kB8Y1oFex4raH870/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5AZdD/btsLZKv4w3Q/x0m9Q6kB8Y1oFex4raH870/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5AZdD/btsLZKv4w3Q/x0m9Q6kB8Y1oFex4raH870/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5AZdD%2FbtsLZKv4w3Q%2Fx0m9Q6kB8Y1oFex4raH870%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;654&quot; height=&quot;251&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;251&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;169&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ybrIt/btsLYFI5Omz/kLq55fPVVBaAAW1Z8tvzDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ybrIt/btsLYFI5Omz/kLq55fPVVBaAAW1Z8tvzDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ybrIt/btsLYFI5Omz/kLq55fPVVBaAAW1Z8tvzDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FybrIt%2FbtsLYFI5Omz%2FkLq55fPVVBaAAW1Z8tvzDk%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;169&quot; height=&quot;116&quot; data-origin-width=&quot;169&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Numeric_AxisSize_Changed]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X축, Y축의 최소값과 최댓값을 변경하는 이벤트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 컴포넌트의 값이 변경되면 NumericUpDown의 이름을 가져온 다음 해당 이름의 컴포넌트의 값으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X축, Y축의 최소값 또는 최댓값을 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IBVkn/btsLZeLaAD7/ZUVfe7R4GuaTZY5jZGk1Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IBVkn/btsLZeLaAD7/ZUVfe7R4GuaTZY5jZGk1Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IBVkn/btsLZeLaAD7/ZUVfe7R4GuaTZY5jZGk1Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIBVkn%2FbtsLZeLaAD7%2FZUVfe7R4GuaTZY5jZGk1Ek%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;619&quot; height=&quot;716&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;716&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;332&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdfo4q/btsLXR4E3ZZ/0VTsrZhKfO9HkKnXmUmVL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdfo4q/btsLXR4E3ZZ/0VTsrZhKfO9HkKnXmUmVL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdfo4q/btsLXR4E3ZZ/0VTsrZhKfO9HkKnXmUmVL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdfo4q%2FbtsLXR4E3ZZ%2F0VTsrZhKfO9HkKnXmUmVL0%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;332&quot; height=&quot;115&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;115&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;[CheckGrid_CheckedChange]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;X, Y축의 최소값 최댓값을 기준으로 하는 선을 표시할지 말지를 선택하는 이벤트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 checkBox의 값이 변경될 때 이벤트가 발생하며, 체크된 컴포넌트의 이름을 가져와서&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;</description>
      <category>IT/C# Windows Form(.NET Framework)</category>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/14</guid>
      <comments>https://asdfg5661.tistory.com/14#entry14comment</comments>
      <pubDate>Fri, 24 Jan 2025 09:20:00 +0900</pubDate>
    </item>
    <item>
      <title>ZedGraph를 사용한 시간별 Value 측정(1)</title>
      <link>https://asdfg5661.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C# WPF ZedGraph를 사용한 그래프를 작성해 볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NuGet으로 ZedGraph를 다운받으면 된다.&lt;/p&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sHNdD/btsLYMOqagp/3rLRWwyOrJwkqG6g6S9YU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sHNdD/btsLYMOqagp/3rLRWwyOrJwkqG6g6S9YU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sHNdD/btsLYMOqagp/3rLRWwyOrJwkqG6g6S9YU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsHNdD%2FbtsLYMOqagp%2F3rLRWwyOrJwkqG6g6S9YU1%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;583&quot; height=&quot;614&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&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;ZedGraph와 Button, Label을 배치하여 X축은 시간(60초), Y축은 Random클래스를 사용하여 난수를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집어넣어 Value값 3개(Data A, B, C)를 표시할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 Panel에는 그래프에 대한 설정을 변경할 수 있는 기능들을 추가해줬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실시간으로 받아온다했으면서&amp;nbsp; Time Cycle을 작성한 이유는,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1초마다 실시간으로 받아온 Value를 그래프로 표기하게 되면,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHq7Jv/btsLYtBJm0h/mFWsKKxiht8DjPnO8l6fKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHq7Jv/btsLYtBJm0h/mFWsKKxiht8DjPnO8l6fKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHq7Jv/btsLYtBJm0h/mFWsKKxiht8DjPnO8l6fKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHq7Jv%2FbtsLYtBJm0h%2FmFWsKKxiht8DjPnO8l6fKK%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;484&quot; height=&quot;310&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 어지러운 그래프가 생성되기 때문에, TimeCycle로 적당한 주기를 잡아준 후 그래프를 그릴 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEHFu/btsLYDRDHFO/7q86kJKdyhNt8DLKFrl5mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEHFu/btsLYDRDHFO/7q86kJKdyhNt8DLKFrl5mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEHFu/btsLYDRDHFO/7q86kJKdyhNt8DLKFrl5mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEHFu%2FbtsLYDRDHFO%2F7q86kJKdyhNt8DLKFrl5mK%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;489&quot; height=&quot;187&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;187&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;다른 클래스는 다 써봤고, GraphPane은 zedGraph 객체를 생성하기 위한 것인데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LineItem, RollingPointPairList 이 두개의 클래스가 생소했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글링을 해보니, LineItem은 Line Graph(라인 그래프)를 생성하기 위한 객체를 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 클래스에서 각각의 라인에 색상, 두께, 심볼 타입 등을 정의할 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RollingPointPairList는 PointPairList의 확장 클래스라는데, 데이터 개수를 제한하여 최신 데이터만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유지하면서 오래된 데이터는 자동으로 삭제한다. 실시간 데이터를 받아오는 그래프에서 유용하게 사용된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF3X2f/btsLWsKVkYP/kfyjiQubscBD5Q49X7T1jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF3X2f/btsLWsKVkYP/kfyjiQubscBD5Q49X7T1jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF3X2f/btsLWsKVkYP/kfyjiQubscBD5Q49X7T1jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF3X2f%2FbtsLWsKVkYP%2FkfyjiQubscBD5Q49X7T1jK%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;606&quot; height=&quot;585&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;740&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;771&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wkmd1/btsLYbadwa2/QF4my6vf1N0sX5hNAYwtR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wkmd1/btsLYbadwa2/QF4my6vf1N0sX5hNAYwtR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wkmd1/btsLYbadwa2/QF4my6vf1N0sX5hNAYwtR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwkmd1%2FbtsLYbadwa2%2FQF4my6vf1N0sX5hNAYwtR0%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;610&quot; height=&quot;255&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;322&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 data-ke-size=&quot;size16&quot;&gt;그래프의 전체적인 제목, X축, Y축에 대한 제목을 선언했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X축과 Y축의 최소값과 최대값, 작은 칸과 큰 칸의 간격을 설정해주고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실시간으로 받을 데이터를 객체로 생성해준 다음 LineItem 클래스로 선언했던 선 들의 색상, 심볼 등을&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초마다 움직이게 한 다음 1초씩 움직일때마다 실행할 메서드를&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이머 이벤트에 연결해주었다. 나머지는 그냥 comboBox에 아이템들(색상, 시간 주기, 심볼 타입)을&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXaxz2/btsLYCluAES/YUaHycpdmm52Rx7Ee5bpMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXaxz2/btsLYCluAES/YUaHycpdmm52Rx7Ee5bpMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXaxz2/btsLYCluAES/YUaHycpdmm52Rx7Ee5bpMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXaxz2%2FbtsLYCluAES%2FYUaHycpdmm52Rx7Ee5bpMK%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;752&quot; height=&quot;485&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;618&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;429&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnnoDu/btsLXpAxgT4/Euw9qyTJSqznrIWNwIC0j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnnoDu/btsLXpAxgT4/Euw9qyTJSqznrIWNwIC0j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnnoDu/btsLXpAxgT4/Euw9qyTJSqznrIWNwIC0j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnnoDu%2FbtsLXpAxgT4%2FEuw9qyTJSqznrIWNwIC0j1%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;410&quot; height=&quot;503&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 부터 순서대로 Start, Pause, Stop, All Clear 버튼이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Start 버튼]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StateGraph(그래프 동작 상태)가 false 상태이면 ResetData를 호출하여 데이터를 초기화하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이머를 실행한다.&lt;br /&gt;StateGraph를 선언한 이유는 Pause상태와 Stop상태를 구별하기 위해서라고 생각하면 된다.&lt;br /&gt;[Pause 버튼]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이머를 멈추고, Log 파일에 &quot;PAUSE&quot;를 작성한다.&lt;br /&gt;StateGraph는 true 상태로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Stop 버튼]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이머 메모리를 삭제하고, 로그에 &quot;STOP&quot;을 작성하고, 데이터를 초기화 한 다음 StateGraph를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;false상태로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[All Clear 버튼]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Configuration 부분에서 사용자가 바꿔놓은 설정값을 초기화하는 버튼이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;코드에서 나온 메서드들은 바로 아래에서 후술하겠다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;메서드들이 어떤 역할을 하는지 알고 싶다면 Ctrl + F를 누르고 메서드 이름을 넣으면 찾을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;825&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMKraX/btsLYtPiBFb/t8zsjtJ0bGVh2KUxZ5QP70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMKraX/btsLYtPiBFb/t8zsjtJ0bGVh2KUxZ5QP70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMKraX/btsLYtPiBFb/t8zsjtJ0bGVh2KUxZ5QP70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMKraX%2FbtsLYtPiBFb%2Ft8zsjtJ0bGVh2KUxZ5QP70%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;744&quot; height=&quot;825&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;825&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 1초마다 실행 할 메서드이다. (타이머 이벤트에 연결해두었음.)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;전반적인 흐름 자체는, 60초까지 동작하며 1초, 설정해둔 시간 주기마다 그래프를 그린다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;60초가 지나면 메세지박스를 팝업하고, 로그를 작성하게 한다. 각 버튼을 비활성화 시키게 해놓고,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Graph상태를 false로 내려둔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqSqYO/btsLYwFjR1w/jPnZLLp2KEdX2sSWVz1yh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqSqYO/btsLYwFjR1w/jPnZLLp2KEdX2sSWVz1yh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqSqYO/btsLYwFjR1w/jPnZLLp2KEdX2sSWVz1yh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqSqYO%2FbtsLYwFjR1w%2FjPnZLLp2KEdX2sSWVz1yh1%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;682&quot; height=&quot;420&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[ShowMsgBox]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;메세지박스를 팝업시키는 메서드이며, 매개변수가 true일때와 false일때 메세지박스를 서로 다르게&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;팝업하게 만들었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[ButtonEnabled]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Start, Pause, Stop 버튼을 활성화하거나 비활성화하는 메서드이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이미 그래프가 그려져있는 상태에서 Start버튼을 누르거나, 이미 Pause 버튼을 누른 상태에서&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또 Pause버튼을 누르는 등 정상적이지 않은 이벤트가 발생되는 것을 방지하기 위함이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOb16S/btsLX8kjSW3/Nw8HsG6TttI19xy7nuXxA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOb16S/btsLX8kjSW3/Nw8HsG6TttI19xy7nuXxA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOb16S/btsLX8kjSW3/Nw8HsG6TttI19xy7nuXxA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOb16S%2FbtsLX8kjSW3%2FNw8HsG6TttI19xy7nuXxA0%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;813&quot; height=&quot;747&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[WriteLog]&lt;br /&gt;데이터를 받아오는대로 Log를 작성하기 위한 메서드이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nLDO9/btsLYHNeJwE/jjFYzucfoMLkzMhX4ZEVKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nLDO9/btsLYHNeJwE/jjFYzucfoMLkzMhX4ZEVKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nLDO9/btsLYHNeJwE/jjFYzucfoMLkzMhX4ZEVKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnLDO9%2FbtsLYHNeJwE%2FjjFYzucfoMLkzMhX4ZEVKk%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;261&quot; height=&quot;284&quot; data-origin-width=&quot;261&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[ResetData]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Stop 버튼을 눌렀을 때 처음 상태로 되돌리기 위해 데이터들을 초기화한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 계속 나오는 zedGraphControl1.AxisChange와 Refresh가 있는데,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;AxisChange는 호출할때마다 축을 업데이트한다고 생각하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래프의 범위에 따라 축의 최소값, 최대값, 간격 등을 자동으로 재계산한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Refresh는 그 즉시 다시 그래프를 그리게 하는 메서드이다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPdqjX/btsLYIsm3rJ/oODYMfilNKsY9WpkxouGc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPdqjX/btsLYIsm3rJ/oODYMfilNKsY9WpkxouGc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPdqjX/btsLYIsm3rJ/oODYMfilNKsY9WpkxouGc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPdqjX%2FbtsLYIsm3rJ%2FoODYMfilNKsY9WpkxouGc1%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;392&quot; height=&quot;512&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[ClearTextFields]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Stop버튼을 눌렀을 때 호출되는 메서드이며, Configuration 부분에서 사용자가 설정해놓은&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컴포넌트들을 초기화하는 메서드이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일단 이 글에서는 Button과 그 Button에 사용되는 메서드까지만 설명하도록 하고&lt;br /&gt;나머지 기능들과 최종 동작 부분은 다음글에서 후술하도록 하겠다.&lt;/p&gt;</description>
      <category>IT/C# Windows Form(.NET Framework)</category>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/13</guid>
      <comments>https://asdfg5661.tistory.com/13#entry13comment</comments>
      <pubDate>Thu, 23 Jan 2025 17:28:55 +0900</pubDate>
    </item>
    <item>
      <title>PLC - ModBus</title>
      <link>https://asdfg5661.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 개요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ModBus-TCP는 산업용 필드버스 분야에서 자주 사용되는 통신 프로토콜이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP/IP 네트워크 상에서 상위장치와 하위장치간의 인터페이스를 위하여 고안된 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ModBus-TCP 통신규격에는 마스터(Client)와 슬레이브(Server)의 역할이 나누어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슬레이브(Server)는 마스터(Client)가 요청하는 데이터에 대해 응답해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마스터(Client)와 슬레이브(Server)간의 정상적인 Data 통신을 하기 위해서는&amp;nbsp;&lt;br /&gt;ModBus-TCP 프레임구조에 맞는 데이터 패킷을 전송해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ModBus-TCP 프레임 구조는 범용 ModBus(RTU, ASCII) 프레임 구조와 상당히 비슷하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 프레임 구조&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FR2NJ/btsLSAITDpu/zwIkBC4kRIXcghQkUHN7hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FR2NJ/btsLSAITDpu/zwIkBC4kRIXcghQkUHN7hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FR2NJ/btsLSAITDpu/zwIkBC4kRIXcghQkUHN7hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFR2NJ%2FbtsLSAITDpu%2FzwIkBC4kRIXcghQkUHN7hk%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;857&quot; height=&quot;509&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ModBus-TCP는, ModBus RTU의 프레임에서 CRC를 제외하고 앞에 6byte의 헤더를 추가한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 이더넷 환경에서 사용되기 때문에, 즉 하위 레벨에서 오류 체크를 다 해주기 때문에 CRC는 필요없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6byte의 추가 헤더에는 트랜잭션 ID가 포함되는데, 이건 요청 프레임과 응답 프레임을 서로 매칭하는&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;br /&gt;통신하는 것이&amp;nbsp; 아니라, 요청과 응답 스레드를 분리하여 요청은 요청대로 그냥 막 송신하고, &lt;br /&gt;응답은 응답대로 계속 읽어서, 최종적으로 서로 같은 트랜잭션 아이디를 찾아 매칭하여 어느&lt;br /&gt;Address에 어떤 값이 있는지를 결정할 수 있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임 구조를 표로 나타내면 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8449%; text-align: center;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 12.4031%; text-align: center;&quot;&gt;길이&lt;/td&gt;
&lt;td style=&quot;width: 72.7519%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8449%; text-align: center;&quot;&gt;트랜잭션 ID&lt;/td&gt;
&lt;td style=&quot;width: 12.4031%; text-align: center;&quot;&gt;2 byte&lt;/td&gt;
&lt;td style=&quot;width: 72.7519%; text-align: center;&quot;&gt;송신 프레임과 수신 프레임을 매칭하는데 사용(비동기 통신 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8449%; text-align: center;&quot;&gt;프로토콜 ID&lt;/td&gt;
&lt;td style=&quot;width: 12.4031%; text-align: center;&quot;&gt;2 byte&lt;/td&gt;
&lt;td style=&quot;width: 72.7519%; text-align: center;&quot;&gt;그냥 0으로 고정하여 표기.(0 = ModBus TCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8449%; text-align: center;&quot;&gt;메시지 길이&lt;/td&gt;
&lt;td style=&quot;width: 12.4031%; text-align: center;&quot;&gt;2 byte&lt;/td&gt;
&lt;td style=&quot;width: 72.7519%; text-align: center;&quot;&gt;이 다음에 오는 Address ~ Data의 총 길이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8449%; text-align: center;&quot;&gt;Address&lt;/td&gt;
&lt;td style=&quot;width: 12.4031%; text-align: center;&quot;&gt;1 byte&lt;/td&gt;
&lt;td style=&quot;width: 72.7519%; text-align: center;&quot;&gt;장치 주소(Slave Address 또는 Station Address)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8449%; text-align: center;&quot;&gt;Function&lt;/td&gt;
&lt;td style=&quot;width: 12.4031%; text-align: center;&quot;&gt;1 byte&lt;/td&gt;
&lt;td style=&quot;width: 72.7519%; text-align: center;&quot;&gt;Function 코드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.8449%; text-align: center;&quot;&gt;Data&lt;/td&gt;
&lt;td style=&quot;width: 12.4031%; text-align: center;&quot;&gt;n byte&lt;/td&gt;
&lt;td style=&quot;width: 72.7519%; text-align: center;&quot;&gt;Function 코드에 대한 데이터&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3.&amp;nbsp; ModBus 요청 프레임&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 순번(0, 1) - ModBus 프로토콜 (2, 3) - ModBus RTU 길이(4, 5) - 국번(6) - Function Code(7) -&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ModBus Address(8, 9) - 제어 명령(10, 11) - CRC(12)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. Function Code[LS산전 기준]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;0x01 - 읽기 코일 상태 (Read Coils)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : 디지털 출력(코일) 상태를 읽는다.&lt;/li&gt;
&lt;li&gt;설명 : 여러 개의 코일을 읽을 때 사용하며, 코일은 1비트로 표현된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0x02 - 읽기 디지털 입력 상태 (Read Discrete Inputs)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : 디지털 입력 상태를 읽는다.&lt;/li&gt;
&lt;li&gt;설명 : 여러 개의 디지털 입력을 읽을 때 사용하며, 각 입력은 1비트로 표현된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0x03 - 읽기 홀딩 레지스터 (Read Holding Registers)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : 16비트 워드(홀딩 레지스터) 값을 읽는다.&lt;/li&gt;
&lt;li&gt;설명 : 주로 설정값이나 데이터를 읽을 때 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0x04 - 읽기 입력 레지스터 (Read Input Registers)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : 입력 레지스터 값을 읽는다.&lt;/li&gt;
&lt;li&gt;설명 : PLC의 입력값(센서 값 등)을 읽을 때 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0x05 - 쓰기 단일 코일 (Write Single Coil)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : 단일 디지털 출력을 제어한다.&lt;/li&gt;
&lt;li&gt;설명 : 1개의 코일(디지털 출력)을 ON 또는 OFF로 설정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0x06 - 쓰기 단일 레지스터 (Write Single Register)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : 단일 16비트 레지스터 값을 설정한다.&lt;/li&gt;
&lt;li&gt;설명 : PLC에서 특정 레지스터의 값을 설정할 때 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0x0F - 쓰기 다중 코일 (Write Multiple Coils)&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : 여러 개의 디지털 출력을 제어한다.&lt;/li&gt;
&lt;li&gt;설명 : 여러 개의 코일을 한 번에 ON/OFF설정할 때 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0x08 - 예외 상태 (Diagnostic)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : 진단 정보를 읽는다.&lt;/li&gt;
&lt;li&gt;설명 : PLC의 상태를 확인하고 진단하는데 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0x10 - 쓰기 다중 레지스터 (Write Multiple Registers)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : 여러 개의 16비트 레지스터 값을 설정한다.&lt;/li&gt;
&lt;li&gt;설명 : 여러 개의 레지스터를 한 번에 설정할 때 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0x11 - 읽기/쓰기에 대한 특수 명령 (Report Slave ID)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기능 : ModBus 장치의 식별 정보를 읽어온다.&lt;/li&gt;
&lt;li&gt;설명 : Slave Id와 같은 장치 정보를 읽어온다, 장치의 상태나 구성 정보를 확인할 때 유용하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/12</guid>
      <comments>https://asdfg5661.tistory.com/12#entry12comment</comments>
      <pubDate>Mon, 20 Jan 2025 18:06:44 +0900</pubDate>
    </item>
    <item>
      <title>PLC_Device</title>
      <link>https://asdfg5661.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 개요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PLC 내부에서 사용할 수 있는 전기적 소자, 즉 디바이스에는 4가지 종류의 디바이스가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;외부 디바이스 - CPU 외부에서 입력을 받거나 출력을 할 때 사용하는 디바이스(X, Y)&lt;/li&gt;
&lt;li&gt;내부 디바이스 - CPU 외부로 직접 출력할 수 없으며 CPU내부에서 사용하는 디바이스&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (M, L, B, T, C, W, D, Z, R)&lt;/li&gt;
&lt;li&gt;비트 디바이스 - ON/OFF 신호만 취급 (X, Y, M, L, B)&lt;/li&gt;
&lt;li&gt;워드 디바이스 - 데이터 취급(T, C, W, D, Z, R)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 디바이스 종류&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;X (입력)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PLC 입력 유닛에 연결된 입력 장치의 ON/OFF 데이터를 저장하는 입력 디바이스&lt;/li&gt;
&lt;li&gt;입력 데이터는 PLC CPU의 입력 저장 영역에 저장됨&lt;/li&gt;
&lt;li&gt;X 디바이스는 프로그램 상에서는 코일로 사용 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Y (출력)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PLC 출력 유닛에 연결된 출력 장치에 연산 결과(ON/OFF)를 전달하는 데이터를 저장하는 &lt;br /&gt;출력 디바이스&lt;/li&gt;
&lt;li&gt;출력 리프레시 시 출력 데이터 저장 영역에 저장된 데이터를 출력 유닛으로 전송&lt;/li&gt;
&lt;li&gt;Y 디바이스 프로그램상에서 코일 및 접점으로 사용 가능&lt;/li&gt;
&lt;li&gt;단, 동일 Y 디바이스의 출력 코일을 두 번 이상 사용 못함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;M (내부 릴레이)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU 외부로 직접 출력할 수 없는 PLC 내부의 보조 릴레이, CPU의 ON/OFF 접점 데이터를 &lt;br /&gt;저장하는 비트 디바이스&lt;/li&gt;
&lt;li&gt;파라미터에서 휘발성, 불휘발성 영역으로 가변 가능&lt;/li&gt;
&lt;li&gt;프로그램에서 접점 및 코일로 사용 가능, 단, 출력 코일은 두 번 이상 사용 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;L (래치 릴레이)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부 릴레이와 사용 방법은 동일하나 불휘발성 영역으로 전원 OFF시에도 메모리 카세트내의 &lt;br /&gt;배터리에 의해 데이터를 유지하는 내부 릴레이&lt;/li&gt;
&lt;li&gt;래치 데이터 삭제 방법은 CPU 전면의 Latch Reset 스위치를 이용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;F (고장 검출용 릴레이)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고장 검출용 프로그램을 작성해 두고 실행 시 F릴레이 중 ON된 디바이스번호가 특수 레지스터 &lt;br /&gt;D9009에 저장이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;S (스텝 릴레이)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부 릴레이와 사용 방법은 동일하나 스텝 릴레이로서 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;B (링크 릴레이)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내부 릴레이와 사용 방법은 동일하나 CPU간 네트워크 통신 또는 통신시 CPU 간 상호 데이터를 &lt;br /&gt;공유하는 디바이스&lt;/li&gt;
&lt;li&gt;네트워크를 하지 않을 경우 내부 릴레이로서 이용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;T (타이머)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ON Delay 타이머로서 설정값 단위에 따라 100ms 타이머, 10ms 타이머, 100ms 적산 타이머 등 &lt;br /&gt;세 종류의 타이머&lt;/li&gt;
&lt;li&gt;타이머 종류는 파라미터에서 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;C (카운터)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 프로그램에서 사용하는 Up-Counter 및 Interrupt 프로그램에서 사용하는 &lt;br /&gt;Interrupt Counter 두 종류가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;W (링크 레지스터)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 통신 및 리모트 통신 시 CPU간 상호 워드 데이터를 공유하는 디바이스&lt;/li&gt;
&lt;li&gt;네트워크를 하지 않을 경우 데이터 레지스터(D) 영역과 동일하게 사용됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;D (데이터 레지스터)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU내의 데이터를 저장하는 디바이스&lt;/li&gt;
&lt;li&gt;16bit or 32bit 단위로 데이터 저장&lt;/li&gt;
&lt;li&gt;-32,768 ~ 32,767까지 저장 가능&lt;/li&gt;
&lt;li&gt;D9000 ~ D9255는 시스템 제어 영역&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Z, V (인덱스 레지스터)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디바이스 수식용으로 사용하는 데이터 레지스터 영역&lt;/li&gt;
&lt;li&gt;MuN 타입의 경우 접점과 코일에서는 이용이 불가능&lt;/li&gt;
&lt;li&gt;MuN, MnU타입의 경우 접점과 코일에서도 인덱스 레지스터를 이용 가능&lt;/li&gt;
&lt;li&gt;인덱스 레지스터 저장값에 따라 명령의 Source, Destination 영역이 가변&lt;/li&gt;
&lt;li&gt;다른 기타 디바이스와 같이 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;R (파일 레지스터)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU의 데이터 저장 영역(D, W)이 부족할 경우 메모리 카세트의 저장 영역을 이용하여 &lt;br /&gt;워드값을 저장할 경우 사용하는 디바이스&lt;/li&gt;
&lt;li&gt;파라미터 메모리 용량 설정 영역에서 파일 레지스터의 사용범위를 성정&lt;/li&gt;
&lt;li&gt;파일 레지스터 1Point당 2Byte를 차지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;P (포인터)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분기명령(CJ, SCJ, CALL, JMP)의 분기점을 지정하는 디바이스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;N (네스팅)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MC, MCR의 Master Control 명령을 사용할 경우 영역을 지정하는 디바이스&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A (어큐뮬레이터)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 명령 또는 응용 명령(ROS, SUM, SER 등)의 연산 결과를 저장하는 임시 워드 저장 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I (인터럽터용 포인터)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터럽터 요인이 발생할 경우 인터럽터 요인에 대응하는 프로그램으로 분기하는 곳을 &lt;br /&gt;지정하는 디바이스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;K (10진수 지정)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램에서 10진수를 직접 지정할 경우 숫자 앞부분에 K를 입력&lt;/li&gt;
&lt;li&gt;ex) K10, K200&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;H (16진수 지정)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램에서 16진수를 직접 지정할 경우 숫자 앞부분에 H를 입력&lt;/li&gt;
&lt;li&gt;ex) H100, H300&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/11</guid>
      <comments>https://asdfg5661.tistory.com/11#entry11comment</comments>
      <pubDate>Mon, 20 Jan 2025 17:42:16 +0900</pubDate>
    </item>
    <item>
      <title>직렬 통신 / 병렬 통신</title>
      <link>https://asdfg5661.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;직렬(Serial) 통신&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;하나의 통신선로 위에서 한번(한 CLOCK)에 비트 하나씩 연속해서 전송&lt;/li&gt;
&lt;li&gt;동시전송은 허용되지 않음.&lt;/li&gt;
&lt;li&gt;상대적으로 느리지만, 간단하고 장거리에 유용하며 가격도 저렴&lt;/li&gt;
&lt;li&gt;통신을 하려면 기본적으로 3개의 선이 필요, TxD(송신), RxD(수신), GND&lt;/li&gt;
&lt;li&gt;동기 통신
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2개의 디바이스 사이에서 동기를 취하고 그 타이밍에 따라 데이터를 송수신&lt;/li&gt;
&lt;li&gt;데이터의 교환이 없는 사이도 제어용의 신호가 흐르고 있으므로 상대와의 동기를 유지 가능&lt;/li&gt;
&lt;li&gt;실 데이터를 송신할 때는 그것을 수신하고 데이터가 없는 때에는 대기 상태를 나타내는 신호 교환&lt;/li&gt;
&lt;li&gt;이처럼 통신이 확립되면 실 데이터를 송수신한 것에 데이터의 시작과 종료를 나타내는 신호가 &lt;br /&gt;존재하지 않기 때문에 전송 속도는 빨라짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비동기 통신
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1바이트를 8개의 비트로 분리해서 한 번에 1비트씩 통신선로로 전송&lt;/li&gt;
&lt;li&gt;수신측에서는 통신선로를 통해 수신한 비트들을 조립해서 1바이트를 만들어내야 하는데&lt;br /&gt;이때 1바이트의 범위를 식별하기 위하여 사용하는 것이 start bit와 stop bit이다.&lt;/li&gt;
&lt;li&gt;start bit : 통신의 시작을 의미하며 한 비트 시간 길이 만큼 유지한다. 지금부터 정해진 약속에 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;따라 통신을 시작한다.&lt;/li&gt;
&lt;li&gt;parity bit : 오류 검증을 하기 위한 패리티 값을 생성하여 송신하고 수신쪽에 오류 판단한다.&lt;/li&gt;
&lt;li&gt;stop bit : 통신 종료를 알리며 세가지의 정해진 비트 만큼 유지해야 한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1, 1.5, 2비트로 해당 레지스터 설정에&amp;nbsp;따라 결정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kx2Bd/btsLQqkJjv9/RrgW1RlpHpBa2NytnU8blK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kx2Bd/btsLQqkJjv9/RrgW1RlpHpBa2NytnU8blK/img.png&quot; data-alt=&quot;직렬 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kx2Bd/btsLQqkJjv9/RrgW1RlpHpBa2NytnU8blK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkx2Bd%2FbtsLQqkJjv9%2FRrgW1RlpHpBa2NytnU8blK%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;533&quot; height=&quot;171&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직렬 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;병렬(Parallel) 통신&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;n비트의 데이터를 전송하기 위해 n개의 입출력 핀을 사용하는 방법&lt;/li&gt;
&lt;li&gt;일반적으로 컴퓨터내의 장치와 정보교환을 할 때는 통상적으로 고속의 통신속도를 필요로 하여&lt;br /&gt;한꺼번에 많은 정보를 처리할 수 있는 병렬통신 방식을 주로 쓴다.&lt;/li&gt;
&lt;li&gt;이는 대량의 정보를 빠른 시간에 한꺼번에 처리함으로써 컴퓨터의 성능을 향상 시킬 수가 있기 &lt;br /&gt;때문이며 이것은 데이터 비트 수로써 나타낸다.&lt;/li&gt;
&lt;li&gt;통신거리의 제한성, 구현상의 기술적인 어려움과 비용이 비싸다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUc5Mz/btsLQtaCavu/u0DlwLjZoO6tGwpmfv2vU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUc5Mz/btsLQtaCavu/u0DlwLjZoO6tGwpmfv2vU0/img.png&quot; data-alt=&quot;병렬 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUc5Mz/btsLQtaCavu/u0DlwLjZoO6tGwpmfv2vU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUc5Mz%2FbtsLQtaCavu%2Fu0DlwLjZoO6tGwpmfv2vU0%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;548&quot; height=&quot;223&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;병렬 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;RS232(Recommended Standard 232) 통신&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;직렬통신 방식 표준의 하나&lt;/li&gt;
&lt;li&gt;장비간 1대1 통신에서 사용&lt;/li&gt;
&lt;li&gt;컴퓨터를 센서 혹은 모뎀에 연결하거나 계측기와의 통신 등 여러 용도로 사용&lt;/li&gt;
&lt;li&gt;통신 거리 : 15m&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mbZeX/btsLP5uhwgJ/Q53zf2wPdUgws7mR7Ddsg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mbZeX/btsLP5uhwgJ/Q53zf2wPdUgws7mR7Ddsg1/img.png&quot; data-alt=&quot;RS232 9핀 커넥터의 번호&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mbZeX/btsLP5uhwgJ/Q53zf2wPdUgws7mR7Ddsg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmbZeX%2FbtsLP5uhwgJ%2FQ53zf2wPdUgws7mR7Ddsg1%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;354&quot; height=&quot;169&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RS232 9핀 커넥터의 번호&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 86.7442%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;핀 번호&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;데이터 방향&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;Pin 1&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;Input&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;DCD(Data Carrier Detect)&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;입력 포트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;Pin 2&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;Input&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;RxD(Receive Data)&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;데이터 수신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;Pin 3&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;Output&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;TxD(Transmit Data)&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;데이터 발신&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;Pin 4&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;Output&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;DTR(Data Terminal Ready)&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;데이터 단말 준비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;Pin 5&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;GND(Ground)&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;접지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;Pin 6&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;Input&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;DSR(Data Set Ready)&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;데이터 세트 준비&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;Pin 7&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;Output&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;RTS(Ready to Send)&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;발신 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;Pin 8&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;Input&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;CTS(Clear to Send)&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;발신 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 13.3721%; text-align: center;&quot;&gt;Pin 9&lt;/td&gt;
&lt;td style=&quot;width: 16.7441%; text-align: center;&quot;&gt;Input&lt;/td&gt;
&lt;td style=&quot;width: 31.8605%; text-align: center;&quot;&gt;RI(Ring Indicator)&lt;/td&gt;
&lt;td style=&quot;width: 24.7675%; text-align: center;&quot;&gt;링 표시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cp88bO/btsLQj6ZDkZ/KLjwrus6ds1c3VLS9vJGkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cp88bO/btsLQj6ZDkZ/KLjwrus6ds1c3VLS9vJGkk/img.png&quot; data-alt=&quot;RS232 결선 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cp88bO/btsLQj6ZDkZ/KLjwrus6ds1c3VLS9vJGkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcp88bO%2FbtsLQj6ZDkZ%2FKLjwrus6ds1c3VLS9vJGkk%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;356&quot; height=&quot;146&quot; data-origin-width=&quot;356&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RS232 결선 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/10</guid>
      <comments>https://asdfg5661.tistory.com/10#entry10comment</comments>
      <pubDate>Thu, 16 Jan 2025 17:32:40 +0900</pubDate>
    </item>
    <item>
      <title>OpenFileDialog / SaveFileDialog</title>
      <link>https://asdfg5661.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;OpenFileDialog&amp;nbsp;: 파일을 불러오기 위한 class&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;속성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FileName : OpenFileDialog을 부를 때 기본값으로 설정할 파일 이름&lt;/li&gt;
&lt;li&gt;InitialDirectory : OpenFileDialog을 부를 때 기본값으로 설정할 폴더경로&lt;/li&gt;
&lt;li&gt;Filter : 파일을 불러올 때 지정한 파일 확장자만 불러오기 위한 속성&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;지정 방식 : 필터설명|필터 옵션&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ex) (*.JPG)|*.JPG&lt;/li&gt;
&lt;li&gt;Title : OpenFileDialog을 부를 때 창 왼쪽 상단의 타이틀&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SaveFileDialog : 파일을 저장하기 위한 class&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;속성은 OpenFileDialog와 거의 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;예제&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737009106885&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Btn_ImageLoad_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFile = new OpenFileDialog())
            {
                openFile.Title = &quot;이미지 불러오기&quot;;
                openFile.Filter = &quot;(*.bmp)|*.bmp&quot;;
                if (openFile.ShowDialog() == DialogResult.OK)
                {
                    pictureBox1.Load(openFile.FileName);
                    pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
                    MessageBox.Show(&quot;이미지를 불러왔습니다.&quot;, &quot;Complete&quot;, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }

        private void Btn_ImageSave_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image != null)
            {
                using (SaveFileDialog saveFile = new SaveFileDialog())
                {
                    saveFile.Title = &quot;이미지 저장하기&quot;;
                    saveFile.Filter = &quot;(*.bmp)|*.bmp&quot;;
                    if (saveFile.ShowDialog() == DialogResult.OK)
                    {
                        string fileName = saveFile.FileName;
                        pictureBox1.Image.Save(fileName);
                        MessageBox.Show(&quot;이미지를 저장했습니다.&quot;, &quot;Complete&quot;, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Btn_ImageLoad버튼을 누르면 OpenFileDialog 클래스가 호출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Btn_ImageSave버튼을 누르면 SaveFileDialog 클래스가 호출된다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNKjC4/btsLPmXG0hR/Aj2MVUoMhN0kUKCcUBvByK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNKjC4/btsLPmXG0hR/Aj2MVUoMhN0kUKCcUBvByK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNKjC4/btsLPmXG0hR/Aj2MVUoMhN0kUKCcUBvByK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNKjC4%2FbtsLPmXG0hR%2FAj2MVUoMhN0kUKCcUBvByK%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;291&quot; height=&quot;314&quot; data-origin-width=&quot;291&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Form의 초기화면, 여기서 [이미지 불러오기] 버튼을 누르면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btEMyw/btsLOCtdI88/bnY77lgK8mBiE0ofB5f0AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btEMyw/btsLOCtdI88/bnY77lgK8mBiE0ofB5f0AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btEMyw/btsLOCtdI88/bnY77lgK8mBiE0ofB5f0AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtEMyw%2FbtsLOCtdI88%2FbnY77lgK8mBiE0ofB5f0AK%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;937&quot; height=&quot;529&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;529&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRaCmV/btsLP1FjnCl/t8h2nRKkEkNgX4rToi4f40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRaCmV/btsLP1FjnCl/t8h2nRKkEkNgX4rToi4f40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRaCmV/btsLP1FjnCl/t8h2nRKkEkNgX4rToi4f40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRaCmV%2FbtsLP1FjnCl%2Ft8h2nRKkEkNgX4rToi4f40%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;295&quot; height=&quot;319&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지를 선택하고 [열기] 버튼을 누르면 pictureBox에 이미지가 로드된다.&lt;br /&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AmQLd/btsLOB2aj3V/gzwvFYXLxkhXQXDuJf6XBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AmQLd/btsLOB2aj3V/gzwvFYXLxkhXQXDuJf6XBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AmQLd/btsLOB2aj3V/gzwvFYXLxkhXQXDuJf6XBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAmQLd%2FbtsLOB2aj3V%2FgzwvFYXLxkhXQXDuJf6XBk%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;532&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;532&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;바탕화면에 파일 이름을 dog로 지정하고 저장 버튼을 누르면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;92&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vQmLx/btsLPQYgqDd/X5coxvEKiLyrpslOYFZTXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vQmLx/btsLPQYgqDd/X5coxvEKiLyrpslOYFZTXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vQmLx/btsLPQYgqDd/X5coxvEKiLyrpslOYFZTXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvQmLx%2FbtsLPQYgqDd%2FX5coxvEKiLyrpslOYFZTXk%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;92&quot; height=&quot;96&quot; data-origin-width=&quot;92&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바탕화면에 이미지가 저장되었다.&lt;/p&gt;</description>
      <category>IT/C# Windows Form(.NET Framework)</category>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/9</guid>
      <comments>https://asdfg5661.tistory.com/9#entry9comment</comments>
      <pubDate>Thu, 16 Jan 2025 15:38:15 +0900</pubDate>
    </item>
    <item>
      <title>PictureBox</title>
      <link>https://asdfg5661.tistory.com/8</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;124&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVSei1/btsLOKdxSxd/bd4BNykNIkwvMJPdkT0bL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVSei1/btsLOKdxSxd/bd4BNykNIkwvMJPdkT0bL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVSei1/btsLOKdxSxd/bd4BNykNIkwvMJPdkT0bL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVSei1%2FbtsLOKdxSxd%2Fbd4BNykNIkwvMJPdkT0bL1%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;124&quot; height=&quot;49&quot; data-origin-width=&quot;124&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 pictureBox Control은 이미지나, 영상을 출력하게 해주는 Control이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;PictureBox의 속성&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.814%; height: 88px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 16.3755%; height: 20px; text-align: center;&quot;&gt;속성&lt;/td&gt;
&lt;td style=&quot;width: 84.4377%; height: 20px; text-align: center;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.3755%; height: 17px; text-align: center;&quot;&gt;Image&lt;/td&gt;
&lt;td style=&quot;width: 84.4377%; height: 17px; text-align: center;&quot;&gt;pictureBox에 출력할 이미지 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.3755%; height: 17px; text-align: center;&quot;&gt;BorderStyle&lt;/td&gt;
&lt;td style=&quot;width: 84.4377%; height: 17px; text-align: center;&quot;&gt;pictureBox의 테두리 형식 설정&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;None[default]&lt;/span&gt; : 테두리를 만들지 않는다&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;FixedSingle&lt;/span&gt; : 테두리를 만든다.&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Fixed3D&lt;/span&gt; : 3차원 모양의 테두리를 만든다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.3755%; height: 17px; text-align: center;&quot;&gt;Size&lt;/td&gt;
&lt;td style=&quot;width: 84.4377%; height: 17px; text-align: center;&quot;&gt;pictureBox의 이미지 크기를 설정한다.&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Width&lt;/span&gt; : 가로&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Height&lt;/span&gt; : 세로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 16.3755%; height: 17px; text-align: center;&quot;&gt;SizeMode&lt;/td&gt;
&lt;td style=&quot;width: 84.4377%; height: 17px; text-align: center;&quot;&gt;pictureBox의 이미지가 표시되는 방식을 나타낸다.&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Normal[default]&lt;/span&gt; : pictureBox의 크기만큼 이미지가 표시&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;StretchImage&lt;/span&gt; : 이미지를 확대/축소해서 pictureBox에 꽉 채워 표시&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;AutoSize&lt;/span&gt; : pictureBox의 크기를 이미지의 크기와 같게 표시&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;CenterImage&lt;/span&gt; : 이미지를 pictureBox의 중앙에 표시, &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;이미지의 크기는 기본크기&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;Zoom&lt;/span&gt; : pictureBox의 크기에 맞춰 이미지를 확대/축소해 표시.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StretchImage와는 다르게 이미지의 사이즈 비율은 보관 유지함.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QLatv/btsLOV0mJDY/A95NPCDCxKCUEYOKF4PxpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QLatv/btsLOV0mJDY/A95NPCDCxKCUEYOKF4PxpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QLatv/btsLOV0mJDY/A95NPCDCxKCUEYOKF4PxpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQLatv%2FbtsLOV0mJDY%2FA95NPCDCxKCUEYOKF4PxpK%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;1375&quot; height=&quot;700&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;SizeMode 속성을 이용한 pictureBox이미지&amp;gt;&lt;/p&gt;</description>
      <category>IT/C# Windows Form(.NET Framework)</category>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/8</guid>
      <comments>https://asdfg5661.tistory.com/8#entry8comment</comments>
      <pubDate>Thu, 16 Jan 2025 15:02:19 +0900</pubDate>
    </item>
    <item>
      <title>UserControl(사용자 정의 컨트롤)</title>
      <link>https://asdfg5661.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;UserControl&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Winform에서 기본적으로 제공하는 Control 외 사용자가 원하는 형태의 Control을 만들어서 사용 가능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사용 이유 : Code를 분리해서 가독성을 높여 줄 수 있음.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Control들의 재사용성이 뛰어남.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Delegate(델리게이트)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;delegate란?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대리자를 의미함.&lt;/li&gt;
&lt;li&gt;함수(메서드)를 참조하기 위한 데이터 형식(데이터형)&lt;/li&gt;
&lt;li&gt;즉, 델리게이트는 메서드를 참조하기 위한 데이터 형식&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;/li&gt;
&lt;li&gt;delegate 사용 이유
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI 관련 컴포넌트에 여러가지 함수를 직접 넣으면 로직이 꼬일 수 있음.&lt;/li&gt;
&lt;li&gt;사용하려는 함수가 수정 불가능할 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;delegate 사용 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;접근제한자 delegate 반환타입 대리자이름(매개변수)&lt;/h3&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;lt;delegate를 활용한 UserControl 화면 전환&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737002174410&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Windows.Forms;
using static Test.Form1;

namespace Test
{
    public partial class UserControl1 : UserControl
    {
        public delegate void ChangeUserControl_Event(int Tag);
        public ChangeUserControl_Event changeUserControl;

        public UserControl1()
        {
            InitializeComponent();  
        }

        private void ChangFrame_Click(object sender, EventArgs e)
        {
            changeUserControl(userControlTagNum.CONTROL2_TAG);
        }
    }
}&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;pre id=&quot;code_1737002716302&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Windows.Forms;
using static Test.Form1;

namespace Test
{
    public partial class UserControl2 : UserControl
    {
        public delegate void ChangeUserControl_Event(int Tag);
        public ChangeUserControl_Event changeUserControl;

        public UserControl2()
        {
            InitializeComponent();
        }

        private void ChangeFrame_Click(object sender, EventArgs e)
        {
            changeUserControl(userControlTagNum.CONTROL1_TAG);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자는 Form에서 UserControl로 화면 전환을 하는 것이 아닌, Form에 빈 panel을 만들어준 다음,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserControl1과 UserControl2의 화면 전환을 해볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 코드가 UserControl1, 하단 코드가 UserControl2 코드이다.&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;UserControl1과 UserControl2의 화면 전환을 위한 delegate를 선언해주고 각 UserControl의 버튼을 클릭하면&lt;br /&gt;Form에서 생성한 userControlTagNum에서 지정한 Tag를 받고 넘어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737002899458&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        UserControl1 userControl1;
        UserControl2 userControl2;

        public Form1()
        {
            InitializeComponent();

            userControl1 = new UserControl1();
            userControl2 = new UserControl2();

            userControl1.changeUserControl += Change;
            userControl2.changeUserControl += Change;
        }

        public class userControlTagNum
        {
            static public readonly int CONTROL1_TAG = 0;
            static public readonly int CONTROL2_TAG = 1;
        }

        public void Change(int Tag)
        {
            switch (Tag)
            {
                case 0: ChangeControl(userControl1); break;
                case 1: ChangeControl(userControl2); break;
            }
        }

        public void ChangeControl(Control userControl)
        {
            panel1.Controls.Clear();
            panel1.Controls.Add(userControl);
            userControl.Dock = DockStyle.Fill;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            panel1.Controls.Add(userControl1);
            userControl1.Size = panel1.Size;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Form1의 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserControl1과 UserControl2에서 선언해준 delegate를 Form1의 Change 메서드의 이벤트를 연결해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 얘기했던 것 처럼 delegate가 Change메서드의 기능을 해주며, Tag값을 받은대로 switch에서 해당 필드로 넘어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmsRSX/btsLOTusItF/RAq0C42lb3RHMEekzVKGA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmsRSX/btsLOTusItF/RAq0C42lb3RHMEekzVKGA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmsRSX/btsLOTusItF/RAq0C42lb3RHMEekzVKGA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmsRSX%2FbtsLOTusItF%2FRAq0C42lb3RHMEekzVKGA0%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;310&quot; height=&quot;306&quot; data-origin-width=&quot;310&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;userControl1의 화면에서 버튼을 누르면,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mf8jV/btsLO9RlGBl/ReGUUMq99iaECEioKL3mE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mf8jV/btsLO9RlGBl/ReGUUMq99iaECEioKL3mE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mf8jV/btsLO9RlGBl/ReGUUMq99iaECEioKL3mE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmf8jV%2FbtsLO9RlGBl%2FReGUUMq99iaECEioKL3mE0%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;305&quot; height=&quot;305&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;userControl2의 화면으로 넘어간다.&lt;/p&gt;</description>
      <category>IT/C# Windows Form(.NET Framework)</category>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/7</guid>
      <comments>https://asdfg5661.tistory.com/7#entry7comment</comments>
      <pubDate>Thu, 16 Jan 2025 13:52:42 +0900</pubDate>
    </item>
    <item>
      <title>#4 캡슐화 / 접근 제한자/ 프로퍼티</title>
      <link>https://asdfg5661.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;캡슐화(Encapsulation)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;class를 사용하여 데이터와 그 데이터를 다루는 코드를 하나로 묶는 것&lt;/li&gt;
&lt;li&gt;어떤 객체를 설명하기 위해 필드와 메서드를 안데 모아 정의하고 공개할 멤버와 공개하지 않을 멤버를 구분함.&lt;/li&gt;
&lt;li&gt;객체의 속성, 행위를 각각 하나로 묶어 정의하면 구분과 유지보수하기 쉬움.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1737011019770&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

namespace ConsoleApp1
{
    public class Circle
    {
        double pi = 3.14;

        double GetAreaOfCircle(double radius)
        {
            return radius * radius * pi;
        }

        public void PrintLog(double radius)
        {
            Console.WriteLine(GetAreaOfCircle(radius));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Circle circle = new Circle();
            circle.pi = 6.28;	 // 컴파일 오류 : 보호 수준 때문에 Circle.pi에 접근할 수 없습니다.
            circle.PrintLog(10); // 출력 결과 : 314
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멤버 변수 pi와 멤버 메서드 GetAreaOfCircle에는 public 접근 제한자가 명시돼 있지 않으므로 외부에서&lt;br /&gt;접근하려고 하면 컴파일 단계에서 오류가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;접근 제한자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근 제한자가 적용되는 곳은 클래스와 구조체, 인터페이스가 있고, 그것들의 멤버까지 허용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근 제한자가 명시되지 않은 경우에 기본적으로 갖게 되는 제한자가 정의 돼 있다.&lt;br /&gt;예를 들어, class 정의에서 접근 제한자를 생략한 경우 기본적으로 internal로 설정되는 반면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class 내부의 멤버에 대해서는 private로 설정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한,&amp;nbsp; 접근 제한자는 정보 은닉에 중요한 역할을 한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.1395%; text-align: center;&quot;&gt;private&lt;/td&gt;
&lt;td style=&quot;width: 81.8605%; text-align: center;&quot;&gt;내부에서만 접근 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.1395%; text-align: center;&quot;&gt;protected&lt;/td&gt;
&lt;td style=&quot;width: 81.8605%; text-align: center;&quot;&gt;내부에서의 접근과 함께 파생 클래스에서만 접근 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.1395%; text-align: center;&quot;&gt;public&lt;/td&gt;
&lt;td style=&quot;width: 81.8605%; text-align: center;&quot;&gt;내부 및 파생 클래스에서의 접근뿐만 아니라 외부에서도 접근을 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.1395%; text-align: center;&quot;&gt;internal&lt;/td&gt;
&lt;td style=&quot;width: 81.8605%; text-align: center;&quot;&gt;동일한 어셈블리 내에서는 public에 준한 접근을 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.1395%; text-align: center;&quot;&gt;internal protected&lt;/td&gt;
&lt;td style=&quot;width: 81.8605%; text-align: center;&quot;&gt;동일 어셈블리 내에서 정의 된 클래스이거나 다른 어셈블리라면 파생 클래스인 경우에 &lt;br /&gt;한해 접근을 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;프로퍼티(property)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접근자/설정자 메서드를 둬서 필드 접근에 대한 단일 창구를 제공하는 것은 바람직하지만 호출을 위한 메서드 정의를 일일이 코드로 작성하면 번거로울 것이다. 이 단점을 보완하기 위해 C#에서는 프로퍼티(property)가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1737011925345&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class 클래스명
{
    접근 제한자_타입_프로퍼티명
    {
    	접근 제한자 get
        {
        	//...코드...
            return 프로퍼티의 타입과 일치하는 유형의 표현식;
        }
        접근 제한자 set
        {
        	// value라는 문맥 키워드를 사용해 설정하려는 값을 표현
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 프로퍼티의 구조이다.&lt;/p&gt;
&lt;pre id=&quot;code_1737012371143&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

namespace ConsoleApp1
{
    public class Circle
    {
        double pi = 3.14;

        public double Pi
        {
            get { return pi; }
            set { pi = value; }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Circle circle = new Circle();
            circle.Pi = 3.14159;            // 쓰기
            double piValue = circle.Pi;     // 읽기
        }
    }
}&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;set의 value는 어디서 온 걸까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정자 메서드는 사용자가 전달하는 값을 매개변수명으로 구분할 수 있지만 프로퍼티 정의에서는 매개변수가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;없으므로 C# 컴파일러가 프로퍼티에 대입되는 값을 가리킬 수 없다는 문제가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 별도로 set 블록 내부에서만 사용할 수 있는 'value' 예약어가 도입됐다.&lt;/p&gt;</description>
      <category>IT/C#(.NET Framework)</category>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/6</guid>
      <comments>https://asdfg5661.tistory.com/6#entry6comment</comments>
      <pubDate>Thu, 16 Jan 2025 13:00:27 +0900</pubDate>
    </item>
    <item>
      <title>DLL(Dynamic Link Library)</title>
      <link>https://asdfg5661.tistory.com/4</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;라이브러리(Library)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;라이브러리란?&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수, 데이터, 타입 등 여러가지 프로그래밍 요소들의 집합이며 보통 lib 확장자를 가진다.&lt;/li&gt;
&lt;li&gt;자주 사용되는 표준적인 함수를 매번 직접 작성해서 사용하는 것은 지나치게 시간 소모적이므로 표준화할 수 있는 함수를 미리 만들어서 모아 놓은 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;라이브러리 장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 번 구축해 놓기만 하면 다시 만들 필요없이 불러서 사용할 수 있기에 개발 속도도 빨라지고 신뢰성 확보 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;STATIC LINK&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;.exe를 만드는 사람은 자신의 고유 코드만 .cpp에 작성하고 .lib와 연결하면 한글 입출력 기능을 가진 .exe 실행 파일을 만들 수 있음.&lt;/li&gt;
&lt;li&gt;.lib에 있는 함수와 데이터는 링커에 의해 실행 파일에 그대로 옮겨지면 실행 파일의 일부분이 됨.&lt;/li&gt;
&lt;li&gt;이런 전통적인 라이브러리 연결 방법을 정적 링크(Static Link)라고 하면 컴파일 시에 라이브러리에 코드를 실행파일에 복사함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;정적 링크와 동적 링크&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;정적 링크
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일 시에 함수가 실행 파일에 연결.&lt;/li&gt;
&lt;li&gt;실행 파일에 함수의 코드가 복사되기 때문에 실행 파일의 크기가 커지는 단점이 있지만 실행 파일은 완전한 단독 실행 파일이 된다.&lt;/li&gt;
&lt;li&gt;실행파일에 함수의 코드가 포함되어 있기 때문에 컴파일이 끝나면 .lib파일이 없어도 프로그램 실행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;동적 링크
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행시에 함수가 실행 파일에 연결된다.&lt;/li&gt;
&lt;li&gt;실행 파일에는 호출할 함수의 정보만 포함되고 실제 함수 코드는 복사되지 않으므로 실행 파일의 크기가 작아진다.&lt;/li&gt;
&lt;li&gt;하지만 실행 파일은 함수에 대한 정보만 가지고 있을 뿐 실제 코드를 가지고 있지는 않으므로 프로그램 실행시에 DLL이 꼭 있어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;DLL&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;DLL은 동적 링크를 사용한다.&lt;/li&gt;
&lt;li&gt;DLL의 장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 코드를 여러 프로그램이 동시에 사용하기 때문에 메모리가 절약된다.&lt;/li&gt;
&lt;li&gt;정적 링크를 사용하는 경우 실행 파일에 라이브러리의 함수가 모두 포함되어 실행파일이 커지지만 DLL을&amp;nbsp; &lt;br /&gt;사용하는 프로그램은 크기가 작다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;DLL을 교체하여 프로그램의 성능을 향상시키기 쉽다.&lt;/li&gt;
&lt;li&gt;리소스의 교체가 가능하다.&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT/C# Windows Form(.NET Framework)</category>
      <author>Byulpa</author>
      <guid isPermaLink="true">https://asdfg5661.tistory.com/4</guid>
      <comments>https://asdfg5661.tistory.com/4#entry4comment</comments>
      <pubDate>Thu, 16 Jan 2025 10:56:39 +0900</pubDate>
    </item>
  </channel>
</rss>