<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>프로그래밍 언어 및 기술 [언제나휴일]</title>
    <link>https://ehpro.tistory.com/</link>
    <description>프로그래밍 언어와 기술에 관하여 다루고 있습니다.
유튜브 동영상 강의를 통해 보다 학습하기 좋은 컨텐츠를 제공하고 있습니다.</description>
    <language>ko</language>
    <pubDate>Wed, 13 May 2026 10:59:02 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>언휴</managingEditor>
    <image>
      <title>프로그래밍 언어 및 기술 [언제나휴일]</title>
      <url>https://tistory1.daumcdn.net/tistory/6794452/attach/d2d51dec52b6462abb6f5d10f20cfc3f</url>
      <link>https://ehpro.tistory.com</link>
    </image>
    <item>
      <title>2. 3 요구 사항 및 유즈케이스 매핑</title>
      <link>https://ehpro.tistory.com/367</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요구 사항을 파악한 후에 유즈케이스 다이어그램을 작성하였으면 이 둘 간의 매핑 테이블을 만들어 보세요&lt;span&gt;. &lt;/span&gt;이를 통해 어떠한 요구 사항이 어느 유즈케이스에 반영했는지 파악하기 쉽고 반영하지 않은 요구 사항이 있는지 확인하기 쉬워집니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;하나의 요구 사항을 반영하는 여러 개의 유즈케이스가 있을 수 있고 여러 개의 요구 사항을 반영하는 하나의 유즈케이스가 있을 수 있습니다&lt;span&gt;. &lt;/span&gt;그리고 품질에 관한 요구 사항을 반영하는 특정 유즈케이스가 없을 수도 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&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;background-color: #bfbfbf;&quot; width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;요구명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;관련 &lt;span&gt;Usecase&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;웹 로봇&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;WebCollect&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;분석기&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Morphemepares&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;색인기&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;MakeInvertedFile&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;랭커&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Ranking&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;관리&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;SetInterval, Start, Stop, AddSeedSite&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;검색&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Search&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;결합성&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;품질 요구 사항임&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;재사용성&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;품질 요구 사항임&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;시스템화&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;GetInvertedFile, Ranking,GetPostedUrl, WebCollect, MakeInvertedFile&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;웹 로봇&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;WebCollect&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;분석기&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Morphemepares&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;76&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;색인기&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;408&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;MakeInvertedFile&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;표 &lt;span&gt;2.5] &lt;/span&gt;요구 사항 및 유즈케이스 매핑&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=0KEblYAqIdM&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cKeZFQ/hyX4vVGo5D/7S8jtRo4MQjGdcNLYLGcr1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/dxIAN5/hyX7Sobuq7/mXcR3J14LWM7CzqTK5chBk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Travel diary in Korea, Hyunchungsa A Tribute to Admiral Yi Sun-sin#Korean#A must-visit place#현충사#이순신&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/0KEblYAqIdM&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;현충사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%97%BC%EC%B9%98%EC%9D%8D%20%EB%B0%B1%EC%95%94%EB%A6%AC%20298-1&amp;amp;addtype=1&amp;amp;confirmid=23976998&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A507200%2C%22mapCenterY%22%3A918848%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A507201%2C%22y%22%3A918851%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%ED%98%84%EC%B6%A9%EC%82%AC%22%2C%22confirmid%22%3A23976998%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=507200&amp;amp;mapY=918848&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420025000&amp;amp;tel=041-539-4600&amp;amp;title=%ED%98%84%EC%B6%A9%EC%82%AC&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737869476600&quot; id=&quot;maps_1737869476600&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%97%BC%EC%B9%98%EC%9D%8D%20%EB%B0%B1%EC%95%94%EB%A6%AC%20298-1&amp;amp;addtype=1&amp;amp;confirmid=23976998&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A507200%2C%22mapCenterY%22%3A918848%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A507201%2C%22y%22%3A918851%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%ED%98%84%EC%B6%A9%EC%82%AC%22%2C%22confirmid%22%3A23976998%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=507200&amp;amp;mapY=918848&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420025000&amp;amp;tel=041-539-4600&amp;amp;title=%ED%98%84%EC%B6%A9%EC%82%AC&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=507200%2C918848&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A507201%2C918851&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>웹 검색 엔진 만들기</category>
      <category>현충사</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/367</guid>
      <comments>https://ehpro.tistory.com/367#entry367comment</comments>
      <pubDate>Sun, 26 Jan 2025 14:31:30 +0900</pubDate>
    </item>
    <item>
      <title>2. 2 유즈케이스 다이어그램</title>
      <link>https://ehpro.tistory.com/366</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;유즈케이스 다이어그램은 시스템에서 구현해야 할 기능을 개괄적으로 보여주기 위해서 수행합니다&lt;span&gt;. &lt;/span&gt;이를 통해 시스템이 처리해야 할 일과 외부에서 수행할 일을 결정하고 어떠한 사용자와 시스템과 상호 작용하는지를 결정합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;이를 위해 먼저 시스템과 상호 작용하는 사용자와 외부 시스템을 찾는 작업을 수행합니다&lt;span&gt;. &lt;/span&gt;유즈케이스 다이어그램에서는 시스템과 상호 작용하는 사용자와 외부 시스템을 액터라고 말합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 2.1] 액터.png&quot; data-origin-width=&quot;130&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9NTvp/btsL1F3haVt/zK6x424BnK7hw8wTUnKkd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9NTvp/btsL1F3haVt/zK6x424BnK7hw8wTUnKkd1/img.png&quot; data-alt=&quot;[ 그림&amp;amp;nbsp;2.1]&amp;amp;nbsp;액터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9NTvp/btsL1F3haVt/zK6x424BnK7hw8wTUnKkd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9NTvp%2FbtsL1F3haVt%2FzK6x424BnK7hw8wTUnKkd1%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;130&quot; height=&quot;117&quot; data-filename=&quot;[그림 2.1] 액터.png&quot; data-origin-width=&quot;130&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림&amp;nbsp;2.1]&amp;nbsp;액터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;그리고 액터가 어떨 때 우리 시스템을 사용하는지 우리 시스템이 언제 액터를 사용하는지를 결정합니다&lt;span&gt;. &lt;/span&gt;그리고 이를 유즈케이스로 나타냅니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 2.2] Usecase.png&quot; data-origin-width=&quot;160&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rArQS/btsL0DSQMGn/mQUWJ38uKRaVqo7HBd0Zk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rArQS/btsL0DSQMGn/mQUWJ38uKRaVqo7HBd0Zk0/img.png&quot; data-alt=&quot;[ 그림&amp;amp;nbsp;2.2] Usecase&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rArQS/btsL0DSQMGn/mQUWJ38uKRaVqo7HBd0Zk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrArQS%2FbtsL0DSQMGn%2FmQUWJ38uKRaVqo7HBd0Zk0%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;160&quot; height=&quot;83&quot; data-filename=&quot;[그림 2.2] Usecase.png&quot; data-origin-width=&quot;160&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림&amp;nbsp;2.2] Usecase&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Usecase &lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;다이어그램은 액터와 &lt;span&gt;Usecase, &lt;/span&gt;관계를 표현합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;2.2.1 액터 개요&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #363636; font-size: 16px; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;액터는 시스템과 상호 작용하는 사용자와 외부 시스템을 말합니다&lt;span&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;EH WSE&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;를 사용하는 액터에는 최종 사용자&lt;span&gt;(End User)&lt;/span&gt;와 관리자&lt;span&gt;(Manager)&lt;/span&gt;가 있습니다&lt;span&gt;. &lt;/span&gt;그리고 외부 시스템에는 &lt;span&gt;DBMS&lt;/span&gt;가 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 2.3] 액터 개요.png&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EsavQ/btsL0Vy5bww/sHZz0VSwFxTYipP8mrCnl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EsavQ/btsL0Vy5bww/sHZz0VSwFxTYipP8mrCnl0/img.png&quot; data-alt=&quot;[ 그림&amp;amp;nbsp;2.3]&amp;amp;nbsp;액터 개요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EsavQ/btsL0Vy5bww/sHZz0VSwFxTYipP8mrCnl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEsavQ%2FbtsL0Vy5bww%2FsHZz0VSwFxTYipP8mrCnl0%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;268&quot; height=&quot;117&quot; data-filename=&quot;[그림 2.3] 액터 개요.png&quot; data-origin-width=&quot;268&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림&amp;nbsp;2.3]&amp;nbsp;액터 개요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;background-color: #bfbfbf;&quot; width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;번호&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;액터 이름&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;End User&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;검색 서비스를 사용하는 사용자&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Manager&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;검색 서비스 테스트 및 웹 수집 로봇 설정 및 모니텅링을 수행하는 관리자&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;DBMS&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;솔루션의&lt;span&gt; DB&lt;/span&gt;를 관리하는 시스템&lt;span&gt;(MS SQL)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;표&lt;span&gt; 2.2] &lt;/span&gt;액터&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&amp;nbsp;2.2.2 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;유즈케이스 다이어그램&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;먼저 최종 사용자와 상호 작용에 관한 유즈케이스 다이어그램을 작성합시다&lt;span&gt;. &lt;/span&gt;최종 사용자는 검색할 때만 &lt;span&gt;EH WSE&lt;/span&gt;와 상호 작용합니다&lt;span&gt;. &lt;/span&gt;검색 요청하면 내부 시스템에서는 검색 질의를 형태소로 분리하는 작업을 수행합니다&lt;span&gt;(MorphemeParse). &lt;/span&gt;그리고 색인 데이터에서 질의 요소를 포함하는 웹 페이지 정보를 얻어옵니다&lt;span&gt;(GetInvertedFile). &lt;/span&gt;검색 정보를 순위화하고&lt;span&gt;(Ranking) &lt;/span&gt;수집한 페이지의 정보를 보여줍니다&lt;span&gt;(GetPostedUrl). &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 2.4] End User와 상호 작용.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qBk61/btsL02qWAaE/BK9PQNJbHke8mxKuOdCCHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qBk61/btsL02qWAaE/BK9PQNJbHke8mxKuOdCCHk/img.png&quot; data-alt=&quot;[ 그림 2.4] End User와 상호 작용 usecase 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qBk61/btsL02qWAaE/BK9PQNJbHke8mxKuOdCCHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqBk61%2FbtsL02qWAaE%2FBK9PQNJbHke8mxKuOdCCHk%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;623&quot; height=&quot;316&quot; data-filename=&quot;[그림 2.4] End User와 상호 작용.png&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 2.4] End User와 상호 작용 usecase 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;background-color: #bfbfbf;&quot; width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;번호&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;유즈케이스 이름&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Search&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;검색&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;MorphemeParser&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;형태소 분석&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;GetInvertedFile&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;역 파일 생성&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Ranking&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;순위 부여&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;GetPostedUrl&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;302&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;수집한 결과 페이지 얻어오기&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;표&lt;span&gt; 2.3] End User&lt;/span&gt;와 상호 작용하는&lt;span&gt; Usecase&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;관리자는 최종 사용자처럼 검색할 수 있습니다&lt;span&gt;. &lt;/span&gt;그리고 이 외에도 &lt;span&gt;Seed &lt;/span&gt;사이트 주소를 추가&lt;span&gt;(AddSeedSite)&lt;/span&gt;하거나 수집 주기를 설정&lt;span&gt;(SetInterval), &lt;/span&gt;웹 로봇이 수집하는 것을 가동시키거나&lt;span&gt;(Start) &lt;/span&gt;멈추게 하고&lt;span&gt;(Stop) &lt;/span&gt;수집해야 할 사이트를 확인&lt;span&gt;(NeedGetUrls), &lt;/span&gt;수집한 색인 데이터를 확인&lt;span&gt;(GetMorphemes)&lt;/span&gt;합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;관리자가 웹 수집을 가동하면 주기적으로 웹 페이지를 수집&lt;span&gt;(WebCollect)&lt;/span&gt;합니다&lt;span&gt;. &lt;/span&gt;그리고 수집한 웹 페이지의 내용을 분석&lt;span&gt;(MorphemeParse)&lt;/span&gt;하고 색인 데이터를 만드는 작업을 수행합니다&lt;span&gt;(MakeInvertedFile).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 2.5] Manager와 상호 작용.png&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TZfXT/btsL1eZqpNC/tvViOtgmwkxiHGNKkQDYMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TZfXT/btsL1eZqpNC/tvViOtgmwkxiHGNKkQDYMk/img.png&quot; data-alt=&quot;[ 그림 2.5] Manager와 상호 작용 usecase 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TZfXT/btsL1eZqpNC/tvViOtgmwkxiHGNKkQDYMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTZfXT%2FbtsL1eZqpNC%2FtvViOtgmwkxiHGNKkQDYMk%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;375&quot; data-filename=&quot;[그림 2.5] Manager와 상호 작용.png&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 2.5] Manager와 상호 작용 usecase 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;참고로 특정 &lt;span&gt;Usecase&lt;/span&gt;를 수행하면서 반드시 수행해야 하는 &lt;span&gt;Usecase&lt;/span&gt;는 &lt;span&gt;&amp;lt;&amp;lt;include&amp;gt;&amp;gt; &lt;/span&gt;스테레오 관계로 표시하며 선택적으로 수행할 때는 &lt;span&gt;&amp;lt;&amp;lt;extend&amp;gt;&amp;gt; &lt;/span&gt;스테레오 관계로 표시합니다&lt;span&gt;. &amp;lt;&amp;lt;include&amp;gt;&amp;gt; &lt;/span&gt;스테레오는 반드시 수행해야 하는 &lt;span&gt;Usecase&lt;/span&gt;로 화살표 방향을 표시하며 &lt;span&gt;&amp;lt;&amp;lt;extend&amp;gt;&amp;gt; &lt;/span&gt;스테레오는 선택적으로 수행하는 &lt;span&gt;Usecase&lt;/span&gt;에서 시작하는 방향으로 표시합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;표 2.4]는 Usecase별로 어떠한 역할을 수행하는지와 관련 액터 및 상호 작용 방향을 표로 정리한 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;이와 같이 작업한 내용을 파악하기 쉽게 문서로 작성해 놓으면 효과적으로 관리할 수 있습니다&lt;span&gt;. &lt;/span&gt;프로젝트의 종류와 목적에 따라 어느 수준으로 회의와 문서화&lt;span&gt;, &lt;/span&gt;개발 방법론 적용이 다를 수 있는데 중요한 것은 모든 작업이 개발에 득이 되는 수준으로 행해야 한다는 것입니다&lt;span&gt;. &lt;/span&gt;그 어떠한 작업도 많이 하면 독이 되고 부족하면 품질 수준 저하 및 전체 개발 비용이 많아질 수 있습니다&lt;span&gt;. &lt;/span&gt;어느 수준으로 적용해야 최소 비용으로 최대 품질의 서비스를 제공할 수 있을지 고민하고 상황에 맞는 개발 방법론을 판단할 수 있는 능력을 키우셔야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&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;background-color: #bfbfbf;&quot; width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Usecase &lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;관련 액터 및 방향&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Search&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;검색 요청&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;EndUser(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Manager(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;GetInvertedFile&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;역 파일 요청&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)DBMS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Ranking&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;검색 결과 순위 부여&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)DBMS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;GetPostedUrl&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;수집한 웹 페이지 요청&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)DBMS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;AddSeedSite&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Seed &lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;사이트 추가&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Manager(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;SetInterval&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;수집 주기 설정&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Manager(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Start&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;웹 수집기 가동&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Manager(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Stop&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;웹 수집기 멈춤&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Manager(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;NeetGetUrls&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;수집 후보&lt;span&gt; Url&lt;/span&gt;들을 요청&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Manager(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;GetMorphemes&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;모든 형태소 요청&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Manager(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;WebCollect&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;웹 수집&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)DBMS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;MorpemeParse&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;형태소 분석&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;MakeInvertedFile&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;198&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;역 파일 생성&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;153&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;rarr;&lt;span&gt;)DBMS&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;표 &lt;span&gt;2.4] Usecase &lt;/span&gt;리스트&lt;/span&gt; &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/shorts/U5tkq-d9Lcw&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bzkZcz/hyX7WKLLxW/dFFzeOVYDvUzqRlyhxBetK/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720,https://scrap.kakaocdn.net/dn/c6P4Gz/hyX4kfs4vL/vfQVnjT159ITL7ZXEwdEhk/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720&quot; data-video-width=&quot;405&quot; data-video-height=&quot;720&quot; data-video-origin-width=&quot;405&quot; data-video-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Everland Panda World! Mama Aibao and Twins Rui and Hui [January 22, 2025] #에버랜드#판다월드#아이바오#루이바오#&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/U5tkq-d9Lcw&quot; width=&quot;405&quot; height=&quot;720&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;에버랜드 판다월드, 엄마 아이바오와 쌍둥이 루이와 후이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EA%B2%BD%EA%B8%B0%20%EC%9A%A9%EC%9D%B8%EC%8B%9C%20%EC%B2%98%EC%9D%B8%EA%B5%AC%20%ED%8F%AC%EA%B3%A1%EC%9D%8D%20%EC%A0%84%EB%8C%80%EB%A6%AC%20519-19&amp;amp;addtype=1&amp;amp;confirmid=17573502&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A544960%2C%22mapCenterY%22%3A1053898%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A544960%2C%22y%22%3A1053900%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C%22%2C%22confirmid%22%3A17573502%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=544960&amp;amp;mapY=1053898&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4146125000&amp;amp;tel=&amp;amp;title=%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737770355283&quot; id=&quot;maps_1737770355283&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EA%B2%BD%EA%B8%B0%20%EC%9A%A9%EC%9D%B8%EC%8B%9C%20%EC%B2%98%EC%9D%B8%EA%B5%AC%20%ED%8F%AC%EA%B3%A1%EC%9D%8D%20%EC%A0%84%EB%8C%80%EB%A6%AC%20519-19&amp;amp;addtype=1&amp;amp;confirmid=17573502&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A544960%2C%22mapCenterY%22%3A1053898%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A544960%2C%22y%22%3A1053900%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C%22%2C%22confirmid%22%3A17573502%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=544960&amp;amp;mapY=1053898&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4146125000&amp;amp;tel=&amp;amp;title=%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=544960%2C1053898&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A544960%2C1053900&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>Usecase</category>
      <category>usecase 다이어그램</category>
      <category>루이바우</category>
      <category>아이바우</category>
      <category>액터</category>
      <category>에버랜드 판다월드</category>
      <category>웹 검색 엔진 만들기</category>
      <category>후이바우</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/366</guid>
      <comments>https://ehpro.tistory.com/366#entry366comment</comments>
      <pubDate>Sat, 25 Jan 2025 10:59:52 +0900</pubDate>
    </item>
    <item>
      <title>2. 요구 분석 및 정의 2.1 요구 리스트</title>
      <link>https://ehpro.tistory.com/365</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요구 분석 및 정의 단계에서는 시스템에서 제공해야 할 비지니스와 이해관계자의 요구 사항을 정확히 이해하는 작업이 필요합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;이를 위해 이해관계자의 요구 사항을 수집하고 이해해야 합니다&lt;span&gt;. &lt;/span&gt;그리고 수집한 요구사항을 바탕으로 시스템에서 제공해야 할 기능을 개괄적으로 파악하고 결정해야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;이 책에서는 어떠한 이해관계자가 있는지에 관한 조사와 이를 통해 요구 사항을 수집하는 부분은 간단히 요구 리스트를 보여주는 것으로 끝낼 것입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;대신 요구 리스트를 바탕으로 시스템에서 제공해야 할 기능을 파악하고 결정하기 위해서 &lt;span&gt;Usecase &lt;/span&gt;다이어그램을 작성하고 요구 사항과 &lt;span&gt;Usecase &lt;/span&gt;매핑 테이블을 작성하기로 할게요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;2.1 요구리스트&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&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;background-color: #bfbfbf;&quot; width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;요구명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;구분&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;웹 로봇&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;웹 페이지를 수집할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;기능&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;분석기&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;수집된 웹 페이지를 분석할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;기능&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;색인기&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;분석된 요소별로 색인을 만들 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;기능&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;랭커&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;질의에 해당하는 웹 페이지를 &lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;TF-IDF &lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;방식에 의거하여 랭킹합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;기능&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;관리&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;웹 검색 엔진을 설정 및 구동을 제어할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;기능&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;검색&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;웹 검색을 요청할 수 있고 검색된 결과를 순위화 하여 보여주어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;기능&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;결합성&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;각 엔진은 분리해야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;품질&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;재사용성&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;공통적인 형식은 라이브러리화 하여야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;품질&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;85&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;시스템화&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;321&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;각 엔진에 의한 결과들은&lt;span&gt; DBMS&lt;/span&gt;에 의해 관리해야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;77&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;기능&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;품질&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #363636;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;표 &lt;span&gt;2.1] &lt;/span&gt;요구 리스트&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=0KEblYAqIdM&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/c0guCu/hyX7YIzHZq/rPUbuCIVygP0BQ2RqNHAeK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cEXBtW/hyX7SuPjQU/M8cAmkPEwghcdo0HgLL1bK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Travel diary in Korea, Hyunchungsa A Tribute to Admiral Yi Sun-sin#Korean#A must-visit place#현충사#이순신&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/0KEblYAqIdM&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;현충사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%97%BC%EC%B9%98%EC%9D%8D%20%EB%B0%B1%EC%95%94%EB%A6%AC%20298-1&amp;amp;addtype=1&amp;amp;confirmid=23976998&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A507200%2C%22mapCenterY%22%3A918848%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A507201%2C%22y%22%3A918851%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%ED%98%84%EC%B6%A9%EC%82%AC%22%2C%22confirmid%22%3A23976998%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=507200&amp;amp;mapY=918848&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420025000&amp;amp;tel=041-539-4600&amp;amp;title=%ED%98%84%EC%B6%A9%EC%82%AC&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737770097148&quot; id=&quot;maps_1737770097148&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%97%BC%EC%B9%98%EC%9D%8D%20%EB%B0%B1%EC%95%94%EB%A6%AC%20298-1&amp;amp;addtype=1&amp;amp;confirmid=23976998&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A507200%2C%22mapCenterY%22%3A918848%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A507201%2C%22y%22%3A918851%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%ED%98%84%EC%B6%A9%EC%82%AC%22%2C%22confirmid%22%3A23976998%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=507200&amp;amp;mapY=918848&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420025000&amp;amp;tel=041-539-4600&amp;amp;title=%ED%98%84%EC%B6%A9%EC%82%AC&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=507200%2C918848&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A507201%2C918851&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>요구리스트</category>
      <category>요구분석</category>
      <category>웹 검색 엔진 만들기</category>
      <category>현충사</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/365</guid>
      <comments>https://ehpro.tistory.com/365#entry365comment</comments>
      <pubDate>Sat, 25 Jan 2025 10:55:19 +0900</pubDate>
    </item>
    <item>
      <title>1. 7 .NET 리모팅</title>
      <link>https://ehpro.tistory.com/364</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;.NET &lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;리모팅 기술은 서버 측에 있는 개체를 클라이언트 측에서 마치 자신에게 있는 개체를 사용하는 것처럼 사용할 수 있게 서비스를 하는 기술입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;.NET &lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;리모팅 서비스를 위해서는 서비스를 제공하는 서버와 서비스를 제공받는 클라이언트가 필요하며 서버 측에서 클라이언트에 제공하는 개체를 정의한 클래스 라이브러리가 필요합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;서버 측에서 클라이언트에 제공하는 개체는&lt;span&gt; MashalByReference&lt;/span&gt;에서 파생한 개체로 원격 개체라고 말합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;서버 측에서는 채널을 등록하여 원격 개체를 사용할 수 있게 등록합니다&lt;span&gt;. &lt;/span&gt;클라이언트 측에서는 서버 측 채널에 접근하여 원격 개체를 참조하여 사용하는데 클라이언트 측에서 원격 개체를 참조하여 사용할 수 있는 개체를&lt;span&gt; Proxy &lt;/span&gt;개체라 부릅니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;클라이언트 측에서&lt;span&gt; Proxy &lt;/span&gt;개체를 통해 메서드를 호출하면 포멧터를 통해 메서드 이름과 인자 등을&lt;span&gt; Masharing&lt;/span&gt;하여 서버 측에 전달하면 서버 측의&lt;span&gt; Stub&lt;/span&gt;에서 이를 수신하여 실제 개체인 원격 개체를 제어합니다&lt;span&gt;. &lt;/span&gt;그리고 결과를 같은 방법으로 서버 측의&lt;span&gt; Stub&lt;/span&gt;에서 클라이언트 측의&lt;span&gt; Proxy &lt;/span&gt;개체에게 전송하고&lt;span&gt; Proxy&lt;/span&gt;개체는 수신한 정보로 결과를 반환하는 원리입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.28] .NET 리모팅 구조.png&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y97AW/btsLWxLa5Xr/CKWM1MlDC6JfH0OM1TUjr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y97AW/btsLWxLa5Xr/CKWM1MlDC6JfH0OM1TUjr0/img.png&quot; data-alt=&quot;[그림] .NET 리모팅 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y97AW/btsLWxLa5Xr/CKWM1MlDC6JfH0OM1TUjr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy97AW%2FbtsLWxLa5Xr%2FCKWM1MlDC6JfH0OM1TUjr0%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;398&quot; height=&quot;255&quot; data-filename=&quot;[그림 1.28] .NET 리모팅 구조.png&quot; data-origin-width=&quot;398&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림] .NET 리모팅 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;간단하게&lt;span&gt; .NET &lt;/span&gt;리모팅 서비스를 구축하고 이를 사용하는 클라이언트를 구현해 봅시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;여기에서 실습할 내용은&lt;span&gt; 0~9 &lt;/span&gt;사이의 숫자를 입력받으면 이를&lt;span&gt; &quot;one&quot;~&quot;nine&quot;&lt;/span&gt;으로 변환하는 서비스를 제공하는 것으로 할게요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&amp;nbsp;1.7.1 &lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;공통 라이브러리 제작&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;먼저 클래스 라이브러리 형태의 프로젝트를 생성합니다&lt;span&gt;. &lt;/span&gt;그리고 기본으로 제공하는 소스 파일명을&lt;span&gt; NumToEng.cs&lt;/span&gt;로 변경하세요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;.NET &lt;/span&gt;&lt;span&gt;리모팅으로 클라이언트에서 참조하여 사용하기 위해서는&lt;span&gt; MashalByRefObject&lt;/span&gt;를 기반으로 파생 클래스를 정의해야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537738764&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class NumToEng:MarshalByRefObject
{

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변환에서 반환할 문자열을 담을 배열을 선언 및 초기화합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537747902&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string[] warr = new string[] {  &quot;zero&quot;,&quot;one&quot;,&quot;two&quot;,&quot;three&quot;,&quot;four&quot;,&quot;five&quot;,&quot;six&quot;,&quot;seven&quot;,&quot;eight&quot;,&quot;nine&quot;  };&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고&lt;span&gt; 0~9 &lt;/span&gt;사이의 정수를 입력받아 영어로 변환한 문자열을 반환하는 메서드를 추가합시다&lt;span&gt;. &lt;/span&gt;동작 흐름을 파악하기 위해 의도적으로 콘솔에 출력하는 구문을 넣었습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537768993&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public string Convert(int num)
{
    Console.WriteLine(&quot;NumToEng 개체의 Convert 메서드 :{0} 받음&quot;, num);
    if ((num &amp;gt;= 0) &amp;amp;&amp;amp; (num &amp;lt;= 9))
    {
        return warr[num];
    }
    return &quot;none&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶ &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;NumToEng&lt;/span&gt;&lt;span&gt;.cs&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537779909&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
 
namespace NumToEngLib
{
    /// &amp;lt;summary&amp;gt;
    /// 변환기(0~9 사이의 정수를 영어로)
    /// &amp;lt;/summary&amp;gt;
    public class NumToEng:MarshalByRefObject
    {
        string[] warr = new string[]
        {
            &quot;zero&quot;,&quot;one&quot;,&quot;two&quot;,&quot;three&quot;,&quot;four&quot;,&quot;five&quot;,&quot;six&quot;,&quot;seven&quot;,&quot;eight&quot;,&quot;nine&quot;
        };
        /// &amp;lt;summary&amp;gt;
        /// 변환 메서드
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&quot;num&quot;&amp;gt;0~9 사이의 정수&amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt;변환한 문자열&amp;lt;/returns&amp;gt;
        public string Convert(int num)
        {
            Console.WriteLine(&quot;NumToEng 개체의 Convert 메서드 :{0} 받음&quot;, num);
            if ((num &amp;gt;= 0) &amp;amp;&amp;amp; (num &amp;lt;= 9))
            {
                return warr[num];
            }
            return &quot;none&quot;;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.7.2 서버 예광탄 제작&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그리고 서버를 구축하기 위해 콘솔 응용 프로그램 형태의 서버 예광탄 프로젝트를 추가하세요&lt;span&gt;. &lt;/span&gt;여기에서는&lt;span&gt; .NET &lt;/span&gt;리모팅을 소개하는 것을 목적으로 콘솔 응용 프로그램 형태로 제작할게요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;.NET &lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;리모팅 서버를 구축하려면&lt;span&gt; System.Runtime.Remoting &lt;/span&gt;어셈블리를 참조 추가해야 합니다&lt;span&gt;. &lt;/span&gt;그리고 앞에서 만든&lt;span&gt; NumToEngLib&lt;/span&gt;를 참조 추가하세요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;서버 측에서는 클라이언트에서 연결할 수 있는 채널을 등록합니다&lt;span&gt;. TCP &lt;/span&gt;채널과&lt;span&gt; HTTP &lt;/span&gt;채널을 사용할 수 있는데 여기에서는 방화벽에 친숙한&lt;span&gt; HTTP &lt;/span&gt;채널을 생성하여 등록할게요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537820379&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HttpChannel hc = new HttpChannel(16000);
ChannelServices.RegisterChannel(hc, false);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 클라이언트에서 원격으로 참조할 수 있는 개체 형식을 등록합니다&lt;span&gt;. &lt;/span&gt;등록할 수 있는 서비스 종류는 여러 가지가 있는데 여기에서는 서버 측 활성화 개체로 단일개체 모드로 등록할게요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537830368&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;RemotingConfiguration.RegisterWellKnownServiceType(
           typeof(NumToEng),
            &quot;MySvc&quot;,
            WellKnownObjectMode.Singleton
            );&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;프로세스가 키를 누를 때까지 종료하지 않고 대기할 수 있게 합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537837920&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Console.ReadKey();&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶ &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Program&lt;/span&gt;&lt;span&gt;.cs&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537858061&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.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;
using NumToEngLib;
 
namespace 서버_예광탄
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpChannel hc = new HttpChannel(16000);
            ChannelServices.RegisterChannel(hc, false);
 
            RemotingConfiguration.RegisterWellKnownServiceType(
                typeof(NumToEng),
                &quot;MySvc&quot;,
                WellKnownObjectMode.Singleton
                ); 
 
            Console.ReadKey();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;1.7.3 클라이언트 제작&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;.NET &lt;/span&gt;&lt;span style=&quot;color: #262626;&quot;&gt;리모팅 서비스를 사용하는 클라이언트를 만듭시다&lt;span&gt;. &lt;/span&gt;클라이언트는&lt;span&gt; Windows Forms &lt;/span&gt;형태의 응용 프로그램을 작성합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.29] 클라이언트 메인 폼 컨트롤 배치.png&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pmXio/btsLWs381Py/Minwj3pfkY9fYgsjdz9wRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pmXio/btsLWs381Py/Minwj3pfkY9fYgsjdz9wRK/img.png&quot; data-alt=&quot;[그림] 클라이언트 메인 폼 컨트롤 배치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pmXio/btsLWs381Py/Minwj3pfkY9fYgsjdz9wRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpmXio%2FbtsLWs381Py%2FMinwj3pfkY9fYgsjdz9wRK%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;297&quot; height=&quot;175&quot; data-filename=&quot;[그림 1.29] 클라이언트 메인 폼 컨트롤 배치.png&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림] 클라이언트 메인 폼 컨트롤 배치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;background-color: #bfbfbf;&quot; width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;번호&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 이름&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 유형&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;nud&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;NumericUpDown&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정수 선택&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;btn_convert&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;변환 명령&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_digit&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정수를 변환한 문자열&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;표&lt;span&gt; 1.5] &lt;/span&gt;클라이언트 메인 폼의 자식 컨트롤&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;.NET &lt;/span&gt;&lt;span&gt;리모팅 서비스를 사용하는 클라이언트도&lt;span&gt; System.Runtime.Remoting &lt;/span&gt;어셈블리와 공용 라이브러리인&lt;span&gt; NumToEngLib &lt;/span&gt;어셈블리를 참조 추가해야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;메인 폼의&lt;span&gt; Load &lt;/span&gt;이벤트 핸들러를 추가하여 채널 생성 및 등록합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537911384&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void MainForm_Load(object sender, EventArgs e)
{
    HttpChannel hc = new HttpChannel();
    ChannelServices.RegisterChannel(hc, false);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;변환 버튼의&lt;span&gt; Click &lt;/span&gt;이벤트 핸들러를 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537923431&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void btn_convert_Click(object sender, EventArgs e)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이벤트 핸들러에서는 원격 서버로부터 원격 개체를 참조합니다&lt;span&gt;. &lt;/span&gt;이 때&lt;span&gt; Activator &lt;/span&gt;클래스의 정적 메서드&lt;span&gt; GetObject&lt;/span&gt;를 이용합니다&lt;span&gt;. &lt;/span&gt;클라이언트 측에서 참조한 개체는 실제 개체가 아닌 원격 개체의&lt;span&gt; Proxy &lt;/span&gt;개체입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537935164&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NumToEng nte = Activator.GetObject(
        typeof(NumToEng),
        &quot;http://[서버 IP]:16000/MySvc&quot;)
        as NumToEng;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그리고 원격 개체를 참조한&lt;span&gt; nte&lt;/span&gt;의&lt;span&gt; Convert &lt;/span&gt;메서드를 호출하여 결과를 레이블의&lt;span&gt; Text &lt;/span&gt;속성을 지정합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537940856&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lb_digit.Text = nte.Convert((int)nud.Value);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 빌드한 후에 서버를 실행하고 클라이언트를 실행하여 테스트 하면 다음과 같이 동작함을 알 수 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.30] 시연 화면.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbfaBN/btsLW5HmwnF/OdJtSHtqbKVPEneO5kcRTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbfaBN/btsLW5HmwnF/OdJtSHtqbKVPEneO5kcRTK/img.png&quot; data-alt=&quot;[그림] 시연 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbfaBN/btsLW5HmwnF/OdJtSHtqbKVPEneO5kcRTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbfaBN%2FbtsLW5HmwnF%2FOdJtSHtqbKVPEneO5kcRTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;219&quot; data-filename=&quot;[그림 1.30] 시연 화면.png&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;219&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;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;시연 화면을 보면 알 수 있듯이 서버 측의 원격 개체의&lt;span&gt; Convert &lt;/span&gt;메서드가 동작함을 알 수 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;▶ &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MainForm&lt;/span&gt;&lt;span&gt;.cs&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737537981388&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 System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using NumToEngLib;
 
namespace 클라이언트_예광탄
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        private void btn_convert_Click(object sender, EventArgs e)
        {
            NumToEng nte = Activator.GetObject(
                typeof(NumToEng),
                &quot;http:// [서버 IP]:16000/MySvc&quot;)
                as NumToEng;
            lb_digit.Text = nte.Convert((int)nud.Value);
        } 
        private void MainForm_Load(object sender, EventArgs e)
        {
            HttpChannel hc = new HttpChannel();
            ChannelServices.RegisterChannel(hc, false);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/shorts/jMa4qFHkkuU&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bF7JuY/hyX4qlWova/fFP5q0XfKxciMLwUGTJWTk/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720,https://scrap.kakaocdn.net/dn/bgiHOO/hyX4k0mjtN/kO6dxJ1RVSdcuGgeF34fl0/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720&quot; data-video-width=&quot;405&quot; data-video-height=&quot;720&quot; data-video-origin-width=&quot;405&quot; data-video-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Everland Panda World, Le Bao's Food Adventure! [January 22, 2025] #에버랜드 판다월드#러바우#먹방&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/jMa4qFHkkuU&quot; width=&quot;405&quot; height=&quot;720&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;에버랜드 판다월드, 러바우버랜드 판다월드, 러바우 먹방&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EA%B2%BD%EA%B8%B0%20%EC%9A%A9%EC%9D%B8%EC%8B%9C%20%EC%B2%98%EC%9D%B8%EA%B5%AC%20%ED%8F%AC%EA%B3%A1%EC%9D%8D%20%EC%A0%84%EB%8C%80%EB%A6%AC%20519-19&amp;amp;addtype=1&amp;amp;confirmid=17573502&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A544960%2C%22mapCenterY%22%3A1053898%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A544960%2C%22y%22%3A1053900%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C%22%2C%22confirmid%22%3A17573502%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=544960&amp;amp;mapY=1053898&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4146125000&amp;amp;tel=&amp;amp;title=%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737538112145&quot; id=&quot;maps_1737538112145&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EA%B2%BD%EA%B8%B0%20%EC%9A%A9%EC%9D%B8%EC%8B%9C%20%EC%B2%98%EC%9D%B8%EA%B5%AC%20%ED%8F%AC%EA%B3%A1%EC%9D%8D%20%EC%A0%84%EB%8C%80%EB%A6%AC%20519-19&amp;amp;addtype=1&amp;amp;confirmid=17573502&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A544960%2C%22mapCenterY%22%3A1053898%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A544960%2C%22y%22%3A1053900%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C%22%2C%22confirmid%22%3A17573502%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=544960&amp;amp;mapY=1053898&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4146125000&amp;amp;tel=&amp;amp;title=%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=544960%2C1053898&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A544960%2C1053900&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>c#</category>
      <category>닷넷리모팅</category>
      <category>러바우</category>
      <category>소스코드</category>
      <category>에버랜드 판다월드</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/364</guid>
      <comments>https://ehpro.tistory.com/364#entry364comment</comments>
      <pubDate>Wed, 22 Jan 2025 18:28:40 +0900</pubDate>
    </item>
    <item>
      <title>1. 6 Windows Form</title>
      <link>https://ehpro.tistory.com/363</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #262626;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이번에는 간단하게&lt;span&gt; Windows Form &lt;/span&gt;응용 프로그램을 만들기 위해 필요한 기술을 알아봅시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;먼저 윈도우즈 응용 프로그램을 만들기 위해&lt;span&gt; Windows Forms &lt;/span&gt;응용 프로그램 템플릿을 선택합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.16-Windows-Forms-응용-프로젝트-생성.png&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfCPNx/btsLSmKiuZ1/VEXu68SAleoA3ojzvBuqck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfCPNx/btsLSmKiuZ1/VEXu68SAleoA3ojzvBuqck/img.png&quot; data-alt=&quot;[그림] Windows Forms 응용 프로젝트 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfCPNx/btsLSmKiuZ1/VEXu68SAleoA3ojzvBuqck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfCPNx%2FbtsLSmKiuZ1%2FVEXu68SAleoA3ojzvBuqck%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;797&quot; height=&quot;446&quot; data-filename=&quot;그림-1.16-Windows-Forms-응용-프로젝트-생성.png&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림] Windows Forms 응용 프로젝트 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Windows Forms &lt;/span&gt;&lt;span&gt;응용 프로젝트를 생성하면 기본적으로 진입점이 있는&lt;span&gt; Program.cs &lt;/span&gt;파일과&lt;span&gt; MainForm&lt;/span&gt;에 관한 두 개의 소스 파일로&lt;span&gt; Form1.cs&lt;/span&gt;와&lt;span&gt; Form1.Designer.cs&lt;/span&gt;이 만들어집니다&lt;span&gt;. Program.cs &lt;/span&gt;파일에는&lt;span&gt; Form1 &lt;/span&gt;개체를 생성하여 닫힐 때까지 수행할 수 있는 코드 등이 자동으로 만들어진 상태입니다&lt;span&gt;. &lt;/span&gt;특이 사항이 없으면&lt;span&gt; Windows Forms &lt;/span&gt;응용 프로그램을 제작하면서 이 부분을 수정할 필요는 없습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;그리고&lt;span&gt; Form1.cs&lt;/span&gt;는 개발자가 작성할 부분이며&lt;span&gt; Form1.Designer.cs&lt;/span&gt;는 통합 개발 환경의 디자인 창에서 자식 컨트롤 배치나 속성 지정 및 이벤트 핸들러를 추가한 부분의 코드를 마법사에 의해 작성해 주는 부분입니다&lt;span&gt;. &lt;/span&gt;마찬가지로 개발자는&lt;span&gt; Form1.Designer.cs &lt;/span&gt;부분을 수정할 필요는 거의 없습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.17-기본으로-만들어지는-파일들.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6F2zH/btsLT2wYi29/KTLsUCV4dZhQRvBovBX6Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6F2zH/btsLT2wYi29/KTLsUCV4dZhQRvBovBX6Sk/img.png&quot; data-alt=&quot;[그림] 기본으로 만들어지는 파일들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6F2zH/btsLT2wYi29/KTLsUCV4dZhQRvBovBX6Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6F2zH%2FbtsLT2wYi29%2FKTLsUCV4dZhQRvBovBX6Sk%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;689&quot; height=&quot;441&quot; data-filename=&quot;그림-1.17-기본으로-만들어지는-파일들.png&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림] 기본으로 만들어지는 파일들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶&lt;span&gt; Program.cs&lt;/span&gt;의&lt;span&gt; Program &lt;/span&gt;클래스의 코드 내용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347232577&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static class Program
{
    /// &amp;lt;summary&amp;gt;
    /// 해당 응용 프로그램의 주 진입점입니다.
    /// &amp;lt;/summary&amp;gt;
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;Windows Form &lt;/span&gt;프로젝트를 생성할 때 만들어진 메인 폼의 이름이&lt;span&gt; Form1&lt;/span&gt;인데 이를 자신이 원하는 이름으로 변경하세요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.18] Form1 이름 바꾸기.png&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o1pgv/btsLSPZzLXt/EQUohaYRvYHHb71COQhAi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o1pgv/btsLSPZzLXt/EQUohaYRvYHHb71COQhAi0/img.png&quot; data-alt=&quot;[그림 1] Form1 이름 바꾸기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o1pgv/btsLSPZzLXt/EQUohaYRvYHHb71COQhAi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo1pgv%2FbtsLSPZzLXt%2FEQUohaYRvYHHb71COQhAi0%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;394&quot; height=&quot;391&quot; data-filename=&quot;[그림 1.18] Form1 이름 바꾸기.png&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] Form1 이름 바꾸기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.19] Form1 이름 바꾸기 과정에 나오는 메시지 창.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FDkM8/btsLTof9gUl/Q7zfCgLZmzCII42hfdc6qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FDkM8/btsLTof9gUl/Q7zfCgLZmzCII42hfdc6qK/img.png&quot; data-alt=&quot;[ 그림 ]Form1 이름 바꾸기 과정에 나오는 메시지 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FDkM8/btsLTof9gUl/Q7zfCgLZmzCII42hfdc6qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFDkM8%2FbtsLTof9gUl%2FQ7zfCgLZmzCII42hfdc6qK%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;494&quot; height=&quot;164&quot; data-filename=&quot;[그림 1.19] Form1 이름 바꾸기 과정에 나오는 메시지 창.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[ 그림 ]Form1 이름 바꾸기 과정에 나오는 메시지 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;위처럼 작업하면&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Form1.cs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일 이름과&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Form1.Designer.cs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일 이름이 자동으로 바뀌고&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Form1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;클래스 이름도 원하는 이름으로 바뀌는 것을 알 수 있습니다&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;또한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Program.cs&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일에서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;new Form1()&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;호출 부분도 바꾼 이름으로 자동으로 바꿔줍니다&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이 책에서는 자동으로 만들어진&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Form1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이름을 언제나&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MainForm&lt;/span&gt;으로 변경하고 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;그리고 속성 창을 이용하면 디자인 창의 다양한 컨트롤의 속성을 효과적으로 설정하거나 확인할 수 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.20] 속성 창 사용하기.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp8mhI/btsLRNnRkAy/C409d7kjDqQ0NSiE2yPgZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp8mhI/btsLRNnRkAy/C409d7kjDqQ0NSiE2yPgZ1/img.png&quot; data-alt=&quot;[그림 1] 속성 창 사용하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp8mhI/btsLRNnRkAy/C409d7kjDqQ0NSiE2yPgZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp8mhI%2FbtsLRNnRkAy%2FC409d7kjDqQ0NSiE2yPgZ1%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;647&quot; height=&quot;387&quot; data-filename=&quot;[그림 1.20] 속성 창 사용하기.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] 속성 창 사용하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성 창에서는 컨트롤이나 폼의 속성을 설정 및 확인할 수 있고 이벤트 핸들러를 설정 및 확인할 수 있습니다&lt;span&gt;. &lt;/span&gt;속성 창의 툴 바에는 항목 별로 정렬하거나 알파벳 순으로 정렬할 수 있는 버튼을 제공합니다&lt;span&gt;. &lt;/span&gt;그리고 뒤에 나오는 두 개의 버튼은 속성과 이벤트 핸들러를 의미합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.21] 속성 창의 툴바.png&quot; data-origin-width=&quot;103&quot; data-origin-height=&quot;26&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mOECp/btsLSSPCMqH/JX1NTaT1b4TL4uV7rrUYyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mOECp/btsLSSPCMqH/JX1NTaT1b4TL4uV7rrUYyK/img.png&quot; data-alt=&quot;[그림] 속성 창의 툴바&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mOECp/btsLSSPCMqH/JX1NTaT1b4TL4uV7rrUYyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmOECp%2FbtsLSSPCMqH%2FJX1NTaT1b4TL4uV7rrUYyK%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;103&quot; height=&quot;26&quot; data-filename=&quot;[그림 1.21] 속성 창의 툴바.png&quot; data-origin-width=&quot;103&quot; data-origin-height=&quot;26&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;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그리고 도구 상자를 이용하여 자식 컨트롤을 쉽게 배치할 수 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.22] 도구 상자를 이용한 컨트롤 배치.png&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FnKGJ/btsLS76QvVZ/jaqoPnR5UeOWs8KjCnkltK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FnKGJ/btsLS76QvVZ/jaqoPnR5UeOWs8KjCnkltK/img.png&quot; data-alt=&quot;[그림 1] 도구 상자를 이용한 컨트롤 배치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FnKGJ/btsLS76QvVZ/jaqoPnR5UeOWs8KjCnkltK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFnKGJ%2FbtsLS76QvVZ%2FjaqoPnR5UeOWs8KjCnkltK%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;711&quot; height=&quot;528&quot; data-filename=&quot;[그림 1.22] 도구 상자를 이용한 컨트롤 배치.png&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1] 도구 상자를 이용한 컨트롤 배치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;물론 배치한 컨트롤의 속성이나 이벤트 핸들러 등은 속성 창을 통해 쉽게 설정 및 확인할 수 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;span&gt;1.6.1 간단한 Windows Forms 응용 만들기&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이제 간단하게 아이디와 이름을 입력받아 리스트 상자의 항목에 아이디를 추가하고 이를 항목을 선택하면 선택한 항목의 이름을 레이블 컨트롤의 속성을 이용하여 변화하는 간단한 프로그램을 작성해 봅시다&lt;span&gt;. &lt;/span&gt;먼저&lt;span&gt; MainForm&lt;/span&gt;에 자식 컨트롤을 배치합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.23] MainForm에 자식 컨트롤 배치.png&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XD49A/btsLSc2g944/ekLR4RynXahUNMFVMtAuQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XD49A/btsLSc2g944/ekLR4RynXahUNMFVMtAuQk/img.png&quot; data-alt=&quot;[그림 1.21] MainForm에 자식 컨트롤 배치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XD49A/btsLSc2g944/ekLR4RynXahUNMFVMtAuQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXD49A%2FbtsLSc2g944%2FekLR4RynXahUNMFVMtAuQk%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;301&quot; height=&quot;299&quot; data-filename=&quot;[그림 1.23] MainForm에 자식 컨트롤 배치.png&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.21] MainForm에 자식 컨트롤 배치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;background-color: #bfbfbf;&quot; width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;번호&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 이름&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 유형&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_id&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Text &lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;속성&lt;span&gt;: &lt;/span&gt;아이디&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;tbox_id&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;TextBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_name&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Text &lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;속성&lt;span&gt;: &lt;/span&gt;이름&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;tbox_name&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;TextBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;btn_add&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lbox_member&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;ListBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_name2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Text &lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;속성&lt;span&gt;: [&lt;/span&gt;홍길동&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;표&lt;span&gt; 1.1] MainForm&lt;/span&gt;의 자식 컨트롤&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 프로그램에서는 회원 데이터를 관리할 것입니다&lt;span&gt;. &lt;/span&gt;이를 위해&lt;span&gt; Member &lt;/span&gt;클래스를 추가하기로 합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;▶&lt;span&gt; Member.cs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347538337&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;namespace First_Windows_Forms
{
    public class Member
    {
        public string Id
        {
            get;
            private set;
        }
        public string Name
        {
            get;
            private set;
        }
        public Member(string id, string name)
        {
            Id = id;
            Name = name;
        }
        public override string ToString()
        {
            return Id;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그리고 회원 관리자를 클래스로 정의합시다&lt;span&gt;. Windows Forms &lt;/span&gt;응용 프로그램을 작성할 때 관리할 데이터와&lt;span&gt; Forms &lt;/span&gt;사이의 관계를 느슨하게 작성하기 위함입니다&lt;span&gt;. GUI &lt;/span&gt;부분은 요구 사항이 자주 바꾸는 부분이므로 사용자와 상호 작용하는 부분을 변경하더라도 주요 코드는 변경하지 않게 하려면 데이터를 관리하는 부분을 별도의 클래스로 정의하세요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;특히 프로그램의 전체 데이터를 관리하는 개체는 단일 개체로 표현하여 여러 폼에서 사용하더라도 같은 데이터를 사용할 수 있게 해 주는 것은 좋은 코딩 습관이라 할 수 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347553074&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MemberManager
{
    static MemberManager mm = new MemberManager();
    public static MemberManager MM
    {
        get
        {
            return mm;
        }
    }
    private MemberManager()
    {
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;현재까지의 시나리오에서는 회원을 추가하는 부분과 특정 아이디의 회원 이름을 검색하는 부분만 필요합니다&lt;span&gt;. &lt;/span&gt;이 부분을 수행할 수 있게&lt;span&gt; MemberManager &lt;/span&gt;클래스를 정의합시다&lt;span&gt;. &lt;/span&gt;먼저 멤버 필드로 회원 아이디를 키로&lt;span&gt; Member &lt;/span&gt;개체를 값으로 하는 사전 개체를 선언합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347567222&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Dictionary&amp;lt;string, Member&amp;gt; mdic = new Dictionary&amp;lt;string, Member&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;회원 아이디와 이름을 입력 인자로 받아 회원 데이터를 추가하는 메서드를 제공합시다&lt;span&gt;. &lt;/span&gt;만약 이미 존재하는 아이디일 때는 거짓을 반환하고 그렇지 않을 때 회원 개체를 생성하여 보관한 후에 참을 반환합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347579852&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public bool AddMember(string id, string name)
{
    if (mdic.ContainsKey(id))
    {
        return false;
    }
    mdic[id] = new Member(id, name);
    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그리고 회원 아이디로 회원 이름을 검색하는 메서드를 제공합시다&lt;span&gt;. &lt;/span&gt;입력받은 회원&lt;span&gt; ID&lt;/span&gt;가 존재하면 회원의 이름을 반환하고 그렇지 않으면&lt;span&gt; string.Empty&lt;/span&gt;를 반환합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347591425&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public string FindMemberName(string id)
{
    if (mdic.ContainsKey(id))
    {
        return mdic[id].Name;
    }
    return string.Empty;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶&lt;span&gt; MemberManager.cs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347609095&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections.Generic;
 
namespace First_Windows_Forms
{
    public class MemberManager
    {
        Dictionary&amp;lt;string, Member&amp;gt; mdic = new Dictionary&amp;lt;string, Member&amp;gt;();
        static MemberManager mm = new MemberManager();

        public static MemberManager MM
        {
            get
            {
                return mm;
            }
        }

        private MemberManager()
        {
        }

        public bool AddMember(string id, string name)
        {
            if (mdic.ContainsKey(id))
            {
                return false;
            }
            mdic[id] = new Member(id, name);
            return true;
        }
        public string FindMemberName(string id)
        {
            if (mdic.ContainsKey(id))
            {
                return mdic[id].Name;
            }
            return string.Empty;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MainForm&lt;/span&gt;&lt;span&gt;에서는 회원 관리자의 단일 개체를 사용하여 사용자의 요청에 맞게 회원 데이터를 추가하거나 검색합니다&lt;span&gt;. &lt;/span&gt;쉽게 접근할 수 있게&lt;span&gt; MainForm.cs&lt;/span&gt;에 속성을 추가합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347623241&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private MemberManager MM
{
    get
    {
        return MemberManager.MM;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성 창의 이벤트 툴 버튼을 선택하여&lt;span&gt; Click &lt;/span&gt;이벤트 핸들러를 추가하세요&lt;span&gt;. &lt;/span&gt;디자인 창의 버튼을 더블 클릭하여도 버튼의&lt;span&gt; Click &lt;/span&gt;이벤트 핸들러를 자동으로 추가해 줍니다&lt;span&gt;. &lt;/span&gt;디자인 창에서 컨트롤을 더블 클릭하면 개발자가 기본으로 처리할 것이라 생각하는 이벤트 핸들러를 자동으로 추가해 줍니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347635038&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void btn_add_Click(object sender, EventArgs e)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;btn_add&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 클릭 이벤트 핸들러에서는 두 개의&lt;span&gt; TextBox&lt;/span&gt;에 입력한 정보를 얻어와서 회원 관리자 개체의&lt;span&gt; AddMember &lt;/span&gt;메서드를 이용하여 추가 요청합니다&lt;span&gt;. &lt;/span&gt;만약 반환 값이 거짓이면 추가 실패 메시지 창을 보여주고 참이면 리스트 상자의 항목에 아이디를 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347649860&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string id = string.Empty;
string name = string.Empty;
id = tbox_id.Text;
name = tbox_name.Text;
if (MM.AddMember(id, name) == false)
{
    MessageBox.Show(&quot;추가 실패&quot;);
}
else
{
    lbox_member.Items.Add(id);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이번에는 속성 창을 이용하여 &lt;span&gt;lbox_member &lt;/span&gt;컨트롤의 선택 변경 이벤트 핸들러를 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347663080&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void lbox_member_SelectedIndexChanged(object sender, EventArgs e)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;선택한 항목의 인덱스가&lt;span&gt; -1&lt;/span&gt;이면 선택 항목이 없는 것이므로 메서드를 종료합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347691070&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (lbox_member.SelectedIndex == -1)
{
    return;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;선택 항목을&lt;span&gt; string &lt;/span&gt;형식으로 참조한 후 회원 관리자 개체를 이용하여 이름을 찾은 후에 이름을 보여줄&lt;span&gt; Label&lt;/span&gt;의&lt;span&gt; Text &lt;/span&gt;속성을 설정합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347704882&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string id = lbox_member.SelectedItem as string;
lb_name2.Text = MM.FindMemberName(id);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶&lt;span&gt; MainForm.cs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347720964&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 First_Windows_Forms
{ 
    public partial class MainForm : Form
    {

        private MemberManager MM
        {
            get
            {
                return MemberManager.MM;
            }
        }

        public MainForm()
        {
            InitializeComponent();
        } 

        private void btn_add_Click(object sender, EventArgs e)
        {
            string id = string.Empty;
            string name = string.Empty;

            id = tbox_id.Text;
            name = tbox_name.Text;


            if (MM.AddMember(id, name) == false)
            {
                MessageBox.Show(&quot;추가 실패&quot;);
            }
            else
            {
                lbox_member.Items.Add(id);
            }
        } 

        private void lbox_member_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lbox_member.SelectedIndex == -1)
            {
                return;
            }
            string id = lbox_member.SelectedItem as string;
            lb_name2.Text = MM.FindMemberName(id);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1.6.2 사용자 정의 컨트롤 만들기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이번에는 사용자 정의 컨트롤을 만들고 이를 사용하는&lt;span&gt; Windows Forms &lt;/span&gt;응용 프로그램을 만들어 봅시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;실습은 도서 관리자 응용을 만드는 것으로 할게요&lt;span&gt;. &lt;/span&gt;도서 관리자 응용은&lt;span&gt; Windows Forms &lt;/span&gt;응용 프로그램으로 사용자 정의 컨트롤인&lt;span&gt; BookControlLib&lt;/span&gt;와&lt;span&gt; BookLib &lt;/span&gt;클래스 라이브러리를 참조합니다&lt;span&gt;. &lt;/span&gt;그리고&lt;span&gt; BookControlLib&lt;/span&gt;는&lt;span&gt; BookLib &lt;/span&gt;클래스 라이브러리를 참조할 것입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.24] 도서 관리자 컴포넌트 다이어그램.png&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v9hlh/btsLSAIoOv1/2aEtuwehmu3FPOAptvaomK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v9hlh/btsLSAIoOv1/2aEtuwehmu3FPOAptvaomK/img.png&quot; data-alt=&quot;[그림] 도서 관리자 컴포넌트 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v9hlh/btsLSAIoOv1/2aEtuwehmu3FPOAptvaomK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv9hlh%2FbtsLSAIoOv1%2F2aEtuwehmu3FPOAptvaomK%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;380&quot; height=&quot;212&quot; data-filename=&quot;[그림 1.24] 도서 관리자 컴포넌트 다이어그램.png&quot; data-origin-width=&quot;380&quot; data-origin-height=&quot;212&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;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;먼저 클래스 라이브러를 생성하여 디폴트로 제공하는 소스 파일명을&lt;span&gt; Book.cs&lt;/span&gt;로 변경하세요&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Book &lt;/span&gt;&lt;span&gt;클래스는 도서 제목&lt;span&gt;, ISBN, &lt;/span&gt;저자&lt;span&gt;, &lt;/span&gt;출판사&lt;span&gt;, &lt;/span&gt;설명을 멤버 속성으로 캡슐화하는 아주 작은 클래스입니다&lt;span&gt;. &lt;/span&gt;이에 관한 설명은 별도로 하지 않겠습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶&lt;span&gt; Book.cs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347789117&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;namespace BookLib
{
    /// &amp;lt;summary&amp;gt;
    /// 도서 클래스
    /// &amp;lt;/summary&amp;gt;
    public class Book
    {
        static Book empty = new Book(string.Empty,string.Empty,
                                                 string.Empty,string.Empty,string.Empty);
        /// &amp;lt;summary&amp;gt;
        /// 빈 도서 정적 개체 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public static Book Empty
        {
            get
            {
                return empty;
            }
        }
        /// &amp;lt;summary&amp;gt;
        /// ISBN - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string ISBN
        {
            get;
            private set;
        }
        /// &amp;lt;summary&amp;gt;
        /// 제목 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string Title
        {
            get;
            private set;
        }
        /// &amp;lt;summary&amp;gt;
        /// 저자 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string Author
        {
            get;
            private set;
        }
        /// &amp;lt;summary&amp;gt;
        /// 설명 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string Description
        {
            get;
            private set;
        }
        /// &amp;lt;summary&amp;gt;
        /// 출판사 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string Publisher
        {
            get;
            private set;
        }


        /// &amp;lt;summary&amp;gt;
        /// 생성자
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&quot;title&quot;&amp;gt;제목&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;isbn&quot;&amp;gt;ISBN&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;author&quot;&amp;gt;저자&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;publisher&quot;&amp;gt;출판사&amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;description&quot;&amp;gt;설명&amp;lt;/param&amp;gt;        
        public Book(string title,string isbn,string author,string publisher,
                        string description)
        {
            Title = title;
            ISBN = isbn;
            Author = author;
            Description = description;
            Publisher = publisher;
        }
        /// &amp;lt;summary&amp;gt;
        /// ToString 재정의 - 타이틀
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
        public override string ToString()
        {
            return Title;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이제&lt;span&gt; Windows Forms &lt;/span&gt;컨트롤 라이브러리 형태의 프로젝트를 추가하여&lt;span&gt; BookControlLib&lt;/span&gt;를 만듭시다&lt;span&gt;. &lt;/span&gt;기본으로 제공하는 컨트롤 이름을&lt;span&gt; BookControl&lt;/span&gt;로 변경하세요&lt;span&gt;. &lt;/span&gt;그리고 도서 정보를 시각화하기 위해 자식 컨트롤을 배치합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.25] BookControl 자식 컨트롤 배치.png&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p2DLx/btsLSey8E0V/IKwZGbiil6jqCjYdYfoB41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p2DLx/btsLSey8E0V/IKwZGbiil6jqCjYdYfoB41/img.png&quot; data-alt=&quot;[그림] BookControl 자식 컨트롤 배치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p2DLx/btsLSey8E0V/IKwZGbiil6jqCjYdYfoB41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp2DLx%2FbtsLSey8E0V%2FIKwZGbiil6jqCjYdYfoB41%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;321&quot; height=&quot;316&quot; data-filename=&quot;[그림 1.25] BookControl 자식 컨트롤 배치.png&quot; data-origin-width=&quot;321&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림] BookControl 자식 컨트롤 배치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;background-color: #bfbfbf;&quot; width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;번호&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 이름&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 유형&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_title_info&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정보 표시&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_title&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;도서 제목&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_isbn_info&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정보 표시&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_isbn&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;ISBN&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_author_info&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정보 표시&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_author&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;저자명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_publisher_info&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정보 표시&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_publisher&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;출판사&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;tbox_description&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;TextBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;상세 설명&lt;span&gt;, Multiline:True,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;ReadOnly:True&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;표&lt;span&gt; 1.2] BookControl&lt;/span&gt;의 자식 컨트롤&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;그리고&lt;span&gt; BookLib&lt;/span&gt;를 참조 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;BookControl&lt;/span&gt;&lt;span&gt;에 도서 개체 정보를 변경할 때 이 사실을 필요로 하는 곳을 위해 이벤트 인자 형식과 대리자를 정의합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶&lt;span&gt; BookEventArgs.cs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347849082&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using BookLib;
 
namespace BookControlLib
{
    /// &amp;lt;summary&amp;gt;
    /// 도서 이벤트 대리자
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&quot;sender&quot;&amp;gt;보낸 이&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&quot;e&quot;&amp;gt;이벤트 처리에 필요한 인자&amp;lt;/param&amp;gt;
    public delegate void BookEventHandler(object sender, BookEventArgs e);
    /// &amp;lt;summary&amp;gt;
    /// 도서 이벤트 인자 클래스
    /// &amp;lt;/summary&amp;gt;
    public class BookEventArgs:EventArgs
    {
        /// &amp;lt;summary&amp;gt;
        /// 도서 개체 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public Book Book
        {
            get;
            private set;
        }

        /// &amp;lt;summary&amp;gt;
        /// 도서명 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string Title
        {
            get
            {
                return Book.Title;
            }
            
        }
        /// &amp;lt;summary&amp;gt;
        /// 저자 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string Author
        {
            get
            {
                return Book.Author;
            }
        }
        /// &amp;lt;summary&amp;gt;
        /// 출판사 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string Publisher
        {
            get
            {
                return Book.Publisher;
            }
        }
        /// &amp;lt;summary&amp;gt;
        /// 설명 - 가져오기
        /// &amp;lt;/summary&amp;gt;
        public string Description
        {
            get
            {
                return Book.Description;
            }
        }
        /// &amp;lt;summary&amp;gt;
        /// 생성자
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&quot;book&quot;&amp;gt;도서 개체&amp;lt;/param&amp;gt;
        public BookEventArgs(Book book)
        {
            Book = book;
        }
        /// &amp;lt;summary&amp;gt;
        /// ToString 재정의
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;returns&amp;gt;도서명&amp;lt;/returns&amp;gt;
        public override string ToString()
        {
            return Book.Title;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;BookControl&lt;/span&gt;&lt;span&gt;에는 도서 개체를 멤버 필드와 도서 개체 변경에 관한 이벤트를 멤버로 캡슐화합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347861046&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public event BookEventHandler ChangedBook = null;
Book book = Book.Empty;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그리고 도서 개체를 가져오기 및 설정하기 속성을 제공합니다&lt;span&gt;. set &lt;/span&gt;블록에서는 도서 변경한 사실을 통보하고 자식 컨트롤의 속성을 변경합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347872381&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public Book Book
{
    get
    {
        return book;
    }
    set
    {
        if (value == null)
        {
            book = Book.Empty;
        }
        else
        {
            book = value;
        }
        if (ChangedBook != null)
        {
            ChangedBook(this, new BookEventArgs(Book));
        }
        ChangeControlProperty();
     }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;자식 속성을 변경하는 메서드에서는 각 속성이&lt;span&gt; string.Empty&lt;/span&gt;일 때 디폴트 값으로 설정하고 그 외에는 도서 개체의 속성을 이용하여 설정합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347915411&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void ChangeControlProperty()
{
    if (book.Title == string.Empty)
    {
        lb_title.Text = &quot;[제목]&quot;;
    }
    else
    {
        lb_title.Text = book.Title;
    }
    if (book.ISBN == string.Empty)
    {
        lb_isbn.Text = &quot;[ISBN]&quot;;
    }
    else
    {
        lb_isbn.Text = book.ISBN;
    }
    ...중략...
    tbox_description.Text = book.Description;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶ &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BookControlLib&lt;/span&gt;&lt;span&gt;.cs&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347932267&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Windows.Forms;
using BookLib;
 
namespace BookControlLib
{
    /// &amp;lt;summary&amp;gt;
    /// 도서 컨트롤
    /// &amp;lt;/summary&amp;gt;
    public partial class BookControl : UserControl
    {
        /// &amp;lt;summary&amp;gt;
        /// 도서 개체 변경 이벤트
        /// &amp;lt;/summary&amp;gt;
        public event BookEventHandler ChangedBook = null;
        Book book = Book.Empty;
        /// &amp;lt;summary&amp;gt;
        /// 도서 개체 - 가져오기, 설정하기
        /// &amp;lt;/summary&amp;gt;
        public Book Book
        {
            get
            {
                return book;
            }
            set
            {
                if (value == null)
                {
                    book = Book.Empty;
                }
                else
                {
                    book = value;
                }

                if (ChangedBook != null)
                {
                    ChangedBook(this, new BookEventArgs(Book));
                }

                ChangeControlProperty();
            }
        }

        /// &amp;lt;summary&amp;gt;
        /// 생성자
        /// &amp;lt;/summary&amp;gt;
        public BookControl()
        {
            InitializeComponent();
        }
        private void ChangeControlProperty()
        {
            if (book.Title == string.Empty)
            {
                lb_title.Text = &quot;[제목]&quot;;
            }
            else
            {
                lb_title.Text = book.Title;
            }
            if (book.ISBN == string.Empty)
            {
                lb_isbn.Text = &quot;[ISBN]&quot;;
            }
            else
            {
                lb_isbn.Text = book.ISBN;
            }
            if (book.Author == string.Empty)
            {
                lb_author.Text = &quot;[저자]&quot;;
            }
            else
            {
                lb_author.Text = book.Author;
            }
            if (book.Publisher == string.Empty)
            {
                lb_publisher.Text = &quot;[출판사]&quot;;
            }
            else
            {
                lb_publisher.Text = book.Publisher;
            }
            tbox_description.Text = book.Description;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이제&lt;span&gt; Windows Forms &lt;/span&gt;응용 프로그램 형태의 도서 관리자 프로젝트를 추가합시다&lt;span&gt;. &lt;/span&gt;그리고&lt;span&gt; BookControlLib&lt;/span&gt;를 참조 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;도서 관리자 응용에는&lt;span&gt; MainForm&lt;/span&gt;과&lt;span&gt; AddForm&lt;/span&gt;이 있고 데이터를 관리하는&lt;span&gt; BookManager &lt;/span&gt;클래스를 정의할 것입니다&lt;span&gt;. &lt;/span&gt;먼저 디폴트로 제공하는&lt;span&gt; Form1&lt;/span&gt;을&lt;span&gt; MainForm&lt;/span&gt;으로 변경하신 후에&lt;span&gt; AddForm&lt;/span&gt;을 추가하세요&lt;span&gt;. &lt;/span&gt;그리고&lt;span&gt; BookManager &lt;/span&gt;클래스를 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.26] MainForm의 자식 컨트롤 배치.png&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2fvnJ/btsLTRPPiqX/GVZ2KakSvnmwJImoUHNMb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2fvnJ/btsLTRPPiqX/GVZ2KakSvnmwJImoUHNMb0/img.png&quot; data-alt=&quot;[그림 ] MainForm의 자식 컨트롤 배치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2fvnJ/btsLTRPPiqX/GVZ2KakSvnmwJImoUHNMb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2fvnJ%2FbtsLTRPPiqX%2FGVZ2KakSvnmwJImoUHNMb0%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;573&quot; height=&quot;425&quot; data-filename=&quot;[그림 1.26] MainForm의 자식 컨트롤 배치.png&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 ] MainForm의 자식 컨트롤 배치&lt;/figcaption&gt;
&lt;/figure&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;background-color: #bfbfbf;&quot; width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;번호&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 이름&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 유형&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;btn_add&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;도서 추가 폼 띄우기 버튼&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lbox_book&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;ListBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;도서 목록&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;bc&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;BookControl&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;도서 정보&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;표&lt;span&gt; 1.3] MainForm&lt;/span&gt;의 자식 컨트롤&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[그림 1.27] AddForm의 자식 컨트롤 배치.png&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bna5u3/btsLSMO8PyP/roQcyTOXfKZeb9Of3OSwb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bna5u3/btsLSMO8PyP/roQcyTOXfKZeb9Of3OSwb1/img.png&quot; data-alt=&quot;[그림] AddForm의 자식 컨트롤 배치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bna5u3/btsLSMO8PyP/roQcyTOXfKZeb9Of3OSwb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbna5u3%2FbtsLSMO8PyP%2FroQcyTOXfKZeb9Of3OSwb1%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;297&quot; height=&quot;405&quot; data-filename=&quot;[그림 1.27] AddForm의 자식 컨트롤 배치.png&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림] AddForm의 자식 컨트롤 배치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;background-color: #bfbfbf;&quot; width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;번호&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 이름&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;컨트롤 유형&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #bfbfbf;&quot; width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_title_info&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정보 표시&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;tbox_title&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;TextBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;도서명 입력 창&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_isbn_info&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정보 표시&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;tbox_isbn&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;TextBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;ISBN &lt;/span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;입력 창&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_author_info&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Lable&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정보 표시&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;tbox_author&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;TextBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;저자명 입력 창&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_publisher_info&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정보 표시&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;tbox_publisher&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;TextBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;출판사 입력 창&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;lb_description_info&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Label&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;정보 표시&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;tbox_description&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;TextBox&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;설명 입력 창&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;bnt_add&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;추가 버튼&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;38&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;132&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;bnt_cancel&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;113&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;Button&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td width=&quot;200&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #363636;&quot;&gt;취소 버튼&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;표&lt;span&gt; 1.4] AddForm&lt;/span&gt;의 자식 컨트롤&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;먼저&lt;span&gt; BookManager &lt;/span&gt;클래스를 구현합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;BookManager &lt;/span&gt;&lt;span&gt;개체는 단일 개체로 정의합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347999560&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static BookManager bm = new BookManager();
internal static BookManager BM
{
    get
    {
        return bm;
    }
}
private BookManager()
{
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;BookManager&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에는 도서를 추가하였을 때 이를 알고자 하는 곳에 이 사실을 알려주기 위한 이벤트를 멤버로 캡슐화합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348016928&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;internal event BookEventHandler AddedBook = null;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그리고&lt;span&gt; ISBN&lt;/span&gt;을 키로하고&lt;span&gt; Book &lt;/span&gt;개체를 값으로 하는 사전 개체를 두어 도서 개체를 관리합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348029803&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Dictionary&amp;lt;string, Book&amp;gt; bdic = new Dictionary&amp;lt;string, Book&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;도서를 추가하는 메서드를 제공합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348043819&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;internal bool AddBook(string title, string isbn, string author, string publisher,
                              string description)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;만약 입력 인자로 받은&lt;span&gt; isbn&lt;/span&gt;이 이미 있으면 거짓을 반환합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348056599&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (bdic.ContainsKey(isbn))
{
    return false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;입력 인자로 받은&lt;span&gt; isbn&lt;/span&gt;이 없으면&lt;span&gt; Book &lt;/span&gt;개체를 생성하여 사전 개체에 등록합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348073083&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bdic[isbn] = new Book(title, isbn, author, publisher, description);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그리고 도서 개체 추가 이벤트 멤버가&lt;span&gt; null&lt;/span&gt;이 아니면 도서를 추가한 사실을 구독하기를 원하는 개체가 있는 것이므로 이벤트 핸들러를 수행합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348084951&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (AddedBook != null)
{
    AddedBook(this, new BookEventArgs(bdic[isbn]));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그리고 참을 반환합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348099574&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return true;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶ &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BookManager&lt;/span&gt;&lt;span&gt;.cs&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348113346&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections.Generic;
using BookControlLib;
using BookLib;
 
namespace 도서관리자
{
    class BookManager
    {
        internal event BookEventHandler AddedBook = null;
        Dictionary&amp;lt;string, Book&amp;gt; bdic = new Dictionary&amp;lt;string, Book&amp;gt;(); 
        static BookManager bm = new BookManager();
        internal static BookManager BM
        {
            get
            {
                return bm;
            }
        }
        private BookManager()
        { 
        }
 
        internal bool AddBook(string title, string isbn, string author,
                                      string publisher, string description)
        {
            if (bdic.ContainsKey(isbn))
            {
                return false;
            }
            bdic[isbn] = new Book(title, isbn, author, publisher, description);
            if (AddedBook != null)
            {
                AddedBook(this, new BookEventArgs(bdic[isbn]));
            }
            return true;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MainForm&lt;/span&gt;&lt;span&gt;에서는&lt;span&gt; BookManger &lt;/span&gt;개체를 자주 사용할 수 있으므로 쉽게 참조할 수 있게 속성을 정의합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348125258&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BookManager BM
{
    get
    {
        return BookManager.BM;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;추가 폼은 최대 하나의 폼만 띄우도록 합시다&lt;span&gt;. &lt;/span&gt;이를 위해&lt;span&gt; MainForm&lt;/span&gt;에는 추가 폼을 참조하는 멤버 필드를 선언합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348151943&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AddForm af = null;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MainForm&lt;/span&gt;&lt;span&gt;의&lt;span&gt; Load &lt;/span&gt;이벤트 핸들러를 추가합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348163621&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void MainForm_Load(object sender, EventArgs e)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이벤트 핸들러에서는&lt;span&gt; BookManager &lt;/span&gt;단일 개체에게&lt;span&gt; AddedBook &lt;/span&gt;이벤트 핸들러를 등록하여 도서를 추가하였을 때 이 사실을 통보받아 처리할 수 있게 합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348176741&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BM.AddedBook += new BookEventHandler(BM_AddedBook);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;BM_AddedBook &lt;/span&gt;&lt;span&gt;이벤트 핸들러에서는 도서 개체를 항목으로 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348188271&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void BM_AddedBook(object sender, BookEventArgs e)
{
    lbox_book.Items.Add(e.Book);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;추가 버튼인&lt;span&gt; btn_add&lt;/span&gt;의&lt;span&gt; Click &lt;/span&gt;이벤트 핸들러를 추가합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348200902&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void btn_add_Click(object sender, EventArgs e)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;만약 추가 폼을 참조하는&lt;span&gt; af&lt;/span&gt;가&lt;span&gt; null&lt;/span&gt;이면 추가 폼을 생성합니다&lt;span&gt;. &lt;/span&gt;그리고 추가 폼이 닫히는 것을 인지하기 위해&lt;span&gt; af&lt;/span&gt;의&lt;span&gt; FormClosed &lt;/span&gt;이벤트 핸들러를 추가합니다&lt;span&gt;. &lt;/span&gt;그리고 추가 폼을 시각화합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348214080&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (af == null)
{
    af = new AddForm();
    af.FormClosed += new FormClosedEventHandler(af_FormClosed);
    af.Show();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;af_FormClosed &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이벤트 핸들러에서는&lt;span&gt; af&lt;/span&gt;를&lt;span&gt; null&lt;/span&gt;로 설정합니다&lt;span&gt;. &lt;/span&gt;이 작업으로 다시 추가 버튼을 클릭하면 추가 폼을 생성하여 시각화할 수 있는 것입니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348225994&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void af_FormClosed(object sender, FormClosedEventArgs e)
{
    af = null;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;도서 목록 상자의 항목 변경 이벤트 핸들러를 추가합니다&lt;span&gt;. &lt;/span&gt;이벤트 핸들러에서는 선택한 항목의 도서 개체를 참조하여&lt;span&gt; BookControl&lt;/span&gt;인&lt;span&gt; bc&lt;/span&gt;의&lt;span&gt; Book &lt;/span&gt;속성을 설정합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348238710&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void lbox_book_SelectedIndexChanged(object sender, EventArgs e)
{
    if (lbox_book.SelectedIndex == -1)
    {
        return;
    }
    Book book = lbox_book.SelectedItem as Book;
    bc.Book = book;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶ &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MainForms&lt;/span&gt;&lt;span&gt;.cs&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348251475&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 BookControlLib;
using BookLib;
 
namespace 도서관리자
{
    public partial class MainForm : Form
    {
        AddForm af = null;
        BookManager BM
        {
            get
            {
                return BookManager.BM;
            }
        }
        public MainForm()
        {
            InitializeComponent();
        }
       
        private void MainForm_Load(object sender, EventArgs e)
        {
            BM.AddedBook += new BookEventHandler(BM_AddedBook);
        } 
        void BM_AddedBook(object sender, BookEventArgs e)
        {
            lbox_book.Items.Add(e.Book);
        }
        private void btn_add_Click(object sender, EventArgs e)
        {
            if (af == null)
            {
                af = new AddForm();
                af.FormClosed += new FormClosedEventHandler(af_FormClosed);
                af.Show();
            }
        }
 
        void af_FormClosed(object sender, FormClosedEventArgs e)
        {
            af = null;
        }
 
        private void lbox_book_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lbox_book.SelectedIndex == -1)
            {
                return;
            }
 
            Book book = lbox_book.SelectedItem as Book;
            bc.Book = book;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이제&lt;span&gt; AddForm&lt;/span&gt;을 구현합시다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;MainForm&lt;/span&gt;&lt;span&gt;과 마찬가지로&lt;span&gt; BookManger&lt;/span&gt;를 쉽게 참조할 수 있게 속성을 정의합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348287082&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BookManager BM
{
    get
    {
        return BookManager.BM;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;추가 버튼의&lt;span&gt; Click &lt;/span&gt;이벤트 핸들러를 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348293170&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void btn_add_Click(object sender, EventArgs e)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도서 정보를 입력한 컨트롤의&lt;span&gt; Text &lt;/span&gt;속성으로 도서 정보를 얻어옵니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348304550&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string title = tbox_title.Text;
string isbn = tbox_isbn.Text;
string author = tbox_author.Text;
string publisher = tbox_publisher.Text;
string description = tbox_description.Text;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도서 관리자 단일 개체의&lt;span&gt; AddBook &lt;/span&gt;메서드를 이용하여 도서 정보를 추가합니다&lt;span&gt;. &lt;/span&gt;만약 결과가&lt;span&gt; false&lt;/span&gt;이면 메시지 창으로 추가 실패를 통보합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348314181&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (BM.AddBook(title, isbn, author, publisher, description) == false)
{
    MessageBox.Show(&quot;추가 실패&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막으로 컨트롤의&lt;span&gt; Text &lt;/span&gt;속성을 초기화합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348320545&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ControlTextInitialize();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;도서 정보를 입력하는&lt;span&gt; TextBox &lt;/span&gt;컨트롤들의&lt;span&gt; Text &lt;/span&gt;속성을 초기화하는 메서드를 추가합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348332458&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void ControlTextInitialize()
{
    tbox_title.Text = string.Empty;
    tbox_author.Text = string.Empty;
    tbox_isbn.Text = string.Empty;
    tbox_publisher.Text = string.Empty;
    tbox_description.Text = string.Empty;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;취소 버튼의&lt;span&gt; Click &lt;/span&gt;이벤트 핸들러도 추가하여&lt;span&gt; ControlTextInitialize &lt;/span&gt;메서드를 호출합니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348341386&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void btn_cancel_Click(object sender, EventArgs e)
{
    ControlTextInitialize();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이상으로 사용자 정의 컨트롤을 정의하고 이를 이용하는&lt;span&gt; Windows Forms &lt;/span&gt;응용을 만들어 보았습니다&lt;span&gt;. Windows Forms &lt;/span&gt;응용을 만드는 기술 학습으로는 많은 부분에서 부족할 수 있지만 기본적인 사항을 소개하는 수준에서 끝낼게요&lt;span&gt;. &lt;/span&gt;앞으로 검색 엔진을 만드는 과정을 소개하면서 보다 다양한 실습을 할 수 있을 것입니다&lt;span&gt;. &lt;/span&gt;그리고 필요하시면 별도의 레퍼런스를 참고하시기 바랍니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶ &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AddForm&lt;/span&gt;&lt;span&gt;.cs&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737348358325&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 도서관리자
{
    public partial class AddForm : Form
    {
        BookManager BM
        {
            get
            {
                return BookManager.BM;
            }
        }
        public AddForm()
        {
            InitializeComponent();
        }
        private void btn_add_Click(object sender, EventArgs e)
        {
            string title = tbox_title.Text;
            string isbn = tbox_isbn.Text;
            string author = tbox_author.Text;
            string publisher = tbox_publisher.Text;
            string description = tbox_description.Text;
            if (BM.AddBook(title, isbn, author, publisher, description) == false)
            {
                MessageBox.Show(&quot;추가 실패&quot;);
            }
            ControlTextInitialize();
        } 
        private void ControlTextInitialize()
        {
            tbox_title.Text = string.Empty;
            tbox_author.Text = string.Empty;
            tbox_isbn.Text = string.Empty;
            tbox_publisher.Text = string.Empty;
            tbox_description.Text = string.Empty;
        }
 
        private void btn_cancel_Click(object sender, EventArgs e)
        {
            ControlTextInitialize();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=w3uXfc06wXc&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bjngoL/hyX4zihtlv/XK7cCKKtofr3pKu2LupXx1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/ijzwA/hyX4th272m/TL8pXiaZ5iQl7dhpChDE3k/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Travel diary in Korea, Oeam Fork Village#외암리 민속마을&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/w3uXfc06wXc&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;아산 외암민속마을&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%86%A1%EC%95%85%EB%A9%B4%20%EC%99%B8%EC%95%94%EB%A6%AC%20188&amp;amp;addtype=1&amp;amp;confirmid=17112656&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A503710%2C%22mapCenterY%22%3A897683%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A503710%2C%22y%22%3A897688%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84%22%2C%22confirmid%22%3A17112656%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=503710&amp;amp;mapY=897683&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420031000&amp;amp;tel=041-541-0848&amp;amp;title=%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737348443852&quot; id=&quot;maps_1737348443852&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%86%A1%EC%95%85%EB%A9%B4%20%EC%99%B8%EC%95%94%EB%A6%AC%20188&amp;amp;addtype=1&amp;amp;confirmid=17112656&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A503710%2C%22mapCenterY%22%3A897683%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A503710%2C%22y%22%3A897688%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84%22%2C%22confirmid%22%3A17112656%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=503710&amp;amp;mapY=897683&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420031000&amp;amp;tel=041-541-0848&amp;amp;title=%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=503710%2C897683&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A503710%2C897688&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>windows forms 응용</category>
      <category>검색엔진</category>
      <category>외암민속마을</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/363</guid>
      <comments>https://ehpro.tistory.com/363#entry363comment</comments>
      <pubDate>Mon, 20 Jan 2025 13:47:27 +0900</pubDate>
    </item>
    <item>
      <title>1. 5 라이브러리</title>
      <link>https://ehpro.tistory.com/362</link>
      <description>&lt;div data-v-4e6bf9d7=&quot;&quot;&gt;
&lt;div data-v-4e6bf9d7=&quot;&quot;&gt;
&lt;div data-v-4e6bf9d7=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;SE-d0efec7e-29b5-4f07-b1f7-c521f1d3adc0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-47505635-84ee-4511-b74d-80290b709221&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;.NET 프레임워크 기반의 라이브러리는 .NET 어셈블리라고 부릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3ea5bd5a-9bc4-436f-a313-756bca79f365&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-18effec3-8483-4ea5-8ce5-e1a175082198&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;.NET 어셈블리는 .NET 프레임워크 응용 프로그램을 구성하는 기본 컴포넌트입니다. 컴포넌트 기반의 프로그래밍은 모듈의 재사용성을 높여줍니다. .NET 응용 프로그램을 제작할 때 미리 작성된 라이브러리를 사용할 수 있는데 이 때 사용하는 라이브러리도 .NET 어셈블리이며 실행 파일도 .NET 어셈블리입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dcc86e8d-e8eb-4940-aeb2-79b39ef7020d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ed16bdaa-a68d-434c-8a66-13258b6dcb8f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;.NET 어셈블리는 EXE 파일 혹은 DLL 파일 형태로 만들 수 있으며 하나 이상의 모듈을 포함할 수도 있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5ae1f0aa-8847-47af-9635-634868b90993&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-230b955b-def8-4e31-9dd1-2c4bc5ddd7b4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;.NET 어셈블리는 자기 기술적인 메타 데이터를 갖고 있고 레지스트리 항목에 종속되지 않는 구성 요소로 디자인되어 있기 때문에 병행(Side by Side) 실행이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-46d3a27d-a0e3-4088-9f43-1399e43e6dae&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2c272d52-fb38-4ac6-8c06-277c1a69b1bb&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;이로써 같은 명칭의 여러 어셈블리를 설치 가능할 뿐만 아니라 이를 사용하는 응용들은 자신들에 맞는 어셈블리를 사용할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-910b775c-bd7f-4971-88bd-5a6e9ae0fdb2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-170747a7-4fa2-4b7e-a8c0-551448420390&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;&lt;b&gt;1.5.1 .NET 어셈블리 구성 요소&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-a7248e42-7db1-4be3-ac6b-072c1b0918f2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;.NET 어셈블리는 여러 종류의 구성 요소로 구성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8a716acb-6760-40b8-be07-c45ee2ff98a4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6b64fefc-0638-488d-a878-925de23cfb31&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;첫 번째 구성 요소로 어셈블리 매니페스트가 있습니다. 어셈블리 매니페스트는 어셈블리의 버전 요구 사항과 보안 ID를 지정하는 데 필요한 모든 메타데이터와 어셈블리의 범위를 정의하고 참조를 확인하는 데 필요한 모든 메타 데이터를 포함하고 있습니다. 어셈블리 매니페스트는 어셈블리 이름, 버전 번호, 문화권, 강력한 이름의 정보, 어셈블리에 포함한 파일 목록, 형식 참조 정보로 구성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-118c09fa-0b7f-4c58-b055-7c948fb998d2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cdab4798-25cc-43a5-a3a7-fde3320ade11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 어셈블리에 정의된 형식들에 대한 형식 메타 데이터와 실제 수행해야 할 코드인 MSIL과 리소스로 구성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2cfd4ad1-f83a-4eaa-9e20-495fa7513317&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-18929e36-4f80-4f65-8789-372f9360b2d8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;어셈블리는 하나의 물리적 바이너리로 만들어진 단일 파일 어셈블리와 여러 개의 물리적 바이너리로 만들어진 다중 파일 어셈블리로 나눌 수 있습니다. .NET에서는 어셈블리의 부속으로 사용하는 모듈을 만들 수 있는데 모듈은 어셈블리의 내용으로 포함합니다. 즉, 하나의 어셈블리가 다른 어셈블리에 있는 형식을 사용하기 위해서는 단순히 사용할 어셈블리를 참조만 하면 되는데 모듈에 있는 것을 사용할 때는 모듈을 포함하여 어셈블리를 만들어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aacd2991-1447-48d5-b97f-cd5799d1b805&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8e2f24a4-0531-4edf-a29b-3e71bc0c906e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 .NET 어셈블리를 구성하는 물리적 바이너리에는 리소스 파일, 매니페이스, DLL, 모듈 등이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-be87fdc4-0ef1-451e-bd8a-b137df5abf7a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;&lt;u&gt;&lt;b&gt;​&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-cb819062-88a0-43b5-9285-2be8d3758276&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;&lt;b&gt;1.5.2 .NET 어셈블리 만들기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-2f5e5d20-f5cf-447d-8e9a-865fcad0df0b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;여기서는 .NET 어셈블리를 만들어 보기로 합시다. .NET 어셈블리 중에 실행 파일을 만드는 것은 이미 알고 있으므로 라이브러리를 만드는 것을 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-207801eb-4c84-4768-b09b-c4594cbe9ee2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4736cd0f-589a-42f0-9040-b8e93d5832f2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;.NET에서 라이브러리는 쉽게 제작할 수 있습니다. 코드를 작성하는 부분에서 다른 어셈블리에서 사용할 수 있는 형식을 정의할 때 public 키워드를 명시합니다. 멤버도 마찬가지로 다른 어셈블리에서 접근을 허용하게 하려면 접근 지정을 public으로 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f9b88800-4143-42a8-b086-a5364487d97a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-706bc997-4b66-45e8-86d8-d2a18802dd2b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;즉 다른 어셈블리에 정의된 형식이나 멤버 중에 사용할 수 있는 형식과 멤버는 접근 지정이 public으로 되어 있다는 것 말고는 차이가 없습니다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737253641219&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Member
{
    ...중략...
    public Member(string name, string addr)
    {
        ...중략...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-662de2f4-be1d-4194-8921-95aa05499ec3&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c0f5a2cd-afda-4856-976a-ef5ab27f43ae&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;간단한 라이브러리를 하나 만들어 봅시다. 먼저 컴파일러 옵션을 이용하여 만드는 것을 보여 드리고 통합 개발 환경에서 만드는 것을 보여 드릴게요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-54bf5978-b60d-498d-a285-c24ad5e94ddd&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-57b47d89-0b82-4289-a930-bc77320c7575&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;컴파일러 옵션을 이용하는 것을 보여 드리기 전에 메모장을 이용하여 소스 코드를 편집해 봅시다. 편집할 코드에는 다른 어셈블리에서 접근할 수 있는 Member 클래스와 접근할 수 없는 MemberInfo 클래스를 정의할게요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8fc4f97b-705e-4ded-9980-2ebf36c3bb74&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-14e67ef3-b4e6-44ea-9bab-7a3c14a02c77&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 Member에는 이름과 주소를 입력 인자로 받는 생성자와 이름 속성, 주소 속성의 get 블록을 public으로 접근 지정하여 다른 어셈블리에서 사용할 수 있게 합시다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aa9f85ea-278b-455e-b0e7-ca43e83fce13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cd3b3600-78b8-480f-a967-f4d58ee540df&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▷ 라이브러리 코드 예(Member.cs)&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-420a9577-e8f5-4a97-9a77-ca19dbeae4ac&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1737253661750&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;namespace MemberLib
{
    public class Member //다른 어셈블리에서 접근 가능
    {
        MemberInfo mi = null;

        public string Name //다른 어셈블리에서 접근 가능
        {
            get
            {
                return mi.Name;
            }
        }
        public string Addr //다른 어셈블리에서 접근 가능
        {
            get
            {
                return mi.Addr;
            }
        }
        public Member(string name, string addr) //다른 어셈블리에서 접근 가능
        {
            mi = new MemberInfo(name, addr);
        }
        public override string ToString()//다른 어셈블리에서 접근 가능
        {
            return mi.ToString();
        }
    }

    class MemberInfo //다른 어셈블리에서 접근 불가
    {
        internal string Name
        {
            get;
            private set;
        }
        internal string Addr
        {
            get;
            private set;
        }
        internal MemberInfo(string name, string addr)
        {
            Name = name;
            Addr = addr;
        }
        public override string ToString()
        {
            return Name;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-6fcc3a35-2a45-4364-8bd2-c3e0afdf4ebe&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;Visual Studio 명령 프롬프트에서 csc /t:library /out:MemberLib Member.cs를 입력하시면 컴파일되어 MemberLib.dll 파일명으로 .NET 어셈블리가 만들어집니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.3-csc-명령어를-이용하여-.NET-어셈블리-만들기.png&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O5eBM/btsLSmprSRc/2NGxQNdLGwxkwMyTH9iQbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O5eBM/btsLSmprSRc/2NGxQNdLGwxkwMyTH9iQbk/img.png&quot; data-alt=&quot;[그림 1.3] csc 명령어를 이용하여 .NET 어셈블리 만들기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O5eBM/btsLSmprSRc/2NGxQNdLGwxkwMyTH9iQbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO5eBM%2FbtsLSmprSRc%2F2NGxQNdLGwxkwMyTH9iQbk%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;517&quot; height=&quot;143&quot; data-filename=&quot;그림-1.3-csc-명령어를-이용하여-.NET-어셈블리-만들기.png&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.3] csc 명령어를 이용하여 .NET 어셈블리 만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-09ea7e0b-b943-4a76-bc53-8df17cae75b0&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-1bde0c0a-64be-42dc-a887-37355a855695&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-01e7a4fd-1800-4d24-8ac2-d7bd64d1a42b&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-9d38e124-9856-4997-893d-4f4cd9127929&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;다음은 콘솔 명령어 csc의 옵션들입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2ec3438b-3e1b-44b0-bccc-898980ecbfb7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▷ 기본 옵션&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737253707268&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/out:&amp;lt;file&amp;gt;                 만들어질 어셈블리 이름(출력 파일 이름)을 지정
/target:exe                 콘솔 실행 파일을 만들기 (기본) (약식: /t:exe)
/target:winexe             Windows 실행 파일을 만들기 (약식: /t:winexe)
/target:library              라이브러리를 만들기 (약식: /t:library)
/target:module            모듈을 만들기 (약식: /t:module)
/delaysign[+|]              어셈블리 서명을 연기
/doc:&amp;lt;file&amp;gt;                 XML 문서 파일 생성
/keyfile:&amp;lt;file&amp;gt;             강력한 이름의 키 파일을 지정
/keycontainer:&amp;lt;string&amp;gt; 강력한 이름의 키 컨테이너를 지정
/platform:&amp;lt;string&amp;gt;       실행할 수 있는 플랫폼을 지정 (x86, Itanium, x64,anycpu)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▷ 자주 사용하는 옵션&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737253723357&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/reference:&amp;lt;file list&amp;gt;      어셈블리 참조 (약식:/r)
/addmodule:&amp;lt;file list&amp;gt;   모듈을 포함
/help                          csc 커맨드 사용법 (약식:/?)
/lib:&amp;lt;file list&amp;gt;               참조를 검색할 추가 디렉터리를 지정&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;Microsof Visual Studio로 라이브러리를 만들 때는 다음과 같이 새 프로젝트 템플릿에서 클래스 라이브러리를 선택하여 만들면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d552b309-d4b0-4f15-bc1e-bc46a3a18676&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b05uxM/btsLSpGboGg/VH97nTZYBfOvoV0h4htrK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b05uxM/btsLSpGboGg/VH97nTZYBfOvoV0h4htrK0/img.png&quot; data-alt=&quot;[그림 1.4] Microsoft Visual Staio에서 클래스 라이브러리 만들기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b05uxM/btsLSpGboGg/VH97nTZYBfOvoV0h4htrK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb05uxM%2FbtsLSpGboGg%2FVH97nTZYBfOvoV0h4htrK0%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;794&quot; height=&quot;389&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.4] Microsoft Visual Staio에서 클래스 라이브러리 만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #555555; text-align: center; letter-spacing: 0px;&quot;&gt;*개발도구 버전에 따라 다소 차이가 있습니다. *&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-85250ebd-3d68-45b9-9019-df60ff38b6af&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-7273af9c-c197-490a-a94b-35e78182c180&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;&lt;b&gt;1.5.3 전용 어셈블리&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-c129fc98-ba1c-463b-811b-f4a769512717&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;Microsoft Visual Studio에서 콘솔 응용 프로그램 프로젝트를 생성하여 작성한 어셈블리를 사용하는 코드를 작성해 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7ec079b7-55fd-490c-a9b3-e761fd037433&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-27d84966-bc4e-45fe-934e-10544ca7b88e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▶ .NET 어셈블리를 참조하여 사용하는 응용 프로그램 예&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737253780671&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using MemberLib;

namespace UsingMemberLIb
{
    class Program
    {
        static void Main(string[] args)
        {
            Member member = new Member(&quot;홍길동&quot;, &quot;대한민국&quot;);
            Console.WriteLine(&quot;이름:{0} 주소:{1}&quot;, member.Name, member.Addr);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▶ 실행 결과&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737253791233&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;이름:홍길동 주소:대한민국&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-72e5dc82-5b46-42f6-9138-44a479053615&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-32f1f6b9-2c8f-427a-b41e-eeb7b40f8a6f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;물론 MemberLib에서 public으로 지정하지 않은 MemberInfo 형식과 멤버는 사용하지 못합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-667054d3-dc20-4cb9-b3a8-19c34bccdc5b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-b8b09c5e-d570-4f37-a9fc-6c56c1cc3bf3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;참고로 CLR은 참조하는 전용 어셈블리의 위치를 찾는 일도 수행하는데 프로빙이라 합니다. 제일 먼저 응용 프로그램 디렉토리를 먼저 검사하고 없으면 구성 파일에 명시된 디렉토리를 검사합니다. 구성 파일은 응용 프로그램 구성 파일과 게시자 정책 파일, 시스템 구성 파일이 있으며 자세한 사항은 MSDN 런타임에서 어셈블리를 찾는 방법을 참고하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bd1b7ab8-2d6d-40f5-b794-9a5f3f25f573&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-c6e92a98-0eca-4307-9ca0-a50d62d40787&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;&lt;b&gt;1.5.4 공용 어셈블리&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-ec989a3d-a066-42da-817a-4db639f1a2c5&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-657e7a87-1fbf-4dbc-8d75-d3249b699a2e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;공용 어셈블리는 전역 어셈블리 캐시(윈도우즈 설치 폴더의 하위 폴더명이 Assembly인 폴더를 말함)에 있는 어셈블리를 말합니다. 전역 어셈블리 캐시에는 파일명과 확장자가 같더라도 어셈블리의 강력한 이름이 다르다면 배포할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.6-전역-어셈블리-캐쉬.png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGywf/btsLSspmKTr/mgjyPtkZu8Uqhudwy3CAIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGywf/btsLSspmKTr/mgjyPtkZu8Uqhudwy3CAIk/img.png&quot; data-alt=&quot;[그림 1.6] 전역 어셈블리 캐쉬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGywf/btsLSspmKTr/mgjyPtkZu8Uqhudwy3CAIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGywf%2FbtsLSspmKTr%2FmgjyPtkZu8Uqhudwy3CAIk%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;581&quot; height=&quot;261&quot; data-filename=&quot;그림-1.6-전역-어셈블리-캐쉬.png&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.6] 전역 어셈블리 캐쉬&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;*윈도우즈 버전에 따라 다를 수 있음*&lt;/p&gt;
&lt;div id=&quot;SE-93a014f6-d18b-4a92-953c-1b24930b5a51&quot;&gt;
&lt;div&gt;
&lt;p id=&quot;SE-875649d8-0406-4986-8f08-c2f296c4ed67&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-476f8264-9e1c-4fc7-baeb-3c2793b36ebd&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c9a13e01-ae2f-4e42-a77d-48b283eafb44&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;강력한 이름은 어셈블리 이름, 버전 번호, 문화권, 어셈블리 ID, 공개 키, 디지털 서명 등으로 구성합니다. 이처럼 전역 어셈블리 캐시에는 같은 이름의 DLL도 강력한 이름이 다르면 배포할 수 있습니다. 이로써 서로 다른 버전을 사용하는 응용 프로그램들이 자신에게 맞는 어셈블리를 사용할 수 있는 것입니다. 이를 병행(Side by Side) 실행이라 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c74cfbc4-a346-4bc6-9a76-81d5fae15832&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1d15b7d9-bb34-469f-b537-1de8f9b0552f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;간단하게 라이브러리를 만들고 병행 실행을 확인합시다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dc9faabb-19a7-4575-a6e3-bf508105479e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2820e252-9977-4b94-b554-3796c1a62684&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▶ DemoLib (버전 1.0.0.0)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737253860991&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
namespace DemoLib
{
    public class DemoClass
    {
        public void Foo()
        {
            Console.WriteLine(&quot;Foo 1&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-4fb7d428-d334-4e54-afca-b2bc73d74293&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #fdfdfd;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-e31262e8-460f-4524-9507-dba1acf5c7a3&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-61f677c1-a081-4258-ae0c-d764510db2ce&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;공용 어셈블리를 만들기 위해 솔루션 탐색기에 프로젝트에 우측 마우스를 클릭하여 나오는 컨텍스트 메뉴에서 속성을 선택하세요. 그리고 서명 탭을 선택하신 후에 어셈블리 서명 체크 박스를 선택하시고 강력한 이름 키 선택 콤보 박스에서 새로 만들기를 선택합니다. 강력한 이름 키 만들기 창에서 키 이름을 입력하면 프로젝트 항목에 만든 키가 보이게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.8-강력한-이름의-키-만들기.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djdRl6/btsLSN06pbW/HqxpsfGktAzIFhINkOLD7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djdRl6/btsLSN06pbW/HqxpsfGktAzIFhINkOLD7K/img.png&quot; data-alt=&quot;[그림 1.8] 강력한 이름의 키 만들기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djdRl6/btsLSN06pbW/HqxpsfGktAzIFhINkOLD7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjdRl6%2FbtsLSN06pbW%2FHqxpsfGktAzIFhINkOLD7K%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;456&quot; height=&quot;327&quot; data-filename=&quot;그림-1.8-강력한-이름의-키-만들기.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.8] 강력한 이름의 키 만들기&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div id=&quot;SE-ee41349c-d7ed-4efe-9f1b-6c7ff7a13119&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-2aea0b90-79d9-46d1-83be-c8b4d90e89ae&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-abe60d8b-ad7d-42b9-a656-e107e2b70879&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-d7c0fef8-d549-4463-8f3e-307c07bf63ba&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 프로젝트를 빌드하시면 출력 폴더(기본: Debug)에 DLL 파일이 만들어집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-695ad2b2-2761-4ff7-9014-db69d80b3dad&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f1412c63-7b58-4b9a-8cb2-95a61c085edc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;이제 작성한 DLL을 전역 어셈블리 캐시에 배포합시다. Windows7부터는 보안이 강화되어 관리자 권한으로 배포해야 합니다. 관리자 권한으로 Visual Studio 명령 프롬프트를 실행한 후에 gacutil /i demolib.dll 을 치면 배포가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.9-gacutil-명령어로-전역-어셈블리-캐시에-배포.png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oc3Mv/btsLSg3RM6C/IdLw5fwxC6GknvwtHwKQUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oc3Mv/btsLSg3RM6C/IdLw5fwxC6GknvwtHwKQUK/img.png&quot; data-alt=&quot;[그림 1.9] gacutil 명령어로 전역 어셈블리 캐시에 배포&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oc3Mv/btsLSg3RM6C/IdLw5fwxC6GknvwtHwKQUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOc3Mv%2FbtsLSg3RM6C%2FIdLw5fwxC6GknvwtHwKQUK%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;593&quot; height=&quot;152&quot; data-filename=&quot;그림-1.9-gacutil-명령어로-전역-어셈블리-캐시에-배포.png&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.9] gacutil 명령어로 전역 어셈블리 캐시에 배포&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-5a468ee9-e3a6-4a64-861b-56074cf9cffc&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-2045b650-b6ce-4609-a603-3f9b6e5688a2&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;SE-045c4f57-b0d1-44a8-a7ea-8d5e17b8dda7&quot; style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;​&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; letter-spacing: 0px;&quot;&gt;이제 배포한 공용 어셈블리를 사용하는 응용 프로그램 프로젝트를 생성하세요. 그리고 참조 추가를 통해 demolib.dll를 추가하세요. 전용 어셈블리에서 참조 추가하는 것과 같은 방법입니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-6cbe7bb5-2a60-4125-95bc-d5e72312b2b8&quot;&gt;
&lt;p id=&quot;SE-f0efb715-617a-429c-a035-ffd0f9b0fe0c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ef306541-d59b-4f94-8c90-f364fffc9c37&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;전용 어셈블리를 참조 추가하면 자동으로 프로젝트 출력 폴더에 참조한 어셈블리 파일이 추가하지만 공용 어셈블리를 참조 추가하면 프로젝트 출력 폴더에 추가하지 않고 전역 어셈블리 캐시에 배포된 것을 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-47a7809c-998f-42b4-8264-e9763a1414b9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5869a040-eef6-42cd-ad2b-b1772ad42cc4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 프로젝트 참조 폴더에 해당 어셈블리에 오른쪽 마우스 버튼을 클릭하여 컨텍스트 메뉴에서 속성을 선택하세요. 속성 창을 보면 특정 버전을 선택할 수 있습니다. 만약, 특정 버전 속성을 false로 설정하면 새로운 버전이 배포되면 자동으로 최신 버전을 사용합니다. 하지만 특정 버전 속성을 true로 설정하면 참조한 버전의 어셈블리를 사용하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.10-특정-버전-속성-지정.png&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBUNu1/btsLSL3ha0X/iRooOhEdR0CXtlkS3OdzK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBUNu1/btsLSL3ha0X/iRooOhEdR0CXtlkS3OdzK0/img.png&quot; data-alt=&quot;[그림 1.10] 특정 버전 속성 지정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBUNu1/btsLSL3ha0X/iRooOhEdR0CXtlkS3OdzK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBUNu1%2FbtsLSL3ha0X%2FiRooOhEdR0CXtlkS3OdzK0%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;201&quot; height=&quot;359&quot; data-filename=&quot;그림-1.10-특정-버전-속성-지정.png&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.10] 특정 버전 속성 지정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-26cf51de-ea97-48a6-b4d7-cd6659676b59&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-0de98e5b-8958-4e09-8b01-dd5bb6f520fb&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; letter-spacing: 0px;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-25623d88-ad98-464d-b78f-e54a1efea90e&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-28610544-8990-4fce-96f3-9fc7d8a140f7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;여기서는 병행(Side by Side) 실행을 확인하기 위하여 특정 버전 속성을 True로 합시다. 그리고 사용하는 코드를 작성하여 빌드 후에 실행하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aa0d1a0d-4a76-4c5a-b4d8-5f09d99815ac&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aae23703-09db-426d-8f59-88f6955a47d0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▶ 공용 어셈블리(버전 1.0.0.0)를 사용하는 예제 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737253942834&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using DemoLib;

namespace UsingDemoV1
{
    class Program
    {
        static void Main(string[] args)
        {
            DemoClass dc = new DemoClass();
            dc.Foo();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▶ 실행 결과&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d6e7167a-536f-4af7-923b-01221c40cf5c&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1737253955068&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Foo 1&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-e5680a95-5c6e-494d-a0e9-e7a3663725a9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 DemoLib를 수정합시다. 조금 전에 만든 DemoLib를 사용하는 프로젝트는 닫아주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-7b14255c-1211-4a20-9184-e8da4d774473&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-4c17e83d-fccf-4d74-a27b-f661df0cc1e4&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▶ DemoLib (버전 1.0.0.1)&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-a533931c-e063-4a34-981f-d2d4a7213e00&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #fdfdfd;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-863fbdfd-7933-44f7-ae86-3130c9f05e1b&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1737253966116&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
namespace DemoLib
{
    public class DemoClass
    {
        public void Foo()
        {
            Console.WriteLine(&quot;Foo 2&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-624752cc-c26c-49f4-b45e-8704d8c48ba3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;프로젝트 속성 창을 열어서 응용 프로그램 탭에 어셈블리 정보 버튼을 클릭합시다. 그리고 버전 정보를 수정하세요. 버전 정보를 수정하였으므로 조금 전에 만들어 배포한 어셈블리와 파일명과 확장자는 같지만 강력한 이름은 다릅니다. 전역 어셈블리 캐시에서는 강력한 이름으로 배포하기 때문에 재배포 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.11-어셈블리-버전-수정.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HBVFP/btsLRnJwG8n/02oKqeefohl0pCZyU2zPy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HBVFP/btsLRnJwG8n/02oKqeefohl0pCZyU2zPy0/img.png&quot; data-alt=&quot;[그림 1.11] 어셈블리 버전 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HBVFP/btsLRnJwG8n/02oKqeefohl0pCZyU2zPy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHBVFP%2FbtsLRnJwG8n%2F02oKqeefohl0pCZyU2zPy0%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;412&quot; height=&quot;406&quot; data-filename=&quot;그림-1.11-어셈블리-버전-수정.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.11] 어셈블리 버전 수정&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div id=&quot;SE-011c705f-56be-4bcc-9d08-82892cc5c06e&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-a70c1864-9b48-4700-bbc4-504fce70c87d&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-70bbe33b-8aee-4586-9a95-d36fb5d42c7b&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-12d1e1e5-3deb-4f04-bb92-fd7bb8fd295e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;프로젝트를 빌드한 후 gacutil 명령어를 이용하여 다시 배포합시다. 그리고 방금 만들었던 응용을 실행해서 참조한 버전의 어셈블리를 사용하고 있음을 확인하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c017e594-78a6-4bf1-9428-bbc7357c94a7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-225ad003-c5e2-4e78-b240-946008eb36a6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 새로운 버전을 참조하여 사용하는 응용 프로그램을 작성해 보세요. 그리고 두 개의 응용 프로그램을 실행해 보시면 각각 자신이 참조하는 버전의 어셈블리를 사용함을 확인하실 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e761b48a-b79a-435f-a5f0-7fe49bbecede&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-bb462e2f-8021-4b06-84c8-55448b566d26&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;&lt;b&gt;1.5.5 XML 문서 파일&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-7f32376e-e327-4172-ae9d-66fd58f76d58&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;이번에는 라이브러리를 만들 때 사용하는 곳에서 Microsoft Visual Studio의 인텔리센스 기능을 활용할 수 있게 해 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0f2d45f9-c20f-4b0e-a778-a5fc4560d296&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-42e85025-cf5c-4e33-a95b-c89cbd1049dc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;프로젝트 속성 창에서 빌드 탭을 선택하여 XML 문서 파일을 체크하세요.&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.12-XML-문서-파일-출력-설정.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nFc94/btsLSQXTkLj/foxfp9iWmn1QqdCLCzWH3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nFc94/btsLSQXTkLj/foxfp9iWmn1QqdCLCzWH3K/img.png&quot; data-alt=&quot;[그림 1.12] XML 문서 파일 출력 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nFc94/btsLSQXTkLj/foxfp9iWmn1QqdCLCzWH3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnFc94%2FbtsLSQXTkLj%2Ffoxfp9iWmn1QqdCLCzWH3K%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;494&quot; height=&quot;560&quot; data-filename=&quot;그림-1.12-XML-문서-파일-출력-설정.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.12] XML 문서 파일 출력 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-36bebe20-1413-4e3c-9e48-0b5cd9b86dfa&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-3d35b246-6a00-410f-85f4-54aa6aa76535&quot; style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-b4c4d984-3f0d-48ea-96a8-009bc50c2faa&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-48eb5f74-fc6c-4bb8-803c-2d9c34a99c12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 빌드하면 공개한 멤버 형식에 주석이 없다는 경고 메시지가 나타납니다. XML 문서 파일 출력을 설정하면 가시성이 public인 형식과 멤버에 대한 세 줄 주석으로 XML 양식에 맞는 설명이 없으면 경고 메시지가 뜹니다. 다음과 같이 코드를 약간 변경한 후에 주석을 달아봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5d70c84a-e863-44ba-a225-60817a04c3f0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-cf35e067-3f75-490d-86b0-e7a8340eec69&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▶ XML 양식에 맞게 세 줄 주석 달기&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-415cc1d9-43ca-4273-8dc9-a2c90db51592&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #fdfdfd;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-3bf6d3e8-b7c2-41e2-8684-016238946649&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1737254019095&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;▶ XML 양식에 맞게 세 줄 주석 달기

using System;

namespace DemoLib
{
    /// &amp;lt;summary&amp;gt;
    /// 데모 클래스
    /// &amp;lt;/summary&amp;gt;
    public class DemoClass
    {
        /// &amp;lt;summary&amp;gt;
        /// Foo 메서드
        /// &amp;lt;/summary&amp;gt;
        /// &amp;lt;param name=&quot;a&quot;&amp;gt;첫번째 인자 &amp;lt;/param&amp;gt;
        /// &amp;lt;param name=&quot;b&quot;&amp;gt;두번째 인자 &amp;lt;/param&amp;gt;
        /// &amp;lt;returns&amp;gt; 첫번째 인자 + 두번째 인자 &amp;lt;/returns&amp;gt;
        public int Foo(int a,int b)
        {
            Console.WriteLine(&quot;a:{0} b:{1}&quot;,a,b);
            return a + b;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-07cf6ecd-b948-4547-96ae-352ff0f53610&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;다시 빌드하시면 경고가 사라지고 출력 폴더에 가 보면 XML 파일이 생긴 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-29cfa3d7-3943-4c71-a931-f54268cd644c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-73fdecbd-49b9-4a23-ac5a-f3a1c71c4767&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;▶ XML 출력 파일 내용&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-d624e9c2-0d7b-452f-b23a-9e4b49bec689&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #fdfdfd;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cafa6c1f-6436-4e39-92ed-2cd78f55c348&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1737254032734&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;doc&amp;gt;
    &amp;lt;assembly&amp;gt;
        &amp;lt;name&amp;gt;DemoLib&amp;lt;/name&amp;gt;
    &amp;lt;/assembly&amp;gt;
    &amp;lt;members&amp;gt;
        &amp;lt;member name=&quot;T:DemoLib.DemoClass&quot;&amp;gt;
            &amp;lt;summary&amp;gt;
            데모 클래스
            &amp;lt;/summary&amp;gt;
        &amp;lt;/member&amp;gt;
        &amp;lt;member name=&quot;M:DemoLib.DemoClass.Foo(System.Int32,System.Int32)&quot;&amp;gt;
            &amp;lt;summary&amp;gt;
            Foo 메서드
            &amp;lt;/summary&amp;gt;
            &amp;lt;param name=&quot;a&quot;&amp;gt;첫 번째 인자&amp;lt;/param&amp;gt;
            &amp;lt;param name=&quot;b&quot;&amp;gt;두 번째 인자&amp;lt;/param&amp;gt;
            &amp;lt;returns&amp;gt; 첫 번째 인자 + 두 번째 인자&amp;lt;/returns&amp;gt;
        &amp;lt;/member&amp;gt;
    &amp;lt;/members&amp;gt;
&amp;lt;/doc&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;SE-2d1385b2-a88b-4b0d-acdc-57921157a1ca&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 콘솔 응용 프로그램을 생성한 후에 라이브러리를 참조 추가하고 천천히 Demo 형식의 개체를 생성하고 Foo 메서드를 호출하는 구문을 추가해 보세요. 다음처럼 인텔리센스 기능이 작동하여 메서드가 무엇을 의미하는지 인자가 무엇인지 설명하는 구문을 확인할 수 있습니다. 물론, 풍선 도움말에 나타나는 것은 XML 형식에 맞게 작성한 세 줄 주석에 작성한 내용입니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.13-인텔리센스-작동-화면.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3keTJ/btsLRHHKGIB/y9ipMgapKuobKkbT4KzlbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3keTJ/btsLRHHKGIB/y9ipMgapKuobKkbT4KzlbK/img.png&quot; data-alt=&quot;[그림 1.13] 인텔리센스 작동 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3keTJ/btsLRHHKGIB/y9ipMgapKuobKkbT4KzlbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3keTJ%2FbtsLRHHKGIB%2Fy9ipMgapKuobKkbT4KzlbK%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;417&quot; height=&quot;196&quot; data-filename=&quot;그림-1.13-인텔리센스-작동-화면.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[그림 1.13] 인텔리센스 작동 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;span style=&quot;color: #555555; text-align: center; letter-spacing: 0px;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;SE-d7b3f7f6-db8b-4139-8988-7d0c6cbfa6a6&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-8df31848-06d1-41f5-8e90-14c012bcec68&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;여러 명이 팀 작업을 할 때 이와 같은 기능은 많은 도움을 줍니다. 평소에도 XML 문서 출력 속성을 설정하여 세 줄 주석을 다는 것을 습관화하세요. 자신이 작성한 라이브러리도 사용하기 편하고 다른 동료도 여러분이 만든 라이브러리를 사용하기 편해질 것입니다.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/shorts/9OhA1IV1fW4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/dxF48O/hyX0ySE1Oo/v7XbxhIDHB7OoJxNNK9fZk/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720,https://scrap.kakaocdn.net/dn/cWetYm/hyX4kFgVFI/0EF5tfArJ0NVAYzhLVriR1/img.jpg?width=405&amp;amp;height=720&amp;amp;face=0_0_405_720&quot; data-video-width=&quot;405&quot; data-video-height=&quot;720&quot; data-video-origin-width=&quot;405&quot; data-video-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Exploring the Winter Festival at Everland, Wintertopia with Moomin#Everland#Moomin&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/9OhA1IV1fW4&quot; width=&quot;405&quot; height=&quot;720&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EA%B2%BD%EA%B8%B0%20%EC%9A%A9%EC%9D%B8%EC%8B%9C%20%EC%B2%98%EC%9D%B8%EA%B5%AC%20%ED%8F%AC%EA%B3%A1%EC%9D%8D%20%EC%A0%84%EB%8C%80%EB%A6%AC%20519-19&amp;amp;addtype=1&amp;amp;confirmid=17573502&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A544960%2C%22mapCenterY%22%3A1053898%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A544960%2C%22y%22%3A1053900%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C%22%2C%22confirmid%22%3A17573502%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=544960&amp;amp;mapY=1053898&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4146125000&amp;amp;tel=&amp;amp;title=%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737254137528&quot; id=&quot;maps_1737254137528&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EA%B2%BD%EA%B8%B0%20%EC%9A%A9%EC%9D%B8%EC%8B%9C%20%EC%B2%98%EC%9D%B8%EA%B5%AC%20%ED%8F%AC%EA%B3%A1%EC%9D%8D%20%EC%A0%84%EB%8C%80%EB%A6%AC%20519-19&amp;amp;addtype=1&amp;amp;confirmid=17573502&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A544960%2C%22mapCenterY%22%3A1053898%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A544960%2C%22y%22%3A1053900%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C%22%2C%22confirmid%22%3A17573502%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=544960&amp;amp;mapY=1053898&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4146125000&amp;amp;tel=&amp;amp;title=%EC%97%90%EB%B2%84%EB%9E%9C%EB%93%9C%20%ED%8C%90%EB%8B%A4%EC%9B%94%EB%93%9C&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=544960%2C1053898&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A544960%2C1053900&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>c#</category>
      <category>닷넷 라이브러리</category>
      <category>에버랜드 판다월드</category>
      <category>웹 검색 엔진 만들기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/362</guid>
      <comments>https://ehpro.tistory.com/362#entry362comment</comments>
      <pubDate>Sun, 19 Jan 2025 11:35:53 +0900</pubDate>
    </item>
    <item>
      <title>1. 4 요구 기술</title>
      <link>https://ehpro.tistory.com/361</link>
      <description>&lt;p id=&quot;SE-73e398a6-2508-4ac1-9c6f-92831ff4dc15&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;이 책에서 다루고자 하는 맞춤형 검색 엔진을 만들기 위해서는 라이브러리 제작 기술과 윈도우즈 폼 응용 프로그램 제작 기술 및 .NET 리모팅, DBMS를 사용하기 위해 SQL 쿼리 및 ADO.NET 기술 등이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-328798f9-4357-45d8-8664-1d9869e95fa7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8ec9e15a-49c3-456e-b9f0-2ea77ab5a962&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;기본적으로 이와 같은 기술을 활용해 본 적이 없거나 비슷한 기술을 활용해 본 적이 없으신 분들께서는 별도의 학습이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ff22bd50-a056-461d-bc90-94e32071ed70&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-52cab4a5-a6c4-4c52-a045-860c0f650a51&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;여기에서는 간략하게 맞춤형 검색 엔진을 만들기 위해 필요한 요구 기술 중에서 라이브러리 제작 및 윈도우즈 폼 응용 제작 기술 및 .NET 리모팅 기술을 간략하게 소개할게요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>요구 기술</category>
      <category>웹 검색 엔진 만들기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/361</guid>
      <comments>https://ehpro.tistory.com/361#entry361comment</comments>
      <pubDate>Sun, 19 Jan 2025 11:25:30 +0900</pubDate>
    </item>
    <item>
      <title>1. 3 시나리오</title>
      <link>https://ehpro.tistory.com/360</link>
      <description>&lt;div data-v-4e6bf9d7=&quot;&quot;&gt;
&lt;div data-v-4e6bf9d7=&quot;&quot;&gt;
&lt;div data-v-4e6bf9d7=&quot;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;SE-2e0f9252-61d2-4126-b99a-d80d48271e3b&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-72e7a01a-7eb5-48e7-a5ca-a572467b65db&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;먼저 이 책에서 작성할 맞춤형 검색 엔진 만들기 솔루션의 전반적인 시나리오를 소개할게요. 시나리오는 가상으로 만들었으며 별도의 설명은 하지 않겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-f3138885-8136-4fd5-8991-f0b08d7dabe4&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;text-align: left; 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;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;문서 번호&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;20XX &amp;ndash; P &amp;ndash; 01&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;보존 기간&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;10년&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;작성 일자&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;20XX. X. X&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;작성자&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;홍길동&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-cef5d804-864c-45a4-b59c-5fef07f36a80&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;text-align: left; 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;background-color: #ffffff;&quot; colspan=&quot;1&quot; rowspan=&quot;1&quot;&gt;
&lt;div&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;EH-WSE(EH Web Search Engine)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;SE-9e19e38f-a12f-45c0-9870-556f78d7112e&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 id=&quot;SE-58f2db48-8758-4e69-8717-991d86c606cd&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;I. 개요&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id=&quot;SE-acb5147a-060d-4bb0-99ff-980df22c8a54&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;I.1 배경지식&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-57f91cc1-8dcc-47eb-b160-b8b6b88fe523&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 웹 검색 엔진이란 원하는 웹 사이트를 검색하기 위한 S/W를 말합니다. 웹 검색 엔진은 대부분 인터넷 상에 게시되어 있는 웹 페이지들을 수집하는 웹 로봇과 웹 페이지를 분석하는 분석기, 분석한 결과로 쉽게 검색할 수 있게 역 파일을 만드는 색인기 및 질의 결과에 랭킹을 부여하는 랭커 등으로 구성할 수 있습니다. 웹 검색 엔진은 각각의 엔진들의 구동 원리와 구현 수준에 따라 다양한 품질 수준을 결정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aeba0744-870d-426e-80a9-f4473035fcb2&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2ad2405e-8c13-4ae5-8f4f-744f2eab9833&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 웹 로봇은 일반적으로 여러 개의 Seed 사이트를 일차적으로 수집 대상 페이지로 등록합니다. 그리고 주기적으로 수집 대상 페이지를 수집하고 수집한 웹 페이지 내용에 있는 하이퍼 링크의 웹 사이트도 수집 대상에 추가합니다. 이를 반복하면서 수집하는데 수집한 웹 페이지도 갱신될 개연성이 있으므로 수집한 지 특정 기간이 지난 웹 페이지는 다시 수집 대상에 포함합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e1a46872-f0fe-4187-923f-82c0160d7735&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fdb0a7b0-c8cf-47ba-ba4e-0a2af5966eb8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 웹 페이지 분석기는 웹 페이지의 내용을 공백이나 콤마 등의 약속한 문자를 기준으로 분할하는 방식에서부터 자연어 연구에서 사용하는 형태소 분석까지 다양한 분석기들이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9799abba-01de-4709-b72f-c15e02badf89&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f38b76be-4a64-4567-a3f1-def86dab21ef&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 색인기는 웹 페이지 분석기를 통해 분석한 요소별로 해당 요소를 포함한 웹 페이지를 기재하여 검색 요청이 오면 검색 질의를 포함하는 웹 페이지를 검색하기 쉽게 색인 데이터를 만드는 것을 말합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-e6c8d99b-05a5-49e4-8e25-402224e840ad&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ea759035-3abe-4756-a423-a186caa3a70a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 랭커는 질의한 내용으로 검색한 결과들을 다양한 방법에 의해 사용자가 요청하는 질의에 근접한 순위를 부여하는 것을 말합니다. 대표적인 방법으로 문서 내의 검색 요소의 빈도수와 전체 문서에서의 검색 요소를 포함한 문서의 개수를 통해 희귀성을 기반으로 랭킹을 하는 TF-IDF 방식이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-41b1045f-9fc1-4f72-8fb3-e44fee7c69c3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-1a0c4896-20c7-4fe9-91b9-2f76fb5f9d46&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;I.2 프로젝트 소개&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-530f8e61-26f9-4ff5-aa9e-9df3b3819bf6&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; EH WSE 프로젝트는 기본적인 웹 검색 엔진의 구성 요소들을 갖춘 작은 웹 검색 엔진이어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ad2023dc-e1b3-466b-b35b-edb0588b3252&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-9c5a12ae-c159-4d67-92bc-dd8016bacfa3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 웹 검색 엔진은 관리 응용을 통해 Seed 사이트를 추가하거나 수집을 시작하고 멈출 수 있으며 수집 주기를 정할 수 있어야 합니다. 또한, 관리 응용을 통해 수집 후보 사이트들을 확인할 수 있어야 할 것이며 색인 데이터의 요소 리스트 및 수집한 웹 페이지의 내용도 확인이 가능해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-db74e461-9321-4036-b110-2a6d5717371b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-46d2b9ff-0f89-4555-be84-79cae832eeac&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;관리 응용을 통해 제어 및 설정하는 검색 엔진은 웹 로봇을 통해 수집하고 분석한 결과 등을 데이터 베이스 관리 시스템을 통해 관리해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-34eaee1c-d8e3-4c31-9d27-5ff3361061e8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3fea59d6-a489-4396-bed3-e0f566654af7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 검색에 사용하는 응용은 간단한 윈도우 응용 형태로 제작하여 문장이나 단어로 검색할 수 있고 검색한 결과 리스트를 랭커에 의해 순위를 부여한 순으로 확인할 수 있고 해당 웹 페이지를 방문할 수 있어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-0effebaf-e8a5-407b-8b11-ebba1d40d788&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-8f8f8db9-3cf3-4d87-9f1f-40e803a0e379&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 본 프로젝트에서는 웹 로봇의 성능이나 분석기의 품질 및 보안에 관한 품질 수준은 특별히 요구하지 않습니다. 다만, 가급적 엔진들은 분리하고 각 엔진들에서 공통적으로 사용할 형식들은 라이브러리로 만들어 재사용성을 높이고 유지 보수가 쉽게 유연성 있는 결과물을 만들 수 있어야 할 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-245a0ae5-ca1b-4ab0-8bc5-2dd54962449a&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-27199158-56e2-4161-839e-1251f9f20985&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;&lt;b&gt;II. 동작 환경 및 요구 기술&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 id=&quot;SE-8a8c7d76-d8f9-4299-bcf1-1db4a546d00b&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;II.1 동작환경&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-2af0df79-904b-47c0-9755-33e73e231a0e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;O/S : Windows 7&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d7abb3f7-c3cf-4c09-b5a8-4009a3d339c1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;DBMS: MS-SQL 20010&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ab771dea-bed1-4568-af2e-128584af83a8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;SE-109c62f2-29ab-4d07-ac33-5da48a304e50&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;II.2 요구 기술&lt;/span&gt;&lt;/h4&gt;
&lt;p id=&quot;SE-331e799f-37eb-478b-abd5-7b8aaae7c576&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 본 프로젝트를 수행하기 위해서는 C# 언어에 관한 기본 문법을 인지하고 구사할 수 있어야 합니다. Java 언어에 숙달되어 있다면 큰 비용없이 C# 문법에 관한 레퍼런스를 참고하여 작성하는데 무리가 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2576600e-0d2b-463a-93d3-1c701036aa27&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a655273e-4d90-42be-b6db-09ce0489a12b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 본 프로젝트를 수행하기 위해서는 기본적인 SQL 쿼리문을 알고 있으며 ADO.NET을 사용할 수 있거나 학습을 요구합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-fbf96ca0-6945-4832-96e8-2027d58a4a2d&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-527115b0-e318-40d4-84e7-738ddf5b1537&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 본 프로젝트를 수행하기 위해서는 Windows Form에 관한 기본적인 이해 및 사용을 할 수 있거나 학습을 요구합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f0119cfe-1f3d-46ae-a297-b820f7a51750&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-84d8ce53-13d6-4723-88f6-72c7809f4616&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 본 프로젝트를 수행하기 위해서는 .NET 어셈블리에 관한 이해 및 클래스 라이브러리 개발을 할 수 있거나 학습을 요구합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2fa8df6a-9a47-497f-a9d3-f2f19658e011&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c73b36e6-ece6-427a-a4dd-40a34471c860&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 본 프로젝트를 수행하기 위해서는 .NET 리모팅에 관한 이해와 서비스 정의 및 서비스를 사용할 수 있거나 학습을 요구합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-66819fed-da17-413a-a5b6-3239c73cb115&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ae302dc5-a991-42f5-b92b-3221752f92dc&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 본 프로젝트를 수행하기 위해서는 CBD개발 방법론에 대한 기본적인 이해 및 UML을 사용할 수 있거나 학습을 요구합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-aca6e411-b24a-40c6-9b9a-f7936e4c2e16&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;&lt;b&gt;​&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;SE-75d6de3b-9813-4259-8f90-1c9311c5f8d8&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;&lt;b&gt;III. 개발 공정&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p id=&quot;SE-a5c45e25-befc-4d60-a49a-c784908dea02&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 요구 분석 및 정의 &amp;ndash; 10%&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2b1a3de5-3293-4070-b8c8-746688e55606&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 아키텍쳐링 &amp;ndash; 40%&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-dd15b8a3-5c43-401d-8170-b638b65d934b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 설계 &amp;ndash; 30%&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6c6ac123-7bfd-434d-8217-c5c8bfcf3534&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 구현 &amp;ndash; 20%&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3f1e3eef-d49b-4fc9-a513-1fa25960b472&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt; 배포 &amp;ndash; 해당 사항 없음&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=Xgj6w9S6Zgc&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/djDwA3/hyX0xTOaq1/sbdMgasL53DAynkwxtw990/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cQa7Ec/hyX4krIboT/P6REwWD0pgeLiccVyuWZTK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Travel diary in Korea, Cheonan Cheonho Lake!#천호지&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Xgj6w9S6Zgc&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;천안 천호지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%95%88%EC%84%9C%EB%8F%99%20470&amp;amp;addtype=1&amp;amp;confirmid=15151284&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A537865%2C%22mapCenterY%22%3A926373%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A537869%2C%22y%22%3A926378%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B2%9C%ED%98%B8%EC%A0%80%EC%88%98%EC%A7%80%22%2C%22confirmid%22%3A15151284%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=537865&amp;amp;mapY=926373&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413159000&amp;amp;tel=&amp;amp;title=%EC%B2%9C%ED%98%B8%EC%A0%80%EC%88%98%EC%A7%80&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737253430213&quot; id=&quot;maps_1737253430213&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%95%88%EC%84%9C%EB%8F%99%20470&amp;amp;addtype=1&amp;amp;confirmid=15151284&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A537865%2C%22mapCenterY%22%3A926373%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A537869%2C%22y%22%3A926378%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B2%9C%ED%98%B8%EC%A0%80%EC%88%98%EC%A7%80%22%2C%22confirmid%22%3A15151284%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=537865&amp;amp;mapY=926373&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413159000&amp;amp;tel=&amp;amp;title=%EC%B2%9C%ED%98%B8%EC%A0%80%EC%88%98%EC%A7%80&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=537865%2C926373&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A537869%2C926378&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>Csharp</category>
      <category>닷넷</category>
      <category>웹 검색 엔진 만들기</category>
      <category>천안 가볼만한 곳</category>
      <category>천호저수지</category>
      <category>천호지</category>
      <category>프로젝트</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/360</guid>
      <comments>https://ehpro.tistory.com/360#entry360comment</comments>
      <pubDate>Sun, 19 Jan 2025 11:24:15 +0900</pubDate>
    </item>
    <item>
      <title>1. 2 개요</title>
      <link>https://ehpro.tistory.com/359</link>
      <description>&lt;div data-v-4e6bf9d7=&quot;&quot;&gt;
&lt;div data-v-4e6bf9d7=&quot;&quot;&gt;
&lt;div data-v-4e6bf9d7=&quot;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;SE-816e88ec-69fa-4edd-9602-c4571df2dd5d&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p id=&quot;SE-c6e241b8-6016-4642-8a8b-d1e8ae3c031f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;이 책은 웹 검색 엔진을 구성하는 다양한 엔진과 모듈을 제작하는 방법을 다루고 있습니다. 따라서 하나의 프로젝트가 아닌 여러 개의 프로젝트로 나누어 작업을 진행해야 합니다. 그리고 이 책에서는 단순히 웹 검색 엔진을 구현하는 것만을 다루는 것이 아니라 개발 전체 공정에 관해서도 다루고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2a99fc07-385e-4a2b-a1aa-27912bec556c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d0eab256-5878-43d6-a609-990d93c87f16&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;웹 검색 엔진을 만드는 전체 공정은 시나리오에서 출발하여 요구 분석 및 정의 단계, 아키텍쳐링 단계, 설계 단계, 구현 단계로 나누어 진행할 것입니다. 이를 위해 구현에 필요한 개발 도구만 사용하는 것이 아니라 CASE 도구를 사용하여 다양한 다이어그램을 작성도 해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c6ff5cab-c5f5-4deb-921f-6f8bc5f6cdc9&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-a28450c9-a2c2-4e25-abf0-453af797761f&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;CASE 도구로는 Rational 사의 Rose, 볼랜드 사의 Together, 오픈 프로젝트인 Star UML 등이 있습니다. 이 책에서는 쉽게 구하고 사용할 수 있는 Star UML을 사용하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-68f323e0-89db-42ac-a68c-b631f231572b&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bab59b51-b4c1-45e9-b059-ea6fff628a9e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그리고 개발 환경은 Windows 운영 체제 기반으로 작성하고 언어는 C#으로 작성하였으며 DBMS는 MS SQL 2008 서버를 사용하였습니다. 구체적 구현을 위해 개발 환경 및 언어와 DBMS를 정한 것인데 구현 이전 단계의 대부분은 개발 환경이나 언어 등에 영향을 받지 않는 부분이 많기 때문에 다른 환경과 다른 언어를 사용하는 개발자에게도 도움이 될 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-2b745c81-b9db-4888-95b9-b4206ddc54e1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c790ac24-8795-4f6a-ab49-a837603eb836&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;특히 Java 언어를 사용하는 개발자는 어느 정도의 응용 능력을 갖고 있다면 충분히 이 책의 내용을 토대로 자신의 환경과 언어로 만드는 것이 문제되지 않을 것입니다. 경우에 따라 이 책의 내용을 이해하고 실습하기 위해 필요한 기술을 학습하면서 부가적인 기술도 습득할 수 있을 것이라 생각합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f8466ff4-b9c5-47b9-9b57-496dc809719e&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-448797dd-26b8-4e93-9aa6-d573eb34482c&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;물론 여러분께서 현재 가지고 있는 지식과 기술만 사용하고 새로운 학습에 도전 정신이 부족하다면 설계 과정이나 구체적 구현 과정에 들어섰을 때 힘들어 질 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-01ca190e-fefb-4356-a7f2-682496881025&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;부디 도전적이고 진취적인 자세로 학습하기를 소망합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=w3uXfc06wXc&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/dzxYVa/hyX4lKTU4P/rDKP0mWk4kMQfm3Kxtgio1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cHqUlk/hyX4x5EvLN/TOvFU4bagu25d4kYgrp8v1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Travel diary in Korea, Oeam Fork Village#외암리 민속마을&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/w3uXfc06wXc&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;아산 외암민속마을&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%86%A1%EC%95%85%EB%A9%B4%20%EC%99%B8%EC%95%94%EB%A6%AC%20188&amp;amp;addtype=1&amp;amp;confirmid=17112656&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A503710%2C%22mapCenterY%22%3A897683%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A503710%2C%22y%22%3A897688%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84%22%2C%22confirmid%22%3A17112656%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=503710&amp;amp;mapY=897683&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420031000&amp;amp;tel=041-541-0848&amp;amp;title=%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737253298874&quot; id=&quot;maps_1737253298874&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%86%A1%EC%95%85%EB%A9%B4%20%EC%99%B8%EC%95%94%EB%A6%AC%20188&amp;amp;addtype=1&amp;amp;confirmid=17112656&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A503710%2C%22mapCenterY%22%3A897683%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A503710%2C%22y%22%3A897688%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84%22%2C%22confirmid%22%3A17112656%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=503710&amp;amp;mapY=897683&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420031000&amp;amp;tel=041-541-0848&amp;amp;title=%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=503710%2C897683&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A503710%2C897688&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>닷넷 프로젝트</category>
      <category>아산 가볼만한 곳</category>
      <category>외암마을</category>
      <category>외암민속마을</category>
      <category>웹 검색 엔진 만들기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/359</guid>
      <comments>https://ehpro.tistory.com/359#entry359comment</comments>
      <pubDate>Sun, 19 Jan 2025 11:22:10 +0900</pubDate>
    </item>
    <item>
      <title>1. 1 검색 엔진</title>
      <link>https://ehpro.tistory.com/358</link>
      <description>&lt;p id=&quot;SE-1cb4f44d-e1f2-4545-98bc-bd722aef40ab&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;여러분도 잘 아시는 것처럼 검색 엔진은 사용자가 원하는 정보를 검색해 주는 도구나 서비스를 말합니다. 특히 웹 검색 엔진은 웹 상에 게시되어 있는 수 많은 웹 페이지의 내용에서 원하는 정보를 검색해 주는 엔진입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-946a1fc9-2c43-4461-b102-e34ae7c2e188&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;이러한 검색 엔진은 방대한 자료에서 빠르고 정확하게 원하는 정보를 검색하는 것이 중요합니다. 만약 자료의 양이 많지 않다면 굳이 고사양의 검색 엔진은 필요하지 않을 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-bd249c26-b7f0-440f-8031-f3e5983f2d17&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-1c652b3e-2a07-46ef-a7e8-9e03f6770d4a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;따라서 검색 엔진은 방대한 자료를 수집하는 작업이 필요합니다. 그리고 수집한 자료를 분석하는 작업, 분석한 결과를 검색하기 쉽게 가공하는 작업, 검색 작업과 검색한 결과를 선별 및 순위를 정하는 등의 작업이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-f5101069-1404-4671-bef3-7d3ffdd54e4f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-ef966f3c-f645-45be-b3b0-d7efb9b608c9&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;웹 검색 엔진의 구성을 살펴보면 게시한 웹 페이지를 수집하는 웹 로봇과 수집한 웹 페이지 내용을 분석하는 분석 로봇, 분석한 결과를 색인하는 색인 로봇, 검색 요청을 받아 색인 자료를 통해 검색 결과를 얻어오는 검색 엔진으로 구성합니다. 그리고 검색 결과를 순위화하는 랭킹 모듈 등을 추가로 구성하여 품질 수준을 높일 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.2-웹-검색-엔진-구성.png&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wWIjl/btsLTo7FRt7/HqS8sK8mI2o9WRlNlQ3oL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wWIjl/btsLTo7FRt7/HqS8sK8mI2o9WRlNlQ3oL0/img.png&quot; data-alt=&quot;웹 검색 엔진 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wWIjl/btsLTo7FRt7/HqS8sK8mI2o9WRlNlQ3oL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwWIjl%2FbtsLTo7FRt7%2FHqS8sK8mI2o9WRlNlQ3oL0%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;1057&quot; height=&quot;571&quot; data-filename=&quot;그림-1.2-웹-검색-엔진-구성.png&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹 검색 엔진 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bgxUnQ/hyX4pNi8VC/ZrKFv5EKKqddiNKlhPinOk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/68xzh/hyX4spIYGZ/5wY8MI3MM1g3sxErnX0Ld1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Travel diary in Korea, the Independence Hall of Korea.#독립기념관&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%AA%A9%EC%B2%9C%EC%9D%8D%20%EB%82%A8%ED%99%94%EB%A6%AC%20230-1&amp;amp;addtype=1&amp;amp;confirmid=7834305&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A549720%2C%22mapCenterY%22%3A912568%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A549722%2C%22y%22%3A912572%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EB%8F%85%EB%A6%BD%EA%B8%B0%EB%85%90%EA%B4%80%22%2C%22confirmid%22%3A7834305%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=549720&amp;amp;mapY=912568&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413125000&amp;amp;tel=041-560-0114&amp;amp;title=%EB%8F%85%EB%A6%BD%EA%B8%B0%EB%85%90%EA%B4%80&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737238266317&quot; id=&quot;maps_1737238266317&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EB%AA%A9%EC%B2%9C%EC%9D%8D%20%EB%82%A8%ED%99%94%EB%A6%AC%20230-1&amp;amp;addtype=1&amp;amp;confirmid=7834305&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A549720%2C%22mapCenterY%22%3A912568%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A549722%2C%22y%22%3A912572%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EB%8F%85%EB%A6%BD%EA%B8%B0%EB%85%90%EA%B4%80%22%2C%22confirmid%22%3A7834305%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=549720&amp;amp;mapY=912568&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413125000&amp;amp;tel=041-560-0114&amp;amp;title=%EB%8F%85%EB%A6%BD%EA%B8%B0%EB%85%90%EA%B4%80&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=549720%2C912568&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A549722%2C912572&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>독립기념관</category>
      <category>만들기</category>
      <category>웹 검색 엔진</category>
      <category>프로젝트</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/358</guid>
      <comments>https://ehpro.tistory.com/358#entry358comment</comments>
      <pubDate>Sun, 19 Jan 2025 07:11:09 +0900</pubDate>
    </item>
    <item>
      <title>1. 검색 엔진 소개 및 개요</title>
      <link>https://ehpro.tistory.com/357</link>
      <description>&lt;p id=&quot;SE-89a8487b-81a5-4028-b7ce-e744132b1fda&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;최근 인터넷의 발달로 다양한 정보를 웹을 통해 얻습니다. 특히 개인 블로그 및 커뮤니티 사이트, 소셜 사이트의 증가로 정보 공급자와 정보 사용자의 경계가 사라져가고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-6fad8765-bb3a-4f0a-bb1e-1b8f2ce6103f&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5827ea28-f8e4-4dc1-80d9-f92692d980ab&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;이처럼 다양한 형태의 방대한 자료가 웹 상에 만들어지고 있어 효과적인 검색을 위한 검색 엔진들을 연구하고 만들어지고 있습니다. 특히 검색 엔진은 기존의 포털 사이트에서 제공하는 서비스였지만 소셜 사이트 및 다양한 정보 서비스를 위해 필요한 곳이 많아집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-d176aae3-e0cb-410e-960b-3c65769359a3&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-3cc4e152-7515-4674-82f3-890ddb5dba94&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;이 책에서는 기존 웹 검색 엔진을 만드는 전체 공정을 순서대로 하나 하나 설명하고 궁극적으로 서비스 목적에 맞는 검색 엔진을 만들 수 있게 할 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;그림-1.1-정보의-바다.png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rk43l/btsLTsoG1OM/xCw8vp4wO5GKBFDjU1FzAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rk43l/btsLTsoG1OM/xCw8vp4wO5GKBFDjU1FzAk/img.png&quot; data-alt=&quot;정보의 바다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rk43l/btsLTsoG1OM/xCw8vp4wO5GKBFDjU1FzAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frk43l%2FbtsLTsoG1OM%2FxCw8vp4wO5GKBFDjU1FzAk%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;590&quot; height=&quot;389&quot; data-filename=&quot;그림-1.1-정보의-바다.png&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정보의 바다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=w3uXfc06wXc&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/dzxYVa/hyX4lKTU4P/rDKP0mWk4kMQfm3Kxtgio1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cHqUlk/hyX4x5EvLN/TOvFU4bagu25d4kYgrp8v1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Travel diary in Korea, Oeam Fork Village#외암리 민속마을&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/w3uXfc06wXc&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;아산 외암민속마을&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%86%A1%EC%95%85%EB%A9%B4%20%EC%99%B8%EC%95%94%EB%A6%AC%20188&amp;amp;addtype=1&amp;amp;confirmid=17112656&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A503710%2C%22mapCenterY%22%3A897683%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A503710%2C%22y%22%3A897688%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84%22%2C%22confirmid%22%3A17112656%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=503710&amp;amp;mapY=897683&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420031000&amp;amp;tel=041-541-0848&amp;amp;title=%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737238128859&quot; id=&quot;maps_1737238128859&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%95%84%EC%82%B0%EC%8B%9C%20%EC%86%A1%EC%95%85%EB%A9%B4%20%EC%99%B8%EC%95%94%EB%A6%AC%20188&amp;amp;addtype=1&amp;amp;confirmid=17112656&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A503710%2C%22mapCenterY%22%3A897683%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A503710%2C%22y%22%3A897688%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84%22%2C%22confirmid%22%3A17112656%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=503710&amp;amp;mapY=897683&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4420031000&amp;amp;tel=041-541-0848&amp;amp;title=%EC%99%B8%EC%95%94%EB%AF%BC%EC%86%8D%EB%A7%88%EC%9D%84&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=503710%2C897683&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A503710%2C897688&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>닷넷</category>
      <category>아산 가볼만한 곳</category>
      <category>외암민속마을</category>
      <category>웹 검색 엔진 만들기</category>
      <category>프로그램</category>
      <category>프로젝트</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/357</guid>
      <comments>https://ehpro.tistory.com/357#entry357comment</comments>
      <pubDate>Sun, 19 Jan 2025 07:09:21 +0900</pubDate>
    </item>
    <item>
      <title>0. 들어가기에 앞서</title>
      <link>https://ehpro.tistory.com/356</link>
      <description>&lt;p id=&quot;SE-1f0d116c-acd9-4709-a001-63e38f6c3bd8&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;2000년 무렵에 케이블 인터넷과 ADSL기술을 도입하면서 초고속 인터넷을 보급하던 때만 하더라도 웹 사이트에 글을 포스팅하는 것은 업체나 기관에서 할 일이라 생각했지요.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-16fe6e2c-6ce9-4255-912e-f86ca3f9d3b4&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-76318604-b3f7-40a8-a07c-37d8018ec5ec&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;그런데 지금은 SNS의 등장을 비롯하여 많은 곳에서 All IP 시대로 가기 위한 준비를 하면서 웹 사이트를 방문하는 지식 소비자와 웹 사이트를 구축하고 지식 포워딩하는 지식 공급자가 뚜렷하게 나눌 수 없는 프로슈머 형태를 지니고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-62e3ef4b-6ed5-4aef-a5a5-daf7634edbb2&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-292da915-4fdb-42da-a7e0-cdd7716b59ac&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;시멘틱 검색 엔진이라는 것이 세상에 모습을 드러낼 때만 해도 포털 사이트에서만 사용할 기술처럼 생각했습니다. 그리고 새로 포스팅하는 자료의 양이 지금에 비해 적어 높은 수준의 기술을 요구하지 않았었죠. 하지만 지금은 일반 사용자들도 자신의 블로그나 SNS에 일상과 자신의 취미 생활 및 기술을 포스팅하고 있어 압도적인 자료를 새로 생산하고 있으며 이에 높은 기술 수준의 검색 엔진을 요구하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-af072fc6-0677-49af-8610-1e2265cdd258&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-c5522ccd-9006-471a-9665-6d274e53a5fd&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;자료가 많지 않던 시절에는 과도히 많은 자료가 생기면 오히려 필요한 자료를 찾기 힘들다는 논리를 펼치던 시절도 있었습니다. 하지만 지금에 와서는 이들 자료를 효과적으로 통계를 내고 분석하여 필요한 정보를 추출하는 기술의 발달로 자료가 축적되고 변화하는 모습에 따라 지식에도 생명이 있음을 인지하는 수준에 도달하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5b03a817-6c99-43fd-9c34-225d8ad65c07&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-5536160b-48fd-4912-ba7c-8dbcc34614d7&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;이제 시멘틱 검색 엔진은 포탈 사이트에서만 필요한 기술이 아닌 수 많은 서비스에서 사용해야 할 기술로 변하고 있습니다. 여러분들이 이 책을 통해 시멘틱 검색 엔진을 만들기 위한 기본적인 기술을 익혀 다양한 분야에 활용할 수 있었으면 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-46a65f59-ee59-450b-8966-f5a7b33fc28a&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #373b41;&quot;&gt;​&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;SE-586736f0-bd47-486f-b6aa-047d10103553&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41;&quot;&gt;자료가 모이고 이를 통계 및 분석을 통해 지식에 생명을 불어 넣듯이 우리의 기술이 모여 삶의 질 향상에 이바지할 수 있기를 기원합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=Xgj6w9S6Zgc&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/NF2pY/hyX0o3yShZ/u2P81KIxkmrjmBdOUDCID1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bLNw3O/hyX4pfra7s/JTzUBvmo6Kpb1JBL35WxUK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Travel diary in Korea, Cheonan Cheonho Lake!#천호지&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Xgj6w9S6Zgc&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;천안 천호지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;iframe mapdata=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%95%88%EC%84%9C%EB%8F%99%20470&amp;amp;addtype=1&amp;amp;confirmid=15151284&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A537865%2C%22mapCenterY%22%3A926373%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A537869%2C%22y%22%3A926378%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B2%9C%ED%98%B8%EC%A0%80%EC%88%98%EC%A7%80%22%2C%22confirmid%22%3A15151284%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=537865&amp;amp;mapY=926373&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413159000&amp;amp;tel=&amp;amp;title=%EC%B2%9C%ED%98%B8%EC%A0%80%EC%88%98%EC%A7%80&quot; src=&quot;/proxy/plusmapViewer.php?id=maps_1737237920327&quot; id=&quot;maps_1737237920327&quot; width=&quot;540px&quot; height=&quot;350px&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; data-ke-type=&quot;map&quot; data-maps-data=&quot;addr=%EC%B6%A9%EB%82%A8%20%EC%B2%9C%EC%95%88%EC%8B%9C%20%EB%8F%99%EB%82%A8%EA%B5%AC%20%EC%95%88%EC%84%9C%EB%8F%99%20470&amp;amp;addtype=1&amp;amp;confirmid=15151284&amp;amp;docid=&amp;amp;idx=1&amp;amp;ifrH=362px&amp;amp;ifrW=490px&amp;amp;mapHeight=362&amp;amp;mapInfo=%7B%22version%22%3A2%2C%22mapWidth%22%3A490%2C%22mapHeight%22%3A362%2C%22mapCenterX%22%3A537865%2C%22mapCenterY%22%3A926373%2C%22mapLevel%22%3A4%2C%22coordinate%22%3A%22wcongnamul%22%2C%22markInfo%22%3A%5B%7B%22markerType%22%3A%22standPlace%22%2C%22coordinate%22%3A%22wcongnamul%22%2C%22x%22%3A537869%2C%22y%22%3A926378%2C%22clickable%22%3Atrue%2C%22draggable%22%3Atrue%2C%22icon%22%3A%7B%22width%22%3A35%2C%22height%22%3A56%2C%22offsetX%22%3A17%2C%22offsetY%22%3A56%2C%22src%22%3A%22%26%23x2F%3B%26%23x2F%3Bt1.daumcdn.net%26%23x2F%3Blocalimg%26%23x2F%3Blocalimages%26%23x2F%3B07%26%23x2F%3B2012%26%23x2F%3Battach%26%23x2F%3Bpc_img%26%23x2F%3Bico_marker2_150331.png%22%7D%2C%22content%22%3A%22%EC%B2%9C%ED%98%B8%EC%A0%80%EC%88%98%EC%A7%80%22%2C%22confirmid%22%3A15151284%7D%5D%2C%22graphicInfo%22%3A%5B%5D%2C%22roadviewInfo%22%3A%5B%5D%7D&amp;amp;mapWidth=490&amp;amp;mapX=537865&amp;amp;mapY=926373&amp;amp;map_hybrid=false&amp;amp;map_level=4&amp;amp;map_type=TYPE_MAP&amp;amp;rcode=4413159000&amp;amp;tel=&amp;amp;title=%EC%B2%9C%ED%98%B8%EC%A0%80%EC%88%98%EC%A7%80&quot; data-maps-thumbnail=&quot;https://ssl.daumcdn.net/map3/staticmap/image?center=537865%2C926373&amp;amp;lv=4&amp;amp;size=540x350&amp;amp;srs=WCONGNAMUL&amp;amp;markers=symbol%3Asc_marker%7Clocation%3A537869%2C926378&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/웹 검색엔진 만들기</category>
      <category>만들기</category>
      <category>웹 검색 엔진</category>
      <category>천호지</category>
      <category>프로그램</category>
      <category>프로젝트</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/356</guid>
      <comments>https://ehpro.tistory.com/356#entry356comment</comments>
      <pubDate>Sun, 19 Jan 2025 07:05:30 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 연결리스트를 이용하여 구현한 큐</title>
      <link>https://ehpro.tistory.com/355</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=oe-V17Wu9As&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bwEsLn/hyXWtDIVqL/oBA3tJUpxlU041W6IJizT1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/b4z1oq/hyXWxsxkio/d6hnCb5Sw7ZHAKxYwH8QXK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[언제나 C언어] 연결리스트로 Queue 구현하기 [예제 Center]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/oe-V17Wu9As&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[C언어 소스] 연결리스트를 이용하여 구현한 큐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나 휴일이예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 연결리스트를 이용하여 구현한 큐의 소스 코드예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;큐는 자료를 한쪽으로 보관하고 다른쪽에서 꺼내는 FIFO(First In First Out) 방식의 자료구조입니다. 큐에 자료를 보관하는 연산을 PUT 혹은 ENQUEUE라 말하고 꺼내는 연산을 GET 혹은 DEQUEUE라고 말합니다. 그리고 보관할 위치 정보를 rear, 꺼낼 위치 정보를 front라고 말해요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;연결리스트를 이용하여 구현한 큐에서는 보관할 때 rear 뒤에 보관하고 꺼낼 때 front에 있는 것을 꺼냅니다. 그리고 보관할 때 허용하는 메모리 범위 내에서 보관할 수 있어 꽉 찼는지 확인할 필요가 없습니다.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PUT&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;연산&lt;/b&gt;&lt;br /&gt;now = MakeNode(data) (노드&lt;span&gt;&amp;nbsp;&lt;/span&gt;생성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IF Queue Is Empty (비어있을&lt;span&gt;&amp;nbsp;&lt;/span&gt;때)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; front = now (front를&lt;span&gt;&amp;nbsp;&lt;/span&gt;now로&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정)&lt;br /&gt;Else (비어있지&lt;span&gt;&amp;nbsp;&lt;/span&gt;않을&lt;span&gt;&amp;nbsp;&lt;/span&gt;때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rear의&lt;span&gt;&amp;nbsp;&lt;/span&gt;next= now (rear의&lt;span&gt;&amp;nbsp;&lt;/span&gt;netx를&lt;span&gt;&amp;nbsp;&lt;/span&gt;now로&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정)&lt;br /&gt;rear=now (rear를&lt;span&gt;&amp;nbsp;&lt;/span&gt;now로&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GET&amp;nbsp;&lt;/b&gt;&lt;b&gt;연산&lt;/b&gt;&lt;br /&gt;IF Queue is empty Then (비었으면)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Underflow (버퍼&lt;span&gt;&amp;nbsp;&lt;/span&gt;언더플로우)&lt;br /&gt;Else&lt;br /&gt;&amp;nbsp; now = front&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data&amp;nbsp;= front의&lt;span&gt;&amp;nbsp;&lt;/span&gt;data (data를&lt;span&gt;&amp;nbsp;&lt;/span&gt;front의&lt;span&gt;&amp;nbsp;&lt;/span&gt;data로&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fornt =now의&lt;span&gt;&amp;nbsp;&lt;/span&gt;next &amp;nbsp;(front를&lt;span&gt;&amp;nbsp;&lt;/span&gt;now의&lt;span&gt;&amp;nbsp;&lt;/span&gt;next로&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DisposeNode(now) (now&lt;span&gt;&amp;nbsp;&lt;/span&gt;노드&lt;span&gt;&amp;nbsp;&lt;/span&gt;소멸)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;data&lt;span&gt;&amp;nbsp;&lt;/span&gt;반환&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;큐_연결리스트.png&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl5loq/btsLHt3oSng/ZVpKWf4u0dGuuyDNssCrEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl5loq/btsLHt3oSng/ZVpKWf4u0dGuuyDNssCrEk/img.png&quot; data-alt=&quot;원형 큐 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl5loq/btsLHt3oSng/ZVpKWf4u0dGuuyDNssCrEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl5loq%2FbtsLHt3oSng%2FZVpKWf4u0dGuuyDNssCrEk%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;433&quot; height=&quot;87&quot; data-filename=&quot;큐_연결리스트.png&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;원형 큐 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//큐 - 연결리스트 이용
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

typedef struct Node //노드 정의
{
    int data;
    struct Node *next;
}Node;


typedef struct Queue //Queue 구조체 정의
{
    Node *front; //맨 앞(꺼낼 위치)
    Node *rear; //맨 뒤(보관할 위치)
    int count;//보관 개수
}Queue;

void InitQueue(Queue *queue);//큐 초기화
int IsEmpty(Queue *queue); //큐가 비었는지 확인
void Enqueue(Queue *queue, int data); //큐에 보관
int Dequeue(Queue *queue); //큐에서 꺼냄

int main(void)
{
    int i;
    Queue queue;

    InitQueue(&amp;amp;queue);//큐 초기화
    for (i = 1; i &amp;lt;= 5; i++)//1~5까지 큐에 보관
    {
        Enqueue(&amp;amp;queue, i);
    }
    while (!IsEmpty(&amp;amp;queue))//큐가 비어있지 않다면 반복
    {
        printf(&quot;%d &quot;, Dequeue(&amp;amp;queue));//큐에서 꺼내온 값 출력
    }
    printf(&quot;\n&quot;);
    return 0;
}

void InitQueue(Queue *queue)
{
    queue-&amp;gt;front = queue-&amp;gt;rear = NULL; //front와 rear를 NULL로 설정
    queue-&amp;gt;count = 0;//보관 개수를 0으로 설정
}

int IsEmpty(Queue *queue)
{
    return queue-&amp;gt;count == 0;    //보관 개수가 0이면 빈 상태
}

void Enqueue(Queue *queue, int data)
{
    Node *now = (Node *)malloc(sizeof(Node)); //노드 생성
    now-&amp;gt;data = data;//데이터 설정
    now-&amp;gt;next = NULL;

    if (IsEmpty(queue))//큐가 비어있을 때
    {
        queue-&amp;gt;front = now;//맨 앞을 now로 설정       
    }
    else//비어있지 않을 때
    {
        queue-&amp;gt;rear-&amp;gt;next = now;//맨 뒤의 다음을 now로 설정
    }
    queue-&amp;gt;rear = now;//맨 뒤를 now로 설정   
    queue-&amp;gt;count++;//보관 개수를 1 증가
}

int Dequeue(Queue *queue)
{
    int re = 0;
    Node *now;
    if (IsEmpty(queue))//큐가 비었을 때
    {
        return re;
    }
    now = queue-&amp;gt;front;//맨 앞의 노드를 now에 기억
    re = now-&amp;gt;data;//반환할 값은 now의 data로 설정
    queue-&amp;gt;front = now-&amp;gt;next;//맨 앞은 now의 다음 노드로 설정
    free(now);//now 소멸
    queue-&amp;gt;count--;//보관 개수를 1 감소
    return re;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bumgcd/hyXWqfVd1R/jVsAUSI1zaKy2a169wzmZ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/KVEAz/hyX0tvgg87/tyMdzo3tkK7v2Nx7OxRUQ0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>c언어</category>
      <category>dequeue</category>
      <category>dequeue 연산</category>
      <category>enqueue</category>
      <category>enqueue 연산</category>
      <category>GET 연산</category>
      <category>PUT 연산</category>
      <category>put연산</category>
      <category>소스 코드</category>
      <category>연결리스트</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/355</guid>
      <comments>https://ehpro.tistory.com/355#entry355comment</comments>
      <pubDate>Thu, 9 Jan 2025 12:00:50 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 부분 문자열 복사하는 함수 만들기(버퍼 오버플로우 방지)</title>
      <link>https://ehpro.tistory.com/354</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;알고리즘&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부분 문자열 복사(dest: 버퍼, dsize:버퍼 길이, src: 원본 문자열, n:복사할 문자 개수)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;origin:= dest&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복(dsize와 n이 참이고 dest 가리키는 곳에 src가 가리키는 문자 대입)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dest와 src를 다음 위치로 증가, dsize 1감소, n 1감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;origin 반환&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;부분 문자열 복사2.png&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgYwQ6/btsLGMQkprQ/IeGjcKvxwBnWVvBZGpxdV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgYwQ6/btsLGMQkprQ/IeGjcKvxwBnWVvBZGpxdV0/img.png&quot; data-alt=&quot;부분 문자열 복사 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgYwQ6/btsLGMQkprQ/IeGjcKvxwBnWVvBZGpxdV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgYwQ6%2FbtsLGMQkprQ%2FIeGjcKvxwBnWVvBZGpxdV0%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;507&quot; height=&quot;139&quot; data-filename=&quot;부분 문자열 복사2.png&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부분 문자열 복사 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//부분 문자열 복사하는 함수 만들기 - 버퍼 오버플로우 방지
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
char *mystrncpy_s(char *dest, size_t dsize, const char *src, size_t n);
int main(void)
{
    char source[100] = &quot;Hello World&quot;;
    char dest[100] = &quot;abcde Yahoo&quot;;
    
    printf(&quot;원본 문자열:%s 의 5개 문자 복사\n&quot;, source);
    printf(&quot;복사 전 현재 결과 문자열:%s\n&quot;, dest);
    mystrncpy_s(dest, sizeof(dest), source, 5);
    printf(&quot;복사 후 결과 문자열: %s\n&quot;, dest);
    return 0;
}

char *mystrncpy_s(char *dest, size_t dsize, const char *src, size_t n)
{
    char *origin;

    dsize--;//맨 마지막에 종료 문자('\0')를 추가해야 하므로 버퍼 길이를 1 감소    

    //dsize와 n이 참이고 복사한 문자가 참이면 반복
    for (origin = dest; dsize &amp;amp;&amp;amp; n &amp;amp;&amp;amp; (*dest = *src); dest++, src++, n--, dsize--);
    return origin;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bumgcd/hyXWqfVd1R/jVsAUSI1zaKy2a169wzmZ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/KVEAz/hyX0tvgg87/tyMdzo3tkK7v2Nx7OxRUQ0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C언어 예제 및 소스</category>
      <category>c언어</category>
      <category>strtncpy_s 함수</category>
      <category>독립기념관</category>
      <category>부분 문자열 복사</category>
      <category>소스 코드</category>
      <category>함수 만들기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/354</guid>
      <comments>https://ehpro.tistory.com/354#entry354comment</comments>
      <pubDate>Thu, 9 Jan 2025 11:30:24 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 부분 문자열 복사하는 함수 만들기</title>
      <link>https://ehpro.tistory.com/353</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부분 문자열 복사하기(dest:복사할 버퍼, src: 원본 문자열, n:복사할 문자 개수)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;origin:= dest&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복(n이 0보다 크면서 dest가 가리키는 곳에 src가 가리키는 문자 대입)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dest와 src를 다음 위치로 증가, n 1감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;origin 반환&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;부분 문자열 복사.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GgmWu/btsLIBfislY/tWgLE0LQYEWnTr2pJ4KfT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GgmWu/btsLIBfislY/tWgLE0LQYEWnTr2pJ4KfT0/img.png&quot; data-alt=&quot;부분 문자열 복사 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GgmWu/btsLIBfislY/tWgLE0LQYEWnTr2pJ4KfT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGgmWu%2FbtsLIBfislY%2FtWgLE0LQYEWnTr2pJ4KfT0%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;510&quot; height=&quot;135&quot; data-filename=&quot;부분 문자열 복사.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부분 문자열 복사 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br /&gt;&lt;b&gt;소스코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//부분 문자열 복사하는 함수 만들기
#include &amp;lt;stdio.h&amp;gt;

char *mystrncpy(char *dest, const char *src, size_t n);
int main(void)
{
    char source[100] = &quot;Hello World&quot;;
    char dest[100] = &quot;abcde Yahoo&quot;;

    printf(&quot;원본 문자열:%s 의 5개 문자 복사\n&quot;, source);
    printf(&quot;복사 전 현재 결과 문자열:%s\n&quot;, dest);
    mystrncpy(dest, source, 5);
    printf(&quot;복사 후 결과 문자열: %s\n&quot;, dest);

    return 0;
}

char *mystrncpy(char *dest, const char *src, size_t n)
{
    char *origin;

    //n이 참이고 복사한 문자가 참이면 반복
    for (origin = dest; n &amp;amp;&amp;amp; (*dest = *src); dest++, src++, n--);
    return origin;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bumgcd/hyXWqfVd1R/jVsAUSI1zaKy2a169wzmZ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/KVEAz/hyX0tvgg87/tyMdzo3tkK7v2Nx7OxRUQ0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C언어 예제 및 소스</category>
      <category>c언어</category>
      <category>strncpy 함수</category>
      <category>strncpy_s 함수</category>
      <category>독립기념관</category>
      <category>부분 문자열 복사</category>
      <category>소스 코드</category>
      <category>함수 만들기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/353</guid>
      <comments>https://ehpro.tistory.com/353#entry353comment</comments>
      <pubDate>Thu, 9 Jan 2025 11:00:22 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 문자열 복사하는 함수 만들기(버퍼 오버플로우 방지)</title>
      <link>https://ehpro.tistory.com/352</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 복사하기(dest:복사할 버퍼, dsize:버퍼 길이, src: 원본 문자열)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.dsize 1감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;..origin:= dest&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.반복(dsize가 참이면서 dest가 가리키는 곳에 src가 가리키는 문자 대입)//대입한 결과가 참이면 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;&amp;hellip;..dest와 src를 다음 위치로 증가, dsize 1감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.dest가 가리키는 곳에 종료 문자 대입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.origin 반환&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;문자열복사_S.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbVJck/btsLHziqNwO/mjWpIKHebENpRqCdwujjxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbVJck/btsLHziqNwO/mjWpIKHebENpRqCdwujjxk/img.png&quot; data-alt=&quot;문자열 복사 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbVJck/btsLHziqNwO/mjWpIKHebENpRqCdwujjxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbVJck%2FbtsLHziqNwO%2FmjWpIKHebENpRqCdwujjxk%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;510&quot; height=&quot;135&quot; data-filename=&quot;문자열복사_S.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문자열 복사 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//문자열 복사 - 버퍼 오버플로우 방지
#include &amp;lt;stdio.h&amp;gt;

char *mystrcpy_s(char *dest, size_t dsize, const char *src);
int main(void)
{
    char source[100] = &quot;Hello World&quot;;
    char dest[100];
    
    printf(&quot;원본 문자열:%s\n&quot;, source);
    mystrcpy_s(dest, sizeof(dest), source);
    printf(&quot;복사 결과 문자열: %s\n&quot;, dest);

    return 0;
}

char *mystrcpy_s(char *dest, size_t dsize, const char *src)
{
    char *origin;

    dsize--;//맨 마지막에 종료 문자('\0')를 추가해야 하므로 버퍼 길이를 1 감소

    //dsize가 0이 아니고 복사한 문자가 참이면 반복
    for (origin = dest; (dsize) &amp;amp;&amp;amp; (*dest = *src); dest++, src++, dsize--);
    *dest = 0;//종료 문자 복사
    return origin;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;br /&gt;&lt;br /&gt;&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bumgcd/hyXWqfVd1R/jVsAUSI1zaKy2a169wzmZ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/KVEAz/hyX0tvgg87/tyMdzo3tkK7v2Nx7OxRUQ0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C언어 예제 및 소스</category>
      <category>c언어</category>
      <category>strcpy_s 함수</category>
      <category>독립기념관</category>
      <category>문자열 복사</category>
      <category>버퍼 오버플로우 버그 개선</category>
      <category>함수 만들기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/352</guid>
      <comments>https://ehpro.tistory.com/352#entry352comment</comments>
      <pubDate>Thu, 9 Jan 2025 10:30:18 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 문자열 복사하는 함수 만들기</title>
      <link>https://ehpro.tistory.com/351</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=wwuszQSKS_c&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/lEUWq/hyXWnwIRqh/K5LX3S79U50VIAZ6iccUEk/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/bwIj7s/hyX0t9SHNj/KMyJhrTDJWTnNZhFQbdKz0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;문자열 복사 strcpy 함수와 strcpy s 함수 만들고 사용하기 [C언어 표준 라이브러리 함수 가이드]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/wwuszQSKS_c&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[C언어 소스] 문자열 복사하는 함수 만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 복사하기(dest:복사할 버퍼, src: 원본 문자열)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.origin:= dest&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.반복(dest가 가리키는 곳에 src가 가리키는 문자 대입) //대입한 결과가 참이면 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;&amp;hellip;..dest와 src를 다음 위치로 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.origin 반환&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;문자열 복사.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFVk50/btsLIyCQhRo/HvKPZP3OOOGrR4QNovKZC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFVk50/btsLIyCQhRo/HvKPZP3OOOGrR4QNovKZC0/img.png&quot; data-alt=&quot;문자열 복사 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFVk50/btsLIyCQhRo/HvKPZP3OOOGrR4QNovKZC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFVk50%2FbtsLIyCQhRo%2FHvKPZP3OOOGrR4QNovKZC0%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;510&quot; height=&quot;135&quot; data-filename=&quot;문자열 복사.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문자열 복사 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//문자열 복사하는 함수 만들기
#include &amp;lt;stdio.h&amp;gt;

char *mystrcpy(char *dest, const char *src);
int main(void)
{
    char source[100] = &quot;Hello World&quot;;
    char dest[100];

    printf(&quot;원본 문자열:%s\n&quot;, source);
    mystrcpy(dest, source);
    printf(&quot;복사 결과 문자열: %s\n&quot;, dest);
    return 0;
}

char *mystrcpy(char *dest, const char *src)
{
    char *origin;
    for (origin = dest; *dest = *src; dest++, src++);//복사한 문자가 참이면 반복
    return origin;
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;br /&gt;&lt;br /&gt;&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bumgcd/hyXWqfVd1R/jVsAUSI1zaKy2a169wzmZ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/KVEAz/hyX0tvgg87/tyMdzo3tkK7v2Nx7OxRUQ0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C언어 예제 및 소스</category>
      <category>c언어</category>
      <category>strcpy 함수</category>
      <category>strncpy 함수</category>
      <category>독립기념관</category>
      <category>문자열 복사</category>
      <category>소스 코드</category>
      <category>함수 만들기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/351</guid>
      <comments>https://ehpro.tistory.com/351#entry351comment</comments>
      <pubDate>Thu, 9 Jan 2025 10:00:54 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 부분 문자열 비교하는 함수 만들기</title>
      <link>https://ehpro.tistory.com/350</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;부분 문자열 비교(str1:비교 대상 문자열1, str2: 비교 대상 문자열 2, n:비교할 문자 개수)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.반복(n이 0보다 크면서 str이 가리키는 문자가 참이면서 str1과 str2가 가리키는 문자가 서로 같으면)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;&amp;hellip;..str1과 str2를 다음 위치로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;&amp;hellip;..n을 1 감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.str1과 str2가 가리키는 문자의 차이 반환&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;문자열복사.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO83dc/btsLGPTQe68/3bPk2Rt2tWlXRkVTwgYMs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO83dc/btsLGPTQe68/3bPk2Rt2tWlXRkVTwgYMs1/img.png&quot; data-alt=&quot;부분 문자열 비교 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO83dc/btsLGPTQe68/3bPk2Rt2tWlXRkVTwgYMs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO83dc%2FbtsLGPTQe68%2F3bPk2Rt2tWlXRkVTwgYMs1%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;510&quot; height=&quot;135&quot; data-filename=&quot;문자열복사.png&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;135&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부분 문자열 비교 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소스코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//부분 문자열 비교하는 함수 만들기
#include &amp;lt;stdio.h&amp;gt;

int mystrlen(const char *str);
//사전식 비교: 사전에 앞에 나오는 단어가 작고 뒤에 나오는 단어가 크다고 판별
//차이가 없으면 0 반환
int mystrncmp(const char *str1, const char *str2, size_t n);
int main(void)
{
    char src[100] = &quot;This is test1. He is a student. She is a teacher.&quot;;
    char key[10] = &quot;is&quot;;
    int len;
    int i;

    len = mystrlen(key);
    printf(&quot;원본 문자열:%s\n\n&quot;, src);
    printf(&quot;is로 시작하는 부분 문자열 목록\n\n&quot;);
    for (i = 0; src[i]; i++)
    {
        if (mystrncmp(src + i, key, len) == 0)//부분 문자열 비교 결과가 0일 때
        {
            printf(&quot;%s\n&quot;, src + i);
        }
    }

    return 0;
}

int mystrlen(const char *str)
{
    int cnt;
    //str[cnt]가 거짓 문자(종료 문자, '\0')가 나올 때까지 cnt를 1증가
    for (cnt = 0; str[cnt]; cnt++);
    return cnt;
}

int mystrncmp(const char *str1, const char *str2, size_t n)
{
    //비교할 개수 n이 0이거나
    //str1이 가리키는 문자가 종료 문자나 str1과 str2가 가리키는 문자가 다를 때까지 반복
    for (n--; n&amp;amp;&amp;amp; *str1 &amp;amp;&amp;amp; (*str1 == *str2); str1++, str2++)
    {
        n--;
    }
    return *str1 - *str2;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bumgcd/hyXWqfVd1R/jVsAUSI1zaKy2a169wzmZ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/KVEAz/hyX0tvgg87/tyMdzo3tkK7v2Nx7OxRUQ0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>c언어</category>
      <category>strncmp 함수</category>
      <category>독립기념관</category>
      <category>부분 문자열 비교</category>
      <category>함수 만들기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/350</guid>
      <comments>https://ehpro.tistory.com/350#entry350comment</comments>
      <pubDate>Thu, 9 Jan 2025 09:30:29 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 문자열 비교하는 함수 만들기</title>
      <link>https://ehpro.tistory.com/349</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=-mulxXCwmBQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/fNeSp/hyX0lqs0vP/5P9LDd6n9KzsSTAzHBd6q0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/bleSMn/hyX0sC8rWf/faklqi932NiGIA79AbUSik/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;strcmp 함수   문자열 비교 함수 사용 및 직접 만들기 [C언어 표준 함수 라이브러리]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/-mulxXCwmBQ&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 비교하기(str1:비교 대상 문자열1, str2: 비교 대상 문자열 2)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.반복(str이 가리키는 문자가 참이면서 str1과 str2가 가리키는 문자가 서로 같으면)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;&amp;hellip;&amp;hellip;str1과 str2를 다음 위치로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;hellip;.str1과 str2가 가리키는 문자의 차이 반환&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;문자열 비교.png&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBCO0T/btsLIUyHXnB/WlBaQBukkcSK7lbK66gjUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBCO0T/btsLIUyHXnB/WlBaQBukkcSK7lbK66gjUK/img.png&quot; data-alt=&quot;문자열 비교 출력 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBCO0T/btsLIUyHXnB/WlBaQBukkcSK7lbK66gjUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBCO0T%2FbtsLIUyHXnB%2FWlBaQBukkcSK7lbK66gjUK%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;508&quot; height=&quot;152&quot; data-filename=&quot;문자열 비교.png&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문자열 비교 출력 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소스코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//문자열 비교하는 함수 만들기
#include &amp;lt;stdio.h&amp;gt;
//사전식 비교: 사전에 앞에 나오는 단어가 작고 뒤에 나오는 단어가 크다고 판별
//차이가 없으면 0 반환
int mystrcmp(const char *str1, const char *str2);
int main(void)
{
    char names[5][20] =
    {
        &quot;홍길동&quot;,&quot;강감찬&quot;,&quot;이순신&quot;,&quot;을지문덕&quot;,&quot;한석봉&quot;
    };
    char name[20];
    int i = 0;
    int value;

    printf(&quot;검색할 이름 :&quot;);
    scanf_s(&quot;%s&quot;, name, sizeof(name));

    printf(&quot;사전식 비교: 사전에 앞에 나오는 단어가 작고 뒤에 나오는 단어가 크다고 판별\n&quot;);
    for (i = 0; i&amp;lt;5; i++)
    {
        value = mystrcmp(name, names[i]);
        if (value == 0)//차이가 없을 때
        {
            printf(&quot;인덱스 %d에서 %s를 찾았습니다. \n&quot;, i, name);
        }
        else
        {
            if (value&amp;gt;0)
            {
                printf(&quot;%s &amp;gt; %s \n&quot;, name, names[i]);
            }
            else
            {
                printf(&quot;%s &amp;lt; %s \n&quot;, name, names[i]);
            }
        }
    }


    return 0;
}

int mystrcmp(const char *str1, const char *str2)
{
    //str1이 가리키는 문자가 종료 문자나 str1과 str2가 가리키는 문자가 다를 때까지 반복
    for (; *str1 &amp;amp;&amp;amp; (*str1 == *str2); str1++, str2++);
    return *str1 - *str2;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/shorts/nfrJfbWCZDg&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bUWllF/hyXWvn0pmc/OGXnX1nHzlrPlqMH6xwoLK/img.jpg?width=405&amp;amp;height=720&amp;amp;face=182_268_207_296,https://scrap.kakaocdn.net/dn/bT0qul/hyX0tWlaeX/uqbVef9CDHOb0B63flomx1/img.jpg?width=405&amp;amp;height=720&amp;amp;face=182_268_207_296&quot; data-video-width=&quot;405&quot; data-video-height=&quot;720&quot; data-video-origin-width=&quot;405&quot; data-video-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;에버랜드에 요정이 나타났다 #에버랜드#요정 #christmas&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/nfrJfbWCZDg&quot; width=&quot;405&quot; height=&quot;720&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C언어 예제 및 소스</category>
      <category>c언어</category>
      <category>strcmp 함수</category>
      <category>문자열 비교하기</category>
      <category>문자열 비교하는 함수 만들기</category>
      <category>소스 코드</category>
      <category>에버랜드</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/349</guid>
      <comments>https://ehpro.tistory.com/349#entry349comment</comments>
      <pubDate>Thu, 9 Jan 2025 07:52:49 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 문자열 길이를 계산하는 함수 만들기</title>
      <link>https://ehpro.tistory.com/348</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=mNOeDTLxOPY&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/DyOYj/hyXWtXVXzv/4geQpcwluTbGq6GWKV5NI0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/bLwnYo/hyXWmR4uJ2/s5rGPRHzwAInHv5QUqcTc0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;strlen 함수 직접 만들어보기 [C언어 표준 라이브러리 함수 가이드]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/mNOeDTLxOPY&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[C언어 소스] 문자열 길이를 계산하는 함수 만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문자열 길이 구하기(str:문자열 시작 위치)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cnt:=0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복(str[cnt]가 참인 문자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cnt 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cnt 반환&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;문자열 길이 실행.png&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WiLgc/btsLHC0mHrg/7oAMk5B5FGCMsTkmZWiPvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WiLgc/btsLHC0mHrg/7oAMk5B5FGCMsTkmZWiPvk/img.png&quot; data-alt=&quot;문자열 길이 구하여 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WiLgc/btsLHC0mHrg/7oAMk5B5FGCMsTkmZWiPvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWiLgc%2FbtsLHC0mHrg%2F7oAMk5B5FGCMsTkmZWiPvk%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;511&quot; height=&quot;101&quot; data-filename=&quot;문자열 길이 실행.png&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;101&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 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//문자열 길이 구하는 함수 만들기
//참고 &amp;lt;string.h&amp;gt;에 strlen 함수가 있습니다.
#include &amp;lt;stdio.h&amp;gt;

int mystrlen(const char *str);
int main(void)
{
    char name[100] = &quot;Hello World&quot;;
    printf(&quot;%s\n&quot;, name);
    printf(&quot;길이: %d\n&quot;, mystrlen(name));
    return 0;
}

int mystrlen(const char *str)
{
    int cnt;
    //str[cnt]가 거짓 문자(종료 문자, '\0')가 나올 때까지 cnt를 1증가
    for (cnt = 0; str[cnt]; cnt++);
    return cnt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>c언어</category>
      <category>strlen 함수</category>
      <category>독립기념관</category>
      <category>문자열 길이 구하기</category>
      <category>문자열 길이 구하는 함수 만들기</category>
      <category>소스 코드</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/348</guid>
      <comments>https://ehpro.tistory.com/348#entry348comment</comments>
      <pubDate>Wed, 8 Jan 2025 18:20:28 +0900</pubDate>
    </item>
    <item>
      <title>[C언어] n 개의 정수 중에 홀수의 합계 구하는 함수 만들기</title>
      <link>https://ehpro.tistory.com/347</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;n 개의 정수를 표현하기 가장 적합한 자료 형식은 정수 형식을 원소로 하는 배열이겠죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;n을 10으로 하드 코딩한다면 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;int arr[10];&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제일 먼저 함수 이름을 결정합시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;홀수 합계를 구하는 것이므로 GetOddSum 이라고 정할게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;n개의 정수 중에 홀수의 합계를 구하는 함수의 함수 원형을 정해봅시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;C언어에서 배열 이름은 할당한 메모리 주소입니다. 해당 주소에 원소 형식을 사용할 것이므로 원소 형식 포인터로 생각할 수 있어요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 배열의 크기를 전달해야겠죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 입력 매개변수는 2개로 int *base, int size 정도면 적당하겠네요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;*원소 개수가 음수가 올 수 없다는 것을 고려한다면 unsigned 은 size_t로 표현할 수도 있어요.*&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;함수에서는 결과로 홀수의 합계를 반환해야 하기 때문에 int 형식을 반환 형식으로 정할 수 있겠네요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 함수 원형은 다음처럼 정하면 적당한 수준이겠죠.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;int GetOddSum(int *base, int asize);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;보다 높은 신뢰성을 추구한다면 전달받은 주소의 값을 바꿀 수 없게 const int *base로 정하면 보다 높은 신뢰성을 추가할 수 있어요.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;int GetOddSum(const int *base, int asize);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용하는 예를 포함하면 다음처럼 작성할 수 있을 거예요.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int GetOddSum(const int* base, int asize);
int main()
{
    int arr[10] = { 1,2,3,7,8,5,4,9,11,6 };
    printf(&quot;홀수의 합계:%d\n&quot;, GetOddSum(arr, 10));

    return 0;
}
int GetOddSum(const int* base, int asize)
{
    int sum = 0;
    for (int i = 0; i &amp;lt; asize; i++)
    {
        if (base[i] % 2 == 1)
        {
            sum += base[i];
        }
    }
    return sum;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C언어 예제 및 소스</category>
      <category>c언어</category>
      <category>n 개의 정수 중에 홀수의 합계 구하는 함수 만들기</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>예제 코드</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/347</guid>
      <comments>https://ehpro.tistory.com/347#entry347comment</comments>
      <pubDate>Wed, 8 Jan 2025 17:18:51 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 속이 빈 삼각형 출력</title>
      <link>https://ehpro.tistory.com/346</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n:&amp;larr;높이 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복(space:1&amp;rarr;(n-1))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 공백 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;*&amp;rsquo;출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개행 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복(line:1&amp;rarr;n-2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 반복(space:1&amp;rarr;n-line-1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 공백 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lsquo;*&amp;rsquo;출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 반복(space:1&amp;rarr;2line-1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 공백 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lsquo;*&amp;rsquo; 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 개행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복(star:1&amp;rarr;(2n-1))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;lsquo;*&amp;rsquo;출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개행&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;속이 빈 삼각형.png&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdZx4X/btsLGMP3yhN/prS55dvqCaNIcajv5rJRp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdZx4X/btsLGMP3yhN/prS55dvqCaNIcajv5rJRp0/img.png&quot; data-alt=&quot;속이 빈 삼각형 출력 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdZx4X/btsLGMP3yhN/prS55dvqCaNIcajv5rJRp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdZx4X%2FbtsLGMP3yhN%2FprS55dvqCaNIcajv5rJRp0%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;513&quot; height=&quot;143&quot; data-filename=&quot;속이 빈 삼각형.png&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;속이 빈 삼각형 출력 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소스코드&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//반복문 연습 - 속이 빈 삼각형

//입력
//5                - n

//출력
//     *            공백 4, 별1, 개행
//    * *           1- 공백 3, 별1, 공백1,별1, 개행 
//   *   *          2- 공백 2, 별1, 공백3,별1, 개행
//  *     *         3- 공백 1, 별1, 공백5,별1, 개행
// *********      공백0, 별9, 개행

//공백 = n-1, 별1, 개행
//line: 1~(n-2)
//공백 = n-line-1
//별1
//공백 = 2*line-1
//별1
//개행=1
//별 = 2*n -1, 개행

#include &amp;lt;stdio.h&amp;gt;
int main(void)
{
    int n;
    int line, space, star;

    printf(&quot;높이:&quot;);
    scanf_s(&quot;%d&quot;, &amp;amp;n);//입력
    for (space = 1; space &amp;lt;= (n - 1); space++)//공백 = n-line
    {
        putchar(' ');
    }
    putchar('*');//별1
    putchar('\n');//개행
    for (line = 1; line &amp;lt;= (n - 2); line++)//line: 1~(n-2)
    {
        for (space = 1; space &amp;lt;= (n - line - 1); space++) //공백 = n-line-1
        {
            putchar(' ');
        }
        putchar('*');//별1
        for (space = 1; space &amp;lt;= 2 * line - 1; space++) //공백 = 2*line-1
        {
            putchar(' ');
        }
        putchar('*');//별1
        putchar('\n');//개행=1
    }
    for (star = 1; star &amp;lt;= (2 * n - 1); star++)//별 = 2*n -1
    {
        putchar('*');
    }
    putchar('\n');//개행
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C언어 예제 및 소스</category>
      <category>c언어</category>
      <category>독립기념관</category>
      <category>반복문 연습</category>
      <category>별 출력</category>
      <category>소스 코드</category>
      <category>속이 빈 정삼각형 출력</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/346</guid>
      <comments>https://ehpro.tistory.com/346#entry346comment</comments>
      <pubDate>Wed, 8 Jan 2025 17:16:47 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 산봉우리 출력</title>
      <link>https://ehpro.tistory.com/345</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n:&amp;larr;산의 높이 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복(line:1&amp;rarr;2n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 조건(line&amp;lt;=n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 반복(space:1&amp;rarr;4n-1-line)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 공백 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 반복(star:1&amp;rarr;2line-1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lsquo;*&amp;rsquo; 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 개행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 반복(space:1&amp;rarr;2n-line)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 공백 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 반복(start:1&amp;rarr;2(line-n))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lsquo;*&amp;rsquo; 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 반복(space:1&amp;rarr;2(2n-line))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 공백 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 반복(star:1&amp;rarr;(2n-line-1))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lsquo;*&amp;rsquo; 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 반복(space:1&amp;rarr;2(2n-line))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 공백 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 반복(start:1&amp;rarr;2(line-n))&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lsquo;*&amp;rsquo; 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 개행&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;피라미드.png&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5GFnd/btsLGXRhhHR/jsSpsKBmLbypmjQWYPvhC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5GFnd/btsLGXRhhHR/jsSpsKBmLbypmjQWYPvhC1/img.png&quot; data-alt=&quot;산 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5GFnd/btsLGXRhhHR/jsSpsKBmLbypmjQWYPvhC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5GFnd%2FbtsLGXRhhHR%2FjsSpsKBmLbypmjQWYPvhC1%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;511&quot; height=&quot;204&quot; data-filename=&quot;피라미드.png&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;산 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소스코드&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//반복문 연습 - 산봉우리 출력

//입력
//5                - n

//출력
//                    *                          1                        공백(9+9),별1, 개행
//                   ***                         2                        공백(9+8), 별3, 개행
//                  *****                        3                        공백(9+7),별5, 개행
//                 *******                       4                         공백(9+6), 별7, 개행
//                *********                      5                         공백(9+5), 별9, 개행
//     *         ***********          *          6  공백4, 별1, 공백4, 공백4, 별11, 공백4, 공백4, 별1, 개행
//    ***      *************        ***          7  공백3, 별3, 공백3, 공백3, 별13, 공백3, 공백3, 별3, 개행
//   *****    ***************     *****          8  공백2, 별5, 공백2, 공백2, 별15, 공백2, 공백2, 별5, 개행
//  *******  *****************  *******          9  공백1, 별7, 공백1, 공백1, 별17, 공백1, 공백1, 별7, 개행
// *************************************        10   공백0, 별9, 공백0, 공백0, 별19, 공백0, 공백 0, 별9,개행

//line:1~2*n
//조건(line&amp;lt;=n)이 참일 때
//공백= (2*n-1)+(2*n-line) = 4*n -1-line
//별 = 2*line-1
//개행
//조건(line&amp;lt;=n)이 거짓일 때
//공백 = 2*n-line
//별 = 2*(line-n)-1
//공백 = 2*(2*n-line)     
//별 = 2*line-1
//공백 = 2*(2*n-line)
//별 = 2*(line-n)-1
//개행

#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
    int n;
    int line, space, star;

    printf(&quot;높이:&quot;);
    scanf_s(&quot;%d&quot;, &amp;amp;n);//입력

    for (line = 1; line &amp;lt;= 2 * n; line++)//line: 1~2n
    {
        if (line &amp;lt;= n)//line is 1~n
        {
            for (space = 1; space &amp;lt;= (4 * n - 1 - line); space++)//공백 4*n - 1 - line개
            {
                putchar(' ');
            }
            for (star = 1; star &amp;lt;= (2 * line - 1); star++)//별 2*line -1개
            {
                putchar('*');
            }
            putchar('\n');//개행
        }
        else//line is n+1 ~ 2n
        {
            for (space = 1; space &amp;lt;= (2 * n - line); space++)//공백 2n-line개
            {
                putchar(' ');
            }
            for (star = 1; star &amp;lt;= 2 * (line - n) - 1; star++)//별 2*(line-n)-1개
            {
                putchar('*');
            }
            for (space = 1; space &amp;lt;= (2 * (2 * n - line)); space++)//공백 2*(2*n-line) 개
            {
                putchar(' ');
            }
            for (star = 1; star &amp;lt;= (2 * line - 1); star++)//별 2*line-1개
            {
                putchar('*');
            }
            for (space = 1; space &amp;lt;= (2 * (2 * n - line)); space++)//공백 2*(2*n-line) 개
            {
                putchar(' ');
            }
            for (star = 1; star &amp;lt;= 2 * (line - n) - 1; star++)//별 2*(line-n)-1개
            {
                putchar('*');
            }
            putchar('\n');//개행
        }
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;br /&gt;&lt;br /&gt;&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C언어 예제 및 소스</category>
      <category>c언어</category>
      <category>독립기념관</category>
      <category>반복문 연습</category>
      <category>별 출력</category>
      <category>산봉우리 출력</category>
      <category>소스 코드</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/345</guid>
      <comments>https://ehpro.tistory.com/345#entry345comment</comments>
      <pubDate>Wed, 8 Jan 2025 17:13:55 +0900</pubDate>
    </item>
    <item>
      <title>[C언어 소스] 숫자 피라미드</title>
      <link>https://ehpro.tistory.com/344</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=JKla14TxV58&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cGvWcx/hyX0nBKFy1/uW1gQkEcTMfCMtsNJUXxb1/img.jpg?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480&quot; data-video-width=&quot;640&quot; data-video-height=&quot;480&quot; data-video-origin-width=&quot;640&quot; data-video-origin-height=&quot;480&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[언제나 C언어] 숫자 피라미드 출력하기 [예제 Center]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/JKla14TxV58&quot; width=&quot;640&quot; height=&quot;480&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[C언어 소스] 숫자 피라미드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음처럼 출력할 라인 수를 입력하여 정수 피라미드를 출력하시오.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;숫자 피리미드 실행 결과.png&quot; data-origin-width=&quot;95&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5I26e/btsLGbJoxyb/4vtDcYYg4QS4PzZq9VqLx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5I26e/btsLGbJoxyb/4vtDcYYg4QS4PzZq9VqLx0/img.png&quot; data-alt=&quot;숫자 피라미드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5I26e/btsLGbJoxyb/4vtDcYYg4QS4PzZq9VqLx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5I26e%2FbtsLGbJoxyb%2F4vtDcYYg4QS4PzZq9VqLx0%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;95&quot; height=&quot;96&quot; data-filename=&quot;숫자 피리미드 실행 결과.png&quot; data-origin-width=&quot;95&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;숫자 피라미드&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라인 수 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Loop(i:1-&amp;gt;line)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Loop(space:0-&amp;gt;line-1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf space&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Loop(num:1-&amp;gt;i)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print num&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Loop(num:i-1-&amp;gt;1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print num&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
int main()
{
    int line = 0;
    int num = 0, i = 0, space = 0;
    printf(&quot;정수:&quot;);
    scanf_s(&quot;%d&quot;, &amp;amp;line);

    for (i = 1; i &amp;lt;= line; i++) //입력한 line번 반복
    {
        //i번 라인에 공백은 (line-i)개 출력
        for (space = 0; space &amp;lt; (line - i); space++)
        {
            putchar(' ');
        }
        //1부터 i까지 증가하면서 출력
        for (num = 1; num &amp;lt;= i; num++)
        {
            printf(&quot;%d&quot;, num);
        }
        //i-1번부터 1까지 감소하면서 출력
        for (num = i-1; num &amp;gt; 0; num--)
        {
            printf(&quot;%d&quot;, num);
        }
        putchar('\n');//개행 출력
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C언어 예제 및 소스</category>
      <category>c언어</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>숫자 피라미드</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/344</guid>
      <comments>https://ehpro.tistory.com/344#entry344comment</comments>
      <pubDate>Wed, 8 Jan 2025 17:08:33 +0900</pubDate>
    </item>
    <item>
      <title>Queue를 이용한 스케쥴러 시뮬레이션 [C++]</title>
      <link>https://ehpro.tistory.com/343</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=QTzzCR2aBAA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/boPhEz/hyXWvnRfZs/5RBBcvejDwsKxZOSairCt0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/bHzeEZ/hyX0zPD2MV/Y7eSUCUgVswK95bx1fi470/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Queue를 이용한 스케쥴러 시뮬레이션 [C++]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/QTzzCR2aBAA&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;Queue를 이용한 스케쥴러 시뮬레이션 [C++]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나 휴일에 언휴예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습은 Queue를 이용한 스케쥴러 시뮬레이션입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스케쥴러는 운영체제의 핵심 개체로 누가 CPU를 점유하여 사용할 것인지를 판단하는 역할을 수행합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기에서는 대기 큐를 이용하는 라운드 로빈 방식의 스케쥴러를 코드로 표현해 볼게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;보다 자세한 사항은&lt;span&gt;&amp;nbsp;&lt;/span&gt;자료구조와 알조리즘 C++ 3.5 큐를 이용한 스케쥴러 시뮬레이션을 참고하세요.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;EHProcess.H&lt;/h3&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;#include 
using namespace std;
class EHProcess
{
    string pname; //프로그램 이름
    const int tjob; //전체 작업량
    const int cjob; //cpu 점유 시 수행가능 최대 작업량
    int ntjob; //현재 남은 작업량
    int ncjob; //현재 cpu 점유 시 수행가능 최대 작업량
public:
    EHProcess(string pname,int tjob,int cjob);
    void IdleToReady();//Idle 상태에서 Ready 상태로 전이
    int Running();//CPU를 점유하여 실행, 남은 작업량 반환
    void EndProgram(); //프로세스 종료
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;EHProcess.cpp&lt;/h3&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;#include &quot;EHProcess.h&quot;
EHProcess::EHProcess(string pname,int tjob,int cjob):tjob(tjob),cjob(cjob)
{
    this-&amp;gt;pname = pname;
}
void EHProcess::IdleToReady()//Idle 상태에서 Ready 상태로 전이
{
    cout&amp;lt;&amp;lt;pname&amp;lt;&amp;lt;&quot; 총 작업량:&quot;&amp;lt;&amp;lt;tjob&amp;lt;&amp;lt;&quot; CPU 점유시 작업량:&quot;&amp;lt;&amp;lt;cjob&amp;lt;&amp;lt;endl;
    ntjob = tjob; //프로그램 이미지 메모리에 로딩을 표현
}
#include 
int EHProcess::Running()//CPU를 점유하여 실행, 남은 작업량 반환
{
    cout &amp;lt;&amp;lt; pname &amp;lt;&amp;lt; &quot; CPU 점유&quot; &amp;lt;&amp;lt; endl;
    ncjob = cjob; //ncjob에 CPU 사용할 수 있는 시간 대입    
    for(  ; ntjob &amp;amp;&amp;amp; ncjob ; ntjob--, ncjob--)
    {
        Sleep(300);
        cout&amp;lt;&amp;lt;ntjob&amp;lt;&amp;lt;&quot; &quot;;//단위 시간 작업 수행을 표현
    }
    cout &amp;lt;&amp;lt;endl;//CPU를 반납함을 표현
    return ntjob; //남은 작업량 반환
}
void EHProcess::EndProgram() //프로세스 종료
{
    cout&amp;lt;&amp;lt;pname&amp;lt;&amp;lt;&quot;종료&quot;&amp;lt;&amp;lt;endl; //프로세스 종료를 표현
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Scheduler.h&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//Scheduler.h
#pragma once
#include 
#include 
using namespace std;
#include &quot;EHProcess.h&quot;
typedef vector Memory;
typedef queue ReadyQueue;
typedef Memory::iterator miter;
class Scheduler  
{
    Memory hard_disk; // 하드디스크
    ReadyQueue  rq; //대기 큐
public:
    Scheduler();
    void Simulation();//시뮬레이션 시작
    virtual ~Scheduler();
private:
    void Init(); //시뮬레이션 초기화- 프로그램 설치 및 실행 명령    
    void Ending();//시뮬레이션 종료
};

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Scheduler.cpp&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//Scheduler.h
#include &quot;Scheduler.h&quot;

Scheduler::Scheduler()
{
    Init();    
}
void Scheduler::Init()
{
    //하드디스크에 프로그램 설치를 표현
    hard_disk.push_back(new EHProcess(&quot;A&quot;,20,5));
    hard_disk.push_back(new EHProcess(&quot;B&quot;,23,6));
    hard_disk.push_back(new EHProcess(&quot;C&quot;,18,4));
    miter seek = hard_disk.begin();
    miter end = hard_disk.end();
    EHProcess *pro=0;    //하드디스크에 설치한 프로그램을 실행 명령을 표현
    for( ; seek != end ; ++seek)
    {
        pro = *seek;
        rq.push(pro); //대기 큐에서 기다림
        pro-&amp;gt;IdleToReady();//Idle 상태에서 Ready상태로 전이
    }
}

Scheduler::~Scheduler()
{
    Ending();
}
void Scheduler::Ending()
{
    miter seek = hard_disk.begin();
    for(   ; seek != hard_disk.end(); ++seek)
    {
        delete (*seek); 
    }
}

void Scheduler::Simulation()
{
    EHProcess *process = 0;
    int job=0;
    while( !rq.empty() ) //대기 큐가 비어있지 않을 때
    {        
        process = rq.front();//가장 먼저 대기한 프로세스를 꺼냄
        rq.pop();

        job = process-&amp;gt;Running();//꺼낸 프로세스를 실행
        if(job) //남은 작업이 있다면
        {
            rq.push(process); //대기큐에서 기다림
        }
        else
        {
            process-&amp;gt;EndProgram();//프로세스 종료
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Program.cpp&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//Program.cpp
#include &quot;Scheduler.h&quot;
#include 
int main()
{
    Scheduler *sch = new Scheduler;    
    sch-&amp;gt;Simulation();
    delete sch;    
    return 0;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;실행 결과&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;A 총 작업량:20 CPU 점유시 작업량:5
B 총 작업량:23 CPU 점유시 작업량:6
C 총 작업량:18 CPU 점유시 작업량:4
A CPU 점유
20 19 18 17 16 
B CPU 점유
23 22 21 20 19 18 
C CPU 점유
18 17 16 15 
A CPU 점유
15 14 13 12 11 
B CPU 점유
17 16 15 14 13 12 
C CPU 점유
14 13 12 11 
A CPU 점유
10 9 8 7 6 
B CPU 점유
11 10 9 8 7 6 
C CPU 점유
10 9 8 7 
A CPU 점유
5 4 3 2 1 
A종료
B CPU 점유
5 4 3 2 1 
B종료
C CPU 점유
6 5 4 3 
C CPU 점유
2 1 
C종료&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>C++</category>
      <category>Queue</category>
      <category>독립기념관</category>
      <category>라운드 로빈</category>
      <category>소스 코드</category>
      <category>스케쥴러</category>
      <category>시뮬레이션</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/343</guid>
      <comments>https://ehpro.tistory.com/343#entry343comment</comments>
      <pubDate>Wed, 8 Jan 2025 16:00:40 +0900</pubDate>
    </item>
    <item>
      <title>파서 트리를 이용한 계산기 [C++]</title>
      <link>https://ehpro.tistory.com/342</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=Im4e_p7rQVA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/hVeGC/hyX0xK3Tu8/MzqKkPiGOrUG9kihAE8JF1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/dcKwwB/hyX0xdeo3J/PD6FsfvhhmgqsUy8fgoAmK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;수식 파서 트리를 이용한 계산기 Part1 [C++]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Im4e_p7rQVA&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;파서 트리를 이용한 계산기 [C++] Part1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=9L7iky_2vkg&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bmtjbn/hyXWsLp9nc/HJKoUCtWGBEHBtb8oVJUZ0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/PymHP/hyX0nVZjCL/Nd34Zr6mJkeg9gYJgWpPMK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;수식 파서 트리를 이용한 계산기 Part2 [C++]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/9L7iky_2vkg&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;파서 트리를 이용한 계산기 [C++] Part2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div style=&quot;color: #373b41; text-align: start;&quot;&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;23+8*9-7 과 같은 수식을 계산하면 8*9를 먼저 계산하고 23+(8*9)-7 순으로 계산합니다.&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;span&gt;&amp;nbsp;&lt;/span&gt;자료구조와 알고리즘 C++ 9.3 수식 파서 트리를 참고하세요.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee;&quot;&gt;&lt;code&gt;#include 
#include 
using namespace std;
class Calculator
{
    string expr;
public:
    Calculator(string expr)
    {        
        this-&amp;gt;expr = expr;
        tcnt = 0;
    }
    void Run()
    {
        cout&amp;lt;&amp;lt;expr&amp;lt;&amp;lt;&quot;을 계산합니다. ...&quot;&amp;lt;&amp;lt;endl;
        if(Lexical())
        {
            if(Syntax())
            {
                Parsing();
                PostOrderView();
                cout&amp;lt;&amp;lt;expr&amp;lt;&amp;lt;&quot;=&quot;&amp;lt;&amp;lt;Calculate()&amp;lt;&amp;lt;endl;
            }
            else
            {
                cout&amp;lt;&amp;lt;&quot;수식에 사용한 표현이 문법에 맞지 않습니다.&quot;&amp;lt;&amp;lt;endl;
            }
        }
        else
        {
            cout&amp;lt;&amp;lt;&quot;사용할 수 없는 기호가 있습니다.&quot;&amp;lt;&amp;lt;endl;
        }
        cout&amp;lt;&amp;lt;endl;
    }
private:
    bool Lexical()
    {        
        int i = 0;
        while(expr[i])
        {
            if(IsOperator(expr[i]))
            {
                i = MakeOperator(i);
            }
            else
            {
                if(IsDigit(expr[i]))
                {
                    i = MakeOperand(i);
                }
                else
                {
                    return false;
                }
            }
        }
        return true;
    }
    bool IsOperator(char ch)
    {
        return (ch =='+')||(ch=='-')||(ch=='*')||(ch=='/');
    }
    bool IsDigit(char ch)
    {
        return (ch&amp;gt;='0')&amp;amp;&amp;amp;(ch&amp;lt;='9');
    }
    struct Token
    {
        int priority;
        virtual void View()=0;
        bool MoreThanPriority(Token *token)
        {
            return priority&amp;gt;=token-&amp;gt;priority;
        }
    };
    struct Operator:public Token
    {
        char ch;
        Operator(char ch)
        {
            this-&amp;gt;ch = ch;
            if((ch=='+')||(ch=='-'))
            {
                priority = 1;
            }
            else
            {
                priority = 2;
            }
        }
        void View()
        {
            cout&amp;lt;&amp;lt;ch&amp;lt;&amp;lt;&quot; &quot;;
        }
        
    };
    Token *tokens[100];
    int tcnt;
    int MakeOperator(int i)
    {
        tokens[tcnt] = new Operator(expr[i]);
        tcnt++;
        return i+1;
    }
    struct Operand:public Token
    {
        int value;
        Operand(int value)
        {
            this-&amp;gt;value = value;
            priority = 3;            
        }
        void View()
        {
            cout&amp;lt;&amp;lt;value&amp;lt;&amp;lt;&quot; &quot;;
        }
        
    };
    
    int MakeOperand(int i)
    {
        int value = 0;
        while(IsDigit(expr[i]))
        {
            value = value*10 + expr[i] - '0';
            i++;
        }
        tokens[tcnt] = new Operand(value);
        tcnt++;
        return i;
    }    

    bool Syntax()
    {
        if(tcnt%2==0)
        {
            return false;
        }
        if(tokens[0]-&amp;gt;priority !=3)
        {
            return false;
        }
        for(int i = 1; i&amp;lt;tcnt; i+=2)
        {
            if(tokens[i]-&amp;gt;priority==3)
            {
                return false;
            }            
            if(tokens[i+1]-&amp;gt;priority != 3)
            {
                return false;
            }
        }
        return true;
    }

    struct ParserTree
    {
        struct Node
        {
            Token *token;
            Node *lc;
            Node *rc;
            Node(Token *token)
            {
                this-&amp;gt;token = token;
                lc = rc = 0;
            }
        };
        Node *root;
        ParserTree(Token *token)
        {
            root = new Node(token);
        }
        void Add(Token *token)
        {
            Node *now = new Node(token);
            Token *st = root-&amp;gt;token;
            if(st-&amp;gt;MoreThanPriority(token))
            {
                now-&amp;gt;lc = root;
                root = now;
            }
            else
            {
                if(token-&amp;gt;priority !=3)
                {
                    now-&amp;gt;lc = root-&amp;gt;rc;
                    root-&amp;gt;rc = now;
                }
                else
                {
                    Node *pa = root;
                    while(pa-&amp;gt;rc)
                    {
                        pa = pa-&amp;gt;rc;
                    }
                    pa-&amp;gt;rc = now;
                }
            }
        }
        void View()
        {
            PostOrder(root);
            cout&amp;lt;&amp;lt;endl;
        }
        void PostOrder(Node *sr)
        {
            if(sr)
            {
                PostOrder(sr-&amp;gt;lc);
                PostOrder(sr-&amp;gt;rc);
                sr-&amp;gt;token-&amp;gt;View();
            }
        }
        int Calculate()
        {
            return PostOrderCalculate(root);
        }
        int PostOrderCalculate(Node *sr)
        {
            if(sr-&amp;gt;lc)
            {
                int lvalue = PostOrderCalculate(sr-&amp;gt;lc);
                int rvalue = PostOrderCalculate(sr-&amp;gt;rc);
                Operator *op = dynamic_cast(sr-&amp;gt;token);
                switch(op-&amp;gt;ch)
                {
                case '+': return lvalue + rvalue;
                case '-': return lvalue - rvalue;
                case '*': return lvalue * rvalue;
                case '/': 
                    if(rvalue)
                    {
                        return lvalue / rvalue;
                    }
                    cout&amp;lt;&amp;lt;&quot;divide zero error&quot;&amp;lt;&amp;lt;endl;
                    return 0;
                }
                throw &quot;정의하지 않은 연산자입니다.&quot;;
            }
            Operand *op = dynamic_cast(sr-&amp;gt;token);
            return op-&amp;gt;value;
        }
    };
    ParserTree *ps;
    void Parsing()
    {
        ps = new ParserTree(tokens[0]);
        for(int i = 1; i&amp;lt;tcnt;i++)
        {
            ps-&amp;gt;Add(tokens[i]);
        }
    }
    void PostOrderView()
    {
        ps-&amp;gt;View();
    }
    int Calculate()
    {
        return ps-&amp;gt;Calculate();        
    }
};

int main()
{
    string tc_exprs[6]=
    {
        &quot;2+3-5*5+6/2&quot;,
        &quot;23*5/2+4*6&quot;,
        &quot;2+4*5#6&quot;,
        &quot;2+3*5+&quot;,
        &quot;3+36+-7&quot;,
        &quot;45+3*5-2+5/2*7&quot;,        
    };
    for(int i = 0; i&amp;lt;6; i++)
    {
        Calculator *cal  = new Calculator(tc_exprs[i]);
        cal-&amp;gt;Run();
        delete cal;
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #373b41; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>C++</category>
      <category>lexical</category>
      <category>syntax</category>
      <category>구현</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>수식 파서 트리</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/342</guid>
      <comments>https://ehpro.tistory.com/342#entry342comment</comments>
      <pubDate>Wed, 8 Jan 2025 15:30:13 +0900</pubDate>
    </item>
    <item>
      <title>함수 개체, 회원 및 회원 컬렉션 구현[C++]</title>
      <link>https://ehpro.tistory.com/341</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=2AR5Q_2uRfw&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/MTKHR/hyXWyLDxvX/LFjmzlEfBT15K46HgSpS2K/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/GLA5B/hyX0yQJ6ie/v0dKKTj0Ux9mj4PFNV9Zek/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;함수 개체 - 회원 및 회원 컬렉션 구현 [C++]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2AR5Q_2uRfw&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;함수 개체, 회원 및 회원 컬렉션 구현[C++]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나 휴일에 언휴예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 함수 개체 실습이예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;함수 개체는 특정 형식 개체를 함수처럼 호출 가능한 개체를 말합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 위해 해당 형식에는 함수 호출 연산자를 중복 정의합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 외에도 이번 실습에는 개체 출력자, 인덱스 연산자 중복 정의를 구현하는 부분도 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 함수 호출 연산자를 중복 정의한 간단한 예제입니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;class FunObject
{
public:
    int operator()(int a, int b)
    {
        return a + b;
    }
};
int main()
{
    FunObject fobj;
    int re = fobj(3,4);
    cout &amp;lt;&amp;lt; &quot;결과:&quot; &amp;lt;&amp;lt; re &amp;lt;&amp;lt; endl;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 예에서 FunObject 클래스에는 함수 호출 연산자를 중복 정의하고 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 FunObject 형식 변수 fobj 를 함수 처럼 호출하는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 회원 클래스를 정의하고 회원 클래스를 보관하는 회원 컬렉션을 구현할 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;회원 컬렉션 형식에는 특정 조건을 만족하는 회원 개체를 반환하는 메서드(FindIf)를 제공할 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 해당 메서드의 입력 인자로 특정 조건을 만족하는지 판별하는 알고리즘을 정의한 함수 개체를 전달 받을 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 실습 소스 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;/* https://ehpub.co.kr
   C++ 예제 - 언제나 휴일
   함수 개체 - 회원 컬렉션
   연산자 중복 정의 및 개체 출력자 포함
*/
#include 
#include 
using namespace std;

class Member
{
    int num;
    string name;
public:
    Member(int num, string name)
    {
        this-&amp;gt;num = num;
        this-&amp;gt;name = name;
    }
    int GetNum()const
    {
        return num;
    }
    string GetName()const
    {
        return name;
    }
};

ostream&amp;amp; operator&amp;lt;&amp;lt;(ostream&amp;amp; os, const Member* data)
{
    os &amp;lt;&amp;lt; &quot;번호:&quot; &amp;lt;&amp;lt; data-&amp;gt;GetNum() &amp;lt;&amp;lt; &quot; 이름:&quot; &amp;lt;&amp;lt; data-&amp;gt;GetName();
    return os;
}

class IEqual
{
public:
    virtual bool operator()(Member* data) = 0;
};

class MemberCollection
{
    Member** base;
    const int capacity;
    int count;
public:
    MemberCollection(int capacity) :capacity(capacity)
    {
        base = new Member * [capacity];
        count = 0;
    }
    ~MemberCollection()
    {
        delete[] base;
    }
    bool PushBack(Member* data)
    {
        if (IsFull())
        {
            return false;
        }
        base[count] = data;
        count++;
        return true;
    }
    bool IsFull()const
    {
        return count == capacity;
    }
    bool IsAvailIndex(int index)const
    {
        return (index &amp;gt;= 0) &amp;amp;&amp;amp; (index &amp;lt; capacity);
    }
    int GetCount()const
    {
        return count;
    }
    Member*&amp;amp; operator[](int index)
    {
        if (IsAvailIndex(index) == false)
        {
            throw &quot;사용할 수 없는 인덱스&quot;;
        }
        return base[index];
    }
    Member* FindIf(IEqual&amp;amp; ie)
    {
        for (int i = 0; i &amp;lt; count; i++)
        {
            if (ie(base[i]))
            {
                return base[i];
            }
        }
        return NULL;
    }
};


class EqualNum :
    public IEqual
{
    int num;
public:
    EqualNum(int num)
    {
        this-&amp;gt;num = num;
    }
    virtual bool operator()(Member* data)
    {
        return num == data-&amp;gt;GetNum();
    }
};

int main()
{
    MemberCollection dc(100);
    dc.PushBack(new Member(3, &quot;홍길동&quot;));
    dc.PushBack(new Member(2, &quot;강감찬&quot;));
    dc.PushBack(new Member(6, &quot;을지문덕&quot;));
    dc.PushBack(new Member(7, &quot;한석봉&quot;));

    int count = dc.GetCount();
    for (int i = 0; i &amp;lt; count; i++)
    {
        cout &amp;lt;&amp;lt; dc[i] &amp;lt;&amp;lt; endl;
    }

    cout &amp;lt;&amp;lt; &quot;검색할 회원 번호:&quot;;
    int num;
    cin &amp;gt;&amp;gt; num;
    EqualNum en(num);
    Member* member = dc.FindIf(en);
    if (member != NULL)
    {
        cout &amp;lt;&amp;lt; member &amp;lt;&amp;lt; endl;
    }
    else
    {
        cout &amp;lt;&amp;lt; &quot;찾지 못하였음&quot; &amp;lt;&amp;lt; endl;
    }

    for (int i = 0; i &amp;lt; count; i++)
    {
        delete dc[i];
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>C++</category>
      <category>개체 출력자</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>연산자 중복 정의</category>
      <category>인덱스</category>
      <category>함수 개체</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/341</guid>
      <comments>https://ehpro.tistory.com/341#entry341comment</comments>
      <pubDate>Wed, 8 Jan 2025 15:00:36 +0900</pubDate>
    </item>
    <item>
      <title>개체 출력자 실습 &amp;ndash; 회원 클래스 및 쉬프트 연산자 중복 정의 [C++]</title>
      <link>https://ehpro.tistory.com/340</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=dz_oWTi2YJo&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Io10J/hyX0zPD17i/hr6gYjHijiVco511TdYE21/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/bxTRlI/hyX0rD17ta/btmzOTAS8c3pEj8ZjeyPj1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;개체 출력자 실습 - 회원 클래스 및 쉬프트 연산자 중복 정의 [C++]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/dz_oWTi2YJo&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;개체 출력자 실습 &amp;ndash; 회원 클래스 및 쉬프트 연산자 중복 정의 [C++]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나 휴일에 언휴예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 개체 출력자를 구현합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;C++에서 출력을 위해 ostream 형식을 정의하고 있어요. cout이 대표적인 ostream 형식 개체죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;개체 출력자는 ostream 형식 개체를 이용하여 개체 정보를 출력할 수 있게 정의하는 코드 집합을 개체 출력자라 부릅니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 회원 클래스를 정의하고 개체 출력자를 정의할 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기본 형식처럼 회원 개체 정보를 ostream 형식 개체로 출력할 수 있게 구현하는 실습입니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;/* https://ehpub.co.kr 
   C++ 예제 - 언제나 휴일
   개체 출력자 - 회원 클래스
*/
#include 
#include 
using namespace std;

class Member
{
    int num;
    string name;
public:
    Member(int num, string name)
    {
        this-&amp;gt;num = num;
        this-&amp;gt;name = name;
    }
    int GetNum()const
    {
        return num;
    }
    string GetName()const
    {
        return name;
    }
    void View(ostream&amp;amp; os = cout)const
    {
        os &amp;lt;&amp;lt; &quot;번호:&quot; &amp;lt;&amp;lt; num &amp;lt;&amp;lt; &quot; 이름:&quot; &amp;lt;&amp;lt; name;
    }

};
ostream &amp;amp;operator&amp;lt;&amp;lt;(ostream&amp;amp; os, const Member&amp;amp; member)
{
    member.View(os);
    return os;
}
ostream&amp;amp; operator&amp;lt;&amp;lt;(ostream&amp;amp; os, const Member* member)
{
    member-&amp;gt;View(os);
    return os;
}
int main()
{    
    Member member(3, &quot;홍길동&quot;);
    Member *member2 = new Member(2, &quot;강감찬&quot;);
    
    cout &amp;lt;&amp;lt; member &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; member2 &amp;lt;&amp;lt; endl;

    delete member2;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실행 결과는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;번호:3 이름:홍길동
번호:2 이름:강감찬&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>C++</category>
      <category>개체출력자</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/340</guid>
      <comments>https://ehpro.tistory.com/340#entry340comment</comments>
      <pubDate>Wed, 8 Jan 2025 14:30:17 +0900</pubDate>
    </item>
    <item>
      <title>다형성 실습 &amp;ndash; 오케스트라, 음악가, 피아니스트, 드러머 [C++]</title>
      <link>https://ehpro.tistory.com/339</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=Ew1WkJmlv70&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/buaHbI/hyXWtp19wi/1tQrBBrp8GJ1H8iJB4Kn5k/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/cAsWlJ/hyXWsq8OeZ/HjpVKDIwrEKSmo6NaaXtPK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;다형성 실습 - 오케스트라, 음악가, 피아니스트, 드러머 구현 [C++]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Ew1WkJmlv70&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;다형성 실습 &amp;ndash; 오케스트라, 음악가, 피아니스트, 드러머 [C++]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나 휴일에 언휴예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 다형성 실습이예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다형성은 하나의 이름으로 보여도 실제 형태는 다양할 수 있는 성질입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기반 형식 포인터 변수로 파생 형식 개체를 사용할 수 있는 특징을 형식의 다형성이라고 부릅니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기반 형식의 가상 메서드를 파생 형식에서 재정의할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 때 기반 형식 포인터 변수로 해당 메서드를 호출하면 실제 개체 형식에 정의한 메서드가 동작합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 특징을 메서드의 다형성이라고 부릅니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 다형성에 관한 실습을 오케스트라(음악가, 피아니스트, 드러머) 소재로 진행합니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;/* https://ehpub.co.kr
   C++ 예제 - 언제나 휴일
   다형성 실습
*/
#include 
using namespace std;

class Musician
{
    const int mnum;
public:
    Musician(int mnum) :mnum(mnum)
    {
    }
    void Greeting()
    {
        cout &amp;lt;&amp;lt; mnum &amp;lt;&amp;lt; &quot; 인사합니다.&quot; &amp;lt;&amp;lt; endl;
    }
    virtual void Play() = 0;//추상 메서드(순수 가상 메서드)
    int GetMNum()const
    {
        return mnum;
    }
};
class Pianist :
    public Musician
{
public:
    Pianist(int mnum) :Musician(mnum)
    {

    }
    virtual void Play()
    {
        cout &amp;lt;&amp;lt; GetMNum() &amp;lt;&amp;lt; &quot; 딩동 댕동~&quot; &amp;lt;&amp;lt; endl;
    }
}; 
class Drummer :
    public Musician
{
public:
    Drummer(int mnum) :Musician(mnum)
    {

    }
    virtual void Play()
    {
        cout &amp;lt;&amp;lt; GetMNum() &amp;lt;&amp;lt; &quot; 두두둥&quot; &amp;lt;&amp;lt; endl;
    }
};
class Orchestra
{
    Musician** members;
    const int max_member;
    int now_members;
public:
    Orchestra(int max_member) :max_member(max_member)
    {
        Initialize();
    }    
    ~Orchestra()
    {
        delete[] members;
    }
    bool JoinMember(Musician* mu)
    {
        if (now_members == max_member)
        {
            return false;
        }
        members[now_members] = mu;
        now_members++;
        return true;
    }
    void Greeting()const
    {
        cout &amp;lt;&amp;lt; &quot;저희 단원을 소개합니다. 멤버는 총 &quot; &amp;lt;&amp;lt; now_members &amp;lt;&amp;lt; &quot;명 입니다.&quot; &amp;lt;&amp;lt; endl;
        for (int i = 0; i &amp;lt; now_members; i++)
        {
            members[i]-&amp;gt;Greeting();
        }
    }
    void StartConcert()
    {
        for (int i = 0; i &amp;lt; now_members; i++)
        {
            members[i]-&amp;gt;Play();//메서드의 다형성
        }
    }
private:
    void Initialize()
    {
        members = new Musician * [max_member];
        now_members = 0;
    }

};
int main()
{
    Orchestra* orchestra = new Orchestra(50);
    Pianist* pianist = new Pianist(1);
    Drummer* drummer = new Drummer(2);
    orchestra-&amp;gt;JoinMember(pianist);//형식의 다형성
    orchestra-&amp;gt;JoinMember(drummer);//형식의 다형성
    orchestra-&amp;gt;Greeting();
    orchestra-&amp;gt;StartConcert();
    delete orchestra;
    delete drummer;
    delete pianist;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 실행 결과입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;저희 단원을 소개합니다. 멤버는 총 2명 입니다.
1 인사합니다.
2 인사합니다.
1 딩동 댕동~
2 두두둥&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>C++</category>
      <category>가상 메서드</category>
      <category>다형성</category>
      <category>독립기념관</category>
      <category>드러머</category>
      <category>소스 코드</category>
      <category>재정의</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/339</guid>
      <comments>https://ehpro.tistory.com/339#entry339comment</comments>
      <pubDate>Wed, 8 Jan 2025 14:00:52 +0900</pubDate>
    </item>
    <item>
      <title>상품과 할인 상품 &amp;ndash; 상속 실습 [C++]</title>
      <link>https://ehpro.tistory.com/338</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=FYpFo_qRP7E&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/h6VnW/hyX0mv0BAO/wM7ipS1bEGi3rr19jdWBO0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/KE6RF/hyX0yb77Ps/x7UuRAbbUSV0yUDT6sFJMK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;상품과 할인 상품 - 상속 실습 [C++ 예제]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/FYpFo_qRP7E&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;상품과 할인 상품 &amp;ndash; 상속 실습 [C++]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나 휴일에 언휴예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 상속 실습을 해 볼 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실습 소재는 상품과 할인 상품 클래스를 정의합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;클래스다이어그램.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxZ0Uo/btsLF3DJqmC/w5nkSdEmQJTv9hq2aV64Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxZ0Uo/btsLF3DJqmC/w5nkSdEmQJTv9hq2aV64Q1/img.png&quot; data-alt=&quot;상품과 할인 상품 클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxZ0Uo/btsLF3DJqmC/w5nkSdEmQJTv9hq2aV64Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxZ0Uo%2FbtsLF3DJqmC%2Fw5nkSdEmQJTv9hq2aV64Q1%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;388&quot; height=&quot;378&quot; data-filename=&quot;클래스다이어그램.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;상품과 할인 상품 클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;클래스 다이어그램에서 삼각형과 실선으로 표현하는 관계를 일반화 관계라고 불러요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반화 관계는 기반 형식(Product)과 파생 형식(Discount Product) 사이의 관계입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반화 관계에서 파생 형식은 기반 형식의 멤버를 상속받는 특징을 갖습니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;/* https://ehpub.co.kr
   C++ 예제 - 언제나 휴일
   상속 실습 - 상품과 할인 상품 클래스 정의하기
*/
#include 
#include 
using namespace std;
class Product
{
    string name;
    int price;
public:
    Product(string name, int price)
    {
        SetName(name);
        SetPrice(price);
    }
    virtual int GetPrice()const
    {
        return price;
    }
    string GetName()const
    {
        return name;
    }
    virtual void Print()const
    {
        cout &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &quot; 판매 가격:&quot; &amp;lt;&amp;lt; GetPrice() &amp;lt;&amp;lt; endl;
    }
private:
    void SetPrice(int price)
    {
        this-&amp;gt;price = price;
    }
    void SetName(string name)
    {
        this-&amp;gt; name = name;
    }
};

class DiscountProduct :public Product
{
    int discount;
public:
    DiscountProduct(string name, int price, int discount):Product(name,price)
    {
        SetDiscount(discount);
    }
    int GetDiscount()const
    {
        return discount;
    }
    virtual int GetPrice()const
    {
        int origin_price = Product::GetPrice();
        int dc = origin_price * discount / 100;
        return origin_price - dc;
    }
    virtual void Print()const
    {
        cout &amp;lt;&amp;lt; &quot;상품 가격:&quot; &amp;lt;&amp;lt; Product::GetPrice() &amp;lt;&amp;lt; &quot; 할인율:&quot; &amp;lt;&amp;lt; discount &amp;lt;&amp;lt; &quot; &quot;;
        Product::Print();
    }
private:
    void SetDiscount(int discount)
    {
        this-&amp;gt;discount = discount;
    }
};
int main()
{
    Product* p1 = new Product(&quot;치약&quot;, 3000);
    Product* p2 = new DiscountProduct(&quot;칫솔&quot;, 3000, 15);
    p1-&amp;gt;Print();
    p2-&amp;gt;Print();
    delete p1;
    delete p2;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>C++</category>
      <category>가상 메서드</category>
      <category>기반 형식</category>
      <category>상속</category>
      <category>상품</category>
      <category>소스 코드</category>
      <category>일반화 관계</category>
      <category>재정의</category>
      <category>파생 형식</category>
      <category>할인 상품</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/338</guid>
      <comments>https://ehpro.tistory.com/338#entry338comment</comments>
      <pubDate>Wed, 8 Jan 2025 13:30:26 +0900</pubDate>
    </item>
    <item>
      <title>회원 클래스 정의 &amp;ndash; 정적 멤버 캡슐화 [C++]</title>
      <link>https://ehpro.tistory.com/337</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=GV6tRv_g-fk&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/5B51A/hyXWAJsm6E/sbV2XsX5vrtmZLLXqWoNYK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/dpoPdY/hyXWryZc8E/VoHfJhdtUdafG3KRHp0R6K/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;회원 클래스 정의하기 - 정적 멤버 캡슐화 [C++ 예제]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/GV6tRv_g-fk&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;회원 클래스 정의 &amp;ndash; 정적 멤버 캡슐화 [C++]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나 휴일에 언휴예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 예제는 정적 멤버 캡슐화를 다룰 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실습은 회원 클래스를 정의합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;클래스다이어그램.png&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnz9Zr/btsLHRvedHr/scJQqHBVbF5uZmmIIrkAsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnz9Zr/btsLHRvedHr/scJQqHBVbF5uZmmIIrkAsK/img.png&quot; data-alt=&quot;회원 실습 클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnz9Zr/btsLHRvedHr/scJQqHBVbF5uZmmIIrkAsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnz9Zr%2FbtsLHRvedHr%2FscJQqHBVbF5uZmmIIrkAsK%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;186&quot; height=&quot;196&quot; data-filename=&quot;클래스다이어그램.png&quot; data-origin-width=&quot;186&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;회원 실습 클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;클래스 다이어그램에서 밑줄로 표시한 멤버가 정적 멤버입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가장 최근에 부여한 회원 번호(lastnum)과 현재까지 생성한 회원 수를 반환하는 메세드(GetMemberCount)를 캡슐화할 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 두 개의 멤버는 개체의 멤버가 아닌 형식의 멤버로 형식 이름으로 접근할 수 있어요.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;/* https://ehpub.co.kr
   C++ 예제 - 언제나 휴일
   회원 클래스 정의 - 정적 멤버 필드 캡슐화
*/
#include 
#include 
using namespace std;
class Member
{
    static int last_num;
    const int num;
    string name;
public:
    static int GetMemberCount()
    {
        return last_num;
    }
    Member(string name) :num(++last_num)
    {
        this-&amp;gt;name = name;
    }
    int GetNum()const
    {
        return num;
    }
    string GetName()const
    {
        return name;
    }
    virtual string ToString()const
    {
        char buf[256] = &quot;&quot;;
        sprintf_s(buf, sizeof(buf), &quot;번호:%04d 이름:%s&quot;, num, name.c_str());
        return buf;
    }
    bool IsEqual(int num)const
    {
        return this-&amp;gt;num == num;
    }
    bool IsEqual(string name)const
    {
        return this-&amp;gt;name == name;
    }
};

int Member::last_num;

int main()
{
    Member* marr[3];
    //회원 개체 생성
    marr[0] = new Member(&quot;홍길동&quot;);
    marr[1] = new Member(&quot;강감찬&quot;);
    marr[2] = new Member(&quot;이순신&quot;);
    //회원 목록 출력
    cout &amp;lt;&amp;lt; &quot;현재 회원 수:&quot; &amp;lt;&amp;lt; Member::GetMemberCount() &amp;lt;&amp;lt; endl;
    for (int i = 0; i &amp;lt; 3; i++)
    {
        cout &amp;lt;&amp;lt; marr[i]-&amp;gt;ToString() &amp;lt;&amp;lt; endl;
    }
    //회원 이름 검색
    string name;
    cout &amp;lt;&amp;lt; &quot;검색할 이름:&quot;;
    cin &amp;gt;&amp;gt; name;
    bool check = false;
    for (int i = 0; i &amp;lt; 3; i++)
    {
        if (marr[i]-&amp;gt;IsEqual(name))
        {
            cout &amp;lt;&amp;lt; marr[i]-&amp;gt;ToString() &amp;lt;&amp;lt; endl;
            check = true;
        }
    }
    if (check == false)
    {
        cout &amp;lt;&amp;lt; &quot;없습니다.&quot; &amp;lt;&amp;lt; endl;
    }
    //회원 번호 검색
    int num;
    cout &amp;lt;&amp;lt; &quot;검색할 번호:&quot;;
    cin &amp;gt;&amp;gt; num;
    int i;
    for (i = 0; i &amp;lt; 3; i++)
    {
        if (marr[i]-&amp;gt;IsEqual(num))
        {
            cout &amp;lt;&amp;lt; marr[i]-&amp;gt;ToString() &amp;lt;&amp;lt; endl;
            break;
        }
    }
    if (i == 3)
    {
        cout &amp;lt;&amp;lt; &quot;없습니다.&quot; &amp;lt;&amp;lt; endl;
    }
    //회원 개체 소멸
    for (int i = 0; i &amp;lt; 3; i++)
    {
        delete marr[i];
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>C++</category>
      <category>구현</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>정적 멤버</category>
      <category>캡슐화</category>
      <category>회원 클래스</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/337</guid>
      <comments>https://ehpro.tistory.com/337#entry337comment</comments>
      <pubDate>Wed, 8 Jan 2025 13:00:26 +0900</pubDate>
    </item>
    <item>
      <title>복소수 클래스 정의 &amp;ndash; 캡슐화 실습 [C++]</title>
      <link>https://ehpro.tistory.com/336</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=k2qiarq2scM&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/MX2CH/hyX0nuT5Tr/bZkO2dfza9ttKkzjAkvzt0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/Q66Xg/hyXWxlFhTn/B7pTwhqPHppuyaFlaKDiu1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;복소수 클래스 정의하기 - 캡슐화 실습 [C++ 예제]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/k2qiarq2scM&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;복소수 클래스 정의 &amp;ndash; 캡슐화 실습 [C++]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;안녕하세요. 언제나 휴일에 언휴예요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;이번 강의는 캡슐화 실습으로 복소수 클래스를 정의할 거예요.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;실수부와 허수부를 멤버 필드로 갖고 있습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;그리고 실수부와 허수부의 값을 접근하는 접근자 메서드와 설정하는 설정자 메서드를 갖습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;마지막으로 복소수 개체 정보를 문자열로 반환하는 메서드를 멤버로 갖습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;클래스다이어그램.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVsd9l/btsLG3pDh0a/ZKS8t3ElIAqfQrxSzgtZuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVsd9l/btsLG3pDh0a/ZKS8t3ElIAqfQrxSzgtZuK/img.png&quot; data-alt=&quot;복소수 클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVsd9l/btsLG3pDh0a/ZKS8t3ElIAqfQrxSzgtZuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVsd9l%2FbtsLG3pDh0a%2FZKS8t3ElIAqfQrxSzgtZuK%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;322&quot; height=&quot;167&quot; data-filename=&quot;클래스다이어그램.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;167&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;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;#include 
#include 
using namespace std;

class Complex
{
    double image;
    double real;
public:
    Complex(double real = 0, double image = 0)
    {
        SetReal(real);
        SetImage(image);
    }
    void SetReal(double value)
    {
        real = value;
    }
    void SetImage(double value)
    {
        image = value;
    }
    double GetReal()const
    {
        return real;
    }
    double GetImage()const
    {
        return image;
    }
    string ToString()const
    {
        char buf[256] = &quot;&quot;;
        if ((real != 0) &amp;amp;&amp;amp; (image != 0))
        {
            if (image &amp;gt; 0)
            {
                sprintf_s(buf, sizeof(buf), &quot;%g+%gi&quot;, real, image);
            }
            else
            {
                sprintf_s(buf, sizeof(buf), &quot;%g%gi&quot;, real, image);
            }
            return buf;
        }
        if (real != 0)
        {
            sprintf_s(buf, sizeof(buf), &quot;%g&quot;, real);
            return buf;
        }
        if (image != 0)
        {
            sprintf_s(buf, sizeof(buf), &quot;%gi&quot;, image);
            return buf;
        }
        return &quot;0&quot;;
    }
};

int main(void)
{
    Complex c1;
    Complex c2(2.1);
    Complex c3(2.1,3.3);
    Complex c4(0, 3.3);
    Complex c5(2.1, 0);
    Complex c6(2.1, -3.3);

    cout &amp;lt;&amp;lt; &quot;c1:&quot; &amp;lt;&amp;lt; c1.ToString() &amp;lt;&amp;lt;endl;
    cout &amp;lt;&amp;lt; &quot;c2:&quot; &amp;lt;&amp;lt; c2.ToString() &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;c3:&quot; &amp;lt;&amp;lt; c3.ToString() &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;c4:&quot; &amp;lt;&amp;lt; c4.ToString() &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;c5:&quot; &amp;lt;&amp;lt; c5.ToString() &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;c6:&quot; &amp;lt;&amp;lt; c6.ToString() &amp;lt;&amp;lt; endl;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;다음은 실행 결과입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;c1:0
c2:2.1
c3:2.1+3.3i
c4:3.3i
c5:2.1
c6:2.1-3.3i&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C &amp;amp; C++/C++ 예제 및 소스</category>
      <category>C++</category>
      <category>독립기념관</category>
      <category>복소수 클래스</category>
      <category>소스 코드</category>
      <category>캡슐화</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/336</guid>
      <comments>https://ehpro.tistory.com/336#entry336comment</comments>
      <pubDate>Wed, 8 Jan 2025 12:30:44 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] CSV 파일 입출력 &amp;ndash; StreamReader 클래스 및 StreamWriter 클래스 사용</title>
      <link>https://ehpro.tistory.com/334</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PiVAssq_E3o&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bg1v5s/hyXWm5waj4/fr0MVheTiWhDsM6H5cqEAk/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/e8Rq2/hyXWwAjWxI/QUAjAPyBsGb4tjxm2jCYwk/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;CSV 파일 입출력 -  StreamReader 클래스, StreamWriter 클래스 사용 [C#]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PiVAssq_E3o&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;CSV 파일 입출력 &amp;ndash; StreamReader 클래스 및 StreamWriter 클래스 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;안녕하세요. 언제나 휴일에 언휴예요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 강의에서는 데이터 분석에서 많이 사용하는 &amp;ldquo;CSV&amp;rdquo; 포멧의 파일 입출력을 알아볼게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;CSV 파일은 데이터를 콤마를 기준으로 열거합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 엑셀 등의 프로그램으로 보면 테이블 형태로 확인할 수가 있죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여러분들이 CSV 파일 포멧으로 데이터를 기록할 때 주의할 점은 데이터 내용에 콤마가 있다면 다른 문자로 변경한 후에 저장하세요. 만약 이를 유지하길 원한다면 다른 포멧의 파일 입출력을 선택하세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실습은 동영상 강의와 소스 코드를 참고하세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습에서는 StreamReader 클래스와 StreamWtirer 클래스를 이용하여 입출력합니다.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Book.cs&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;namespace StreamReader를_이용한_CSV_포멧_파일_입출력
{
    public class Book
    {
        public string Title
        {
            get;
            private set;
        }
        public string Desc
        {
            get;
            private set;
        }
        public string Author
        {
            get;
            private set;
        }
        public Book(string title,string desc,string author)
        {
            Title = title;
            Desc = desc;
            Author = author;
        }
        public override string ToString()
        {
            return Title;
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;BookManager.cs&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;
using System.IO;

namespace StreamReader를_이용한_CSV_포멧_파일_입출력
{
    public class BookManager: IEnumerable
    {
        List books = new List();
        public void Add(string title, string desc,string author)
        {
            title = title.Replace(&quot;,&quot;, &quot; &quot;);
            desc = desc.Replace(&quot;,&quot;, &quot; &quot;);
            author = author.Replace(&quot;,&quot;, &quot; &quot;);
            books.Add(new Book(title, desc, author));
        }
        public void Save()
        {
            FileStream fs = File.Create(&quot;book.csv&quot;);
            StreamWriter sw = new StreamWriter(fs);
            foreach (Book book in books)
            {
                sw.WriteLine(&quot;{0},{1},{2}&quot;, book.Title, book.Desc, book.Author);
            }
            sw.Close();
            fs.Close();

        }
        public void Load()
        {
            FileStream fs = File.OpenRead(&quot;book.csv&quot;);
            StreamReader sr = new StreamReader(fs);
            string s;
            string[] sitems;
            while(sr.EndOfStream==false)
            {
                s = sr.ReadLine();
                sitems = s.Split(',');
                books.Add(new Book(sitems[0], sitems[1], sitems[2]));
            }
            sr.Close();
            fs.Close();
        }

        public IEnumerator GetEnumerator()
        {
            return books.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return books.GetEnumerator();
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Program.cs&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;/* https://ehpub.co.kr
 * CSV 포멧 파일 입출력
 * StreamReader, StreamWriter 이용 */
using System;

namespace StreamReader를_이용한_CSV_포멧_파일_입출력
{
    class Program
    {
        static void Main(string[] args)
        {
            BookManager bm = new BookManager();
            bm.Add(&quot;ABC,123&quot;, &quot;알파벳과 숫자에 관하여 설명하는 도서&quot;, &quot;알번&quot;);
            bm.Add(&quot;안녕하세요,123&quot;, &quot;테스트 프로그램입니다. 그리고, 테스트입니다.&quot;, &quot;알번&quot;);
            bm.Add(&quot;디딤돌&quot;, &quot;알파벳과 숫자에 관하여 설명하는 도서&quot;, &quot;알번&quot;);
            bm.Add(&quot;실습으로 다지는&quot;, &quot;알파벳과 숫자에 관하여 설명하는 도서&quot;, &quot;알번&quot;);
            bm.Save();

            BookManager bm2 = new BookManager();
            bm2.Load();
            foreach(Book book in bm2)
            {
                Console.WriteLine(&quot;{0}, {1},{2}&quot;, book.Title, book.Desc, book.Author);
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일&amp;nbsp;여행&amp;nbsp;및&amp;nbsp;산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>csv 파일 입출력</category>
      <category>streamreader 클래스</category>
      <category>streamwriter 클래스</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>언제나휴일</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/334</guid>
      <comments>https://ehpro.tistory.com/334#entry334comment</comments>
      <pubDate>Wed, 8 Jan 2025 12:00:53 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 런타임에 라이브러리 로딩하여 사용하기 &amp;ndash; .NET 리플렉션</title>
      <link>https://ehpro.tistory.com/335</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=N__Bnvg6SJ4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bQ7ctB/hyX0ut2npH/VZofrpuiHnp6m6p3aDwlV1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/L24jB/hyX0n2HG48/PDhQ3zSj4fJIzmEyHXhiak/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;.NET 리플렉션, 명시적으로 어셈블리 로딩 [실습으로 다지는 C#]&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/N__Bnvg6SJ4&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;런타임에 라이브러리 로딩하여 사용하기 &amp;ndash; .NET 리플렉션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;안녕하세요. 언제나 휴일에 언휴예요.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 런타임에 라이브러리 로딩? 리플렉션!&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습은 프로그램이 동작하는 런타임에 라이브러리를 로딩하여 사용하는 것을 해 볼 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;.NET에서는 리플렉션이라는 기술을 제공하고 있으며 이를 이용하여 런타임에 라이브러리를 로딩하여 사용합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;런타임에 라이브러리를 로딩하여 사용한다는 것은 무슨 의미일까요?&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 미디어 플레이어 응용과 코덱 라이브러리는 배포자가 다를 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;미디어 플레이어 응용에서 미디어를 선택하여 재생 버튼을 누르면 미디어의 압축 형태에 맞는 코덱 라이브러리를 로딩하여 재생합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 코덱 라이브러리가 없으면 코덱이 없다고 메시지 창을 띄워줍니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이처럼 동작하려면 미디어 플레이어 응용은 코덱을 참조하여 구현하는 것이 아니라 명시적으로 로딩하여 사용하게 구현해야 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 참조하여 구현하면 응용이 시작할 때 해당 라이브러리가 없으면 예외를 발생하여 프로그램은 종료합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;테스트 할 라이브러리를 만들고 참조 추가하지 마세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만든 라이브러리 파일을 명시적 어셈블리 로딩할 프로그램 실행 파일이 있는 곳으로 복사하세요.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 라이브러리 소스 코드&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace DemoLib
{
    public class Demo
    {
        int num;
        public int Num
        {
            get
            {
                return num;
            }
        }
        public int Add(int a,int b)
        {
            Console.WriteLine(&quot;Add 메서드 호출 됨:{0},{1}&quot;, a, b);
            return a + b;
        }
        public Demo(int n)
        {
            Console.WriteLine(&quot;Demo 생성자 호출됨:{0}&quot;, n);
            num = n;
        }
        public static void Foo(string msg)
        {
            Console.WriteLine(&quot;Foo 메서드 호출됨:{0}&quot;, msg);
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 명시적으로 라이브러리 로딩 예제&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;/* https://ehpub.co.kr
 * Reflection
 * 명시적 어셈블리 로딩                                                                                             
 */

using System;
using System.Reflection;

namespace 닷넷_리플렉션___명시적_어셈블리_로딩하여_사용하기
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Assembly asm = Assembly.Load(&quot;DemoLib&quot;);
                //Type[] types = asm.GetTypes();
                //foreach(Type type in types)
                //{
                //    Console.WriteLine(type);
                //}
                Type type = asm.GetType(&quot;DemoLib.Demo&quot;);
                object[] objs = new object[] { 5 };
                object demo_ins = Activator.CreateInstance(type,objs);

                PropertyInfo pi = type.GetProperty(&quot;Num&quot;);
                int num = (int)pi.GetValue(demo_ins);
                Console.WriteLine(&quot;번호:{0}&quot;, num);

                MethodInfo mi = type.GetMethod(&quot;Add&quot;);
                objs = new object[] { 3, 7 };
                int re = (int)mi.Invoke(demo_ins, objs);
                Console.WriteLine(&quot;반환:{0}&quot;, re);

                mi = type.GetMethod(&quot;Foo&quot;);
                objs = new object[] { &quot;헬로우&quot; };
                mi.Invoke(null, objs);
                
                Console.WriteLine(&quot;테스트 종료&quot;);
            }
            catch(Exception ex)
            {
                Console.WriteLine(&quot;예외 발생&quot;);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>독립기념관</category>
      <category>런타임에 라이브러리 로딩</category>
      <category>리플렉션</category>
      <category>명시적 어셈블리 로드</category>
      <category>명시적 어셈블리 로딩</category>
      <category>소스 코드</category>
      <category>언제나휴일</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/335</guid>
      <comments>https://ehpro.tistory.com/335#entry335comment</comments>
      <pubDate>Wed, 8 Jan 2025 11:30:36 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 학생 키우기 &amp;ndash; 학생 구현 및 제어</title>
      <link>https://ehpro.tistory.com/333</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=7xO0hcCHlnI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/vIV9J/hyX0ypFz0X/ZuQyivrXEVldoTAGFbMS1k/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/gDwbN/hyXWmRZfU9/0zEQrsjutFt7ytWEzu4ysK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#]  22. 학생 키우기 Part 1.  학생 구현 및 제어&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/7xO0hcCHlnI&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 학생 키우기 &amp;ndash; 학생 구현 및 제어&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 언제나 휴일, 언휴예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 실습할 시나리오는 학생 개체 1명을 생성한 후에 메뉴를 통해 제어하는 프로그램입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 실습 시나리오입니다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;초기화(Init)
    학생 개체 생성(1명)
사용자와 상호작용(Run)
    F1: 공부하기
    F2: 강의받기
    F3: 잠자기
    F4: 휴식하기
    F5: 음료마시기
    F6: 노래하기
    F7: 학생 상태 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; 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-filename=&quot;[009-1] 학생 클래스 다이어그램.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eyAedL/btsLFdHeZvZ/Nz8D5eNkXSQsTxy4votUPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eyAedL/btsLFdHeZvZ/Nz8D5eNkXSQsTxy4votUPK/img.png&quot; data-alt=&quot;실습할 학생 클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eyAedL/btsLFdHeZvZ/Nz8D5eNkXSQsTxy4votUPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeyAedL%2FbtsLFdHeZvZ%2FNz8D5eNkXSQsTxy4votUPK%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;364&quot; height=&quot;414&quot; data-filename=&quot;[009-1] 학생 클래스 다이어그램.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실습할 학생 클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;학생 형식의 멤버 필드입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;pn: 주민번호(순차부여)
name: 이름(생성 시 전달)
iq: 아이큐(0~200, 초기 100)
hp: 체력(0~200, 초기 100)
stress: 스트레스(0~100, 초기 0)
scnt: 연속으로 공부한 횟수(0~5)
     &quot;공부하다.&quot;, &quot;강의받다&quot;를 할 때는 1 증가, 기타 행동할 때는 0으로 리셋
lastpn: 가장 최근에 부여한 주민번호(정적 멤버)
각 멤버 필드 값 가져오기 블록 제공(속성)

&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;학생 클래스의 메서드입니다. 메서드 이름 뒤의 값은 각 행동을 했을 때 변화하는 수치들입니다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;생성자(이름)
Study: 체력 -5, 아이큐 scnt, 스트레스 2 
ListenLecture: 체력 3, 아이큐 scnt, 스트레스 scnt
Sleep: 체력 10, 스트레스 -5
Relax : 체력 3, 스트레스 -25
Drink : 체력 5, 지력 -10 , 스트레스 2
Sing : 체력 10, 지력 scnt-5, 스트레스 5-scnt&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;학생의 체력, 아이큐, 스트레스, 연속으로 공부한 횟수는 정해진 값이죠. 이러한 값들은 상수 멤버로 정의하세요. 여기에서는 별도의 정적 클래스를 정의하기로 할게요.&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;namespace 학생_키우기_Part1.학생_제어
{
    static class StuConst
    {
        internal const int MIN_IQ = 0;
        internal const int MAX_IQ = 200;
        internal const int DEF_IQ = 100;

        internal const int MIN_HP = 0;
        internal const int MAX_HP = 200;
        internal const int DEF_HP = 100;

        internal const int MIN_STRESS = 0;
        internal const int MAX_STRESS = 100;
        internal const int DEF_STRESS = 0;

        internal const int MAX_SCNT = 5;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;학생 클래스에서 pn은 변하지 않는 값이네요. 읽기 전용으로 표현합시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아이큐, 체력, 스트레스, 연속으로 공부한 횟수는 특정 범위 내에서 제어해야 합니다. 이를 위해 설정하는 부분에서의 로직이 필요하죠. 따라서 멤버 필드를 별도로 선언하고 대응하는 속성을 정의하세요. 물론 set 블록에서 약속한 범위 내에서 동작하게 구현하셔야 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가장 최근에 부여한 주민번호는 정적 멤버로 구현합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기까지 표현한다면 다음처럼 표현할 수 있을 거예요.&lt;/p&gt;
&lt;pre class=&quot;cs&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;    class Student
    {
        readonly int pn;
        internal string Name
        {
            get;
            private set;
        }
        int iq;
        internal int IQ
        {
            get
            {
                return iq;
            }
            private set
            {
                if(value&amp;gt;StuConst.MAX_IQ)
                {
                    value = StuConst.MAX_IQ;
                }
                if(value&amp;lt;StuConst.MIN_IQ)
                {
                    value = StuConst.MIN_IQ;
                }
                iq = value;
            }
        }
        int hp;
        internal int HP
        {
            get
            {
                return hp;
            }
            private set
            {
                if(value &amp;gt; StuConst.MAX_HP)
                {
                    value = StuConst.MAX_HP;
                }
                if(value &amp;lt; StuConst.MIN_HP)
                {
                    value = StuConst.MIN_HP;
                }
                hp = value;
            }
        }
        int stress;
        internal int Stress
        {
            get
            {
                return stress;
            }
            private set
            {
                if(value &amp;gt; StuConst.MAX_STRESS)
                {
                    value = StuConst.MAX_STRESS;
                }
                if(value &amp;lt; StuConst.MIN_STRESS)
                {
                    value = StuConst.MIN_STRESS;
                }
                stress = value;
            }
        }
             
        int scnt;
        internal int SCnt
        {
            get
            {
                return scnt;
            }
            private set
            {
                if(value &amp;lt; StuConst.MAX_SCNT)
                {
                    scnt = value;
                }
            }
        }
        static int lastpn;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 멤버 메서드에서는 속성을 통해 시나리오에 맞게 값을 변경하면 메서드 구현은 쉽게 할 수 있겠죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 멤버 메서드까지 구현한 Student 클래스 소스 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;
namespace 학생_키우기_Part1.학생_제어
{
    class Student
    {
        readonly int pn;
        internal string Name
        {
            get;
            private set;
        }
        int iq;
        internal int IQ
        {
            get
            {
                return iq;
            }
            private set
            {
                if(value&amp;gt;StuConst.MAX_IQ)
                {
                    value = StuConst.MAX_IQ;
                }
                if(value&amp;lt;StuConst.MIN_IQ)
                {
                    value = StuConst.MIN_IQ;
                }
                iq = value;
            }
        }
        int hp;
        internal int HP
        {
            get
            {
                return hp;
            }
            private set
            {
                if(value &amp;gt; StuConst.MAX_HP)
                {
                    value = StuConst.MAX_HP;
                }
                if(value &amp;lt; StuConst.MIN_HP)
                {
                    value = StuConst.MIN_HP;
                }
                hp = value;
            }
        }
        int stress;
        internal int Stress
        {
            get
            {
                return stress;
            }
            private set
            {
                if(value &amp;gt; StuConst.MAX_STRESS)
                {
                    value = StuConst.MAX_STRESS;
                }
                if(value &amp;lt; StuConst.MIN_STRESS)
                {
                    value = StuConst.MIN_STRESS;
                }
                stress = value;
            }
        }
             
        int scnt;
        internal int SCnt
        {
            get
            {
                return scnt;
            }
            private set
            {
                if(value &amp;lt; StuConst.MAX_SCNT)
                {
                    scnt = value;
                }
            }
        }
        static int lastpn;
        internal Student(string name)
        {
            Name = name;
            lastpn++;
            pn = lastpn;
            IQ = StuConst.DEF_IQ;
            HP = StuConst.DEF_HP;
            Stress = StuConst.DEF_STRESS;
        }
        internal void Study()
        {
            HP -= 5;
            IQ += SCnt;
            Stress += 2;
            SCnt++;
        }
        internal void ListenLecture()
        {
            HP += 3;
            IQ += SCnt;
            Stress += SCnt;
            SCnt++;
        }
        internal void Sleep()
        {
            HP += 10;
            Stress -= 5;
            SCnt = 0;
        }
        internal void Relax()
        {
            HP += 3;
            Stress -= 25;
            SCnt = 0;
        }
        internal void Drink()
        {
            HP += 5;
            IQ -= 10;
            Stress += 2;
            SCnt = 0;
        }
        internal void Sing()
        {
            HP += 10;
            IQ += (SCnt - 5);
            Stress += (5 - SCnt);
            SCnt = 0;
        }
        public override string ToString()
        {
            return string.Format(&quot;{0}&amp;lt;{1}&amp;gt;&quot;, Name, pn);
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자와 상호작용을 담당하는 Application 클래스를 작성하는 것은 이전 강의에서 다루었었죠. 다시 한 번 복습한다고 생각하시고 작성해 보세요.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 학생_키우기_Part1.학생_제어
{
    class Application
    {
        #region 단일체
        internal static Application Singleton
        {
            get;
            private set;
        }
        static Application()
        {
            Singleton = new Application();
        }
        Application()
        {
        }
        #endregion 단일체


        Student student = null;
        internal void Init()
        {
            Console.WriteLine(&quot;학생 키우기 Part1 - 학생 제어&quot;);
            Console.WriteLine(&quot;생성할 학생 이름을 입력하세요.&quot;);
            Console.Write(&quot;이름:&quot;);
            string name = Console.ReadLine();
            student = new Student(name);
            Console.WriteLine(&quot;아무 키나 누르면 시작합니다.&quot;);
            Console.ReadKey(true);
        }

        internal void Run()
        {
            ConsoleKey key = ConsoleKey.NoName;
            while ((key = SelectMenu()) != ConsoleKey.Escape)//반복((키=메뉴 선택())!=종료키)
            {
                switch (key) //선택한 키에 따라
                {
                    case ConsoleKey.F1: Study(); break;
                    case ConsoleKey.F2: ListenLecture(); break;
                    case ConsoleKey.F3: Sleep(); break;
                    case ConsoleKey.F4: Relax(); break;
                    case ConsoleKey.F5: Drink(); break;
                    case ConsoleKey.F6: Sing(); break;
                    case ConsoleKey.F7: View(); break;
                    default: Console.WriteLine(&quot;잘못 선택하였습니다.&quot;); break;//다른 키: 잘못 선택한 것을 통보
                }
                Console.WriteLine(&quot;아무 키나 누르세요.&quot;);
                Console.ReadKey(true);//사용자가 결과 확인할 기회를 부여(아무 키나 누를 때까지 대기)
            }
        }

        private void View()
        {
            Console.WriteLine(&quot;===  {0}  ===&quot;, student);
            Console.WriteLine(&quot;IQ:{0} HP:{0} Stress:{2} SCNT:{3}&quot;, student.IQ, student.HP, student.Stress, student.SCnt);
        }

        private void Sing()
        {
            Console.WriteLine(&quot;{0} 노래하다.&quot;, student);
            student.Sing();
        }

        private void Drink()
        {
            Console.WriteLine(&quot;{0} 마시다.&quot;, student);
            student.Drink();
        }

        private void Relax()
        {
            Console.WriteLine(&quot;{0} 휴식하다.&quot;, student);
            student.Relax();
        }

        private void Sleep()
        {
            Console.WriteLine(&quot;{0} 잠자다.&quot;, student);
            student.Sleep();
        }

        private void ListenLecture()
        {
            Console.WriteLine(&quot;{0} 강의받다.&quot;, student);
            student.ListenLecture();
        }

        private void Study()
        {
            Console.WriteLine(&quot;{0} 공부하다.&quot;, student);
            student.Study();
        }

        private ConsoleKey SelectMenu()
        {
            Console.Clear();
            Console.WriteLine(&quot;학생 키우기 메뉴&quot;);
            Console.WriteLine(&quot;{0}:공부하기&quot;, ConsoleKey.F1);
            Console.WriteLine(&quot;{0}:강의받기&quot;, ConsoleKey.F2);
            Console.WriteLine(&quot;{0}:잠자기&quot;, ConsoleKey.F3);
            Console.WriteLine(&quot;{0}:휴식하기&quot;, ConsoleKey.F4);
            Console.WriteLine(&quot;{0}:마시기&quot;, ConsoleKey.F5);
            Console.WriteLine(&quot;{0}:노래하기&quot;, ConsoleKey.F6);
            Console.WriteLine(&quot;{0}:정보보기&quot;, ConsoleKey.F7);
            Console.WriteLine(&quot;종료를 원하시면 {0}를 누르세요.&quot;, ConsoleKey.Escape);
            return Console.ReadKey(true).Key;
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//학생 키우기 Part1. 학생 제어
namespace 학생_키우기_Part1.학생_제어
{
    class Program
    {
        static void Main(string[] args)
        {
            Application app = Application.Singleton;
            app.Init();
            app.Run();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>독립기념관</category>
      <category>동영상 강의</category>
      <category>소스 코드</category>
      <category>언제나휴일</category>
      <category>학생 클래스 정의</category>
      <category>학생 클래스 정의하기</category>
      <category>학생 키우기 프로그램</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/333</guid>
      <comments>https://ehpro.tistory.com/333#entry333comment</comments>
      <pubDate>Wed, 8 Jan 2025 11:00:53 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 콘솔 응용의 기본 제어 &amp;ndash; 메뉴로 상호 작용</title>
      <link>https://ehpro.tistory.com/332</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=3KugCL9lmrI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/3igzQ/hyX0nhmZ7q/RA0NAhKNptQw2yO1mB7Lp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/77D08/hyX0om3gik/zGQ8hKfnFovhI1P2FRNESk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C# 동강] 21. 콘솔 응용의 기본 제어 &amp;ndash; 메뉴로 상호 작용&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/3KugCL9lmrI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;div style=&quot;color: #373b41; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 강의에서는 콘솔 응용에서 메뉴를 통해 프로그램의 흐름을 제어하는 실습을 해 볼 거예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔 응용에서 사용자와 상호 작용을 담당하는 형식을 Application이라고 정의할게요.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee;&quot;&gt;&lt;code&gt;class Application
{
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Application 형식 개체는 하나만 존재하는 것이 맞겠죠.&lt;span&gt;&amp;nbsp;&lt;/span&gt;단일체 패턴을 적용하기로 할게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;생성자의 접근 지정을 디폴트 값(private)으로 정하여 클래스 외부에서 개체 생성을 하지 못하게 막습니다. 그리고 정적 멤버로 클래스 외부에서 정적 개체를 참조할 수 있게 가져오기 속성을 제공합니다. 단일체는 정적 생성자에서 만드는 것을 추천합니다. 정적 생성자는 해당 형식을 사용하기 전에 수행하고 단 한 번만 수행하는 것을 보장하기 때문에 단일체를 생성하는 위치로 적당합니다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot; style=&quot;background-color: #e8eaee;&quot;&gt;&lt;code&gt;    class Application
    {
        #region 단일체
        internal static Application Singleton 
        {
            get;
            private set;
        }
        static Application()
        {
            Singleton = new Application(); 
        }
        Application()
        {

        }
        #endregion 단일체
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Application 개체에서는 초기화, 사용자와 상호 작용(실제 주요 프로그램 동작부), 해제화를 수행하는 세 개의 메서드를 외부 클래스에 제공할게요.&lt;/p&gt;
&lt;pre class=&quot;cs&quot; style=&quot;background-color: #e8eaee;&quot;&gt;&lt;code&gt;    class Application
    {
        ...중략...
        internal void Init()
        {
        }

        internal void Run()
        {
        }
        internal void Exit()
        {
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 실습에서 초기화와 해제화에서는 할 것이 특별히 없습니다. 차후에 초기화에서 파일에서 정보를 로딩하는 부분과 해제화에서 저장하는 등의 작업을 추가할 수 있을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;여기에서는 단순히 프로그램이 시작하고 끝난다는 것을 인지할 수 있는 정도의 작업만 추가하기로 할게요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;해제화(Exit) 메서드에서 사용자가 마지막으로 아무 키나 누르면 종료할 수 있게 할게요. 이 때 Console.ReadLine 메서드는 적절치 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Console.ReadLine 메서드는 사용자로부터 정보를 입력받기 위한 메서드입니다. 따라서 입력 도중에 잘못 누른 것을 지울 수 있게 백스페이스 키를 제공합니다. 이는 입력이 끝났다는 의사 표현으로 엔터를 입력하게 하는 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아무 키나 누르면 바로 반응하는 메서드는 Console.ReadKey입니다. 입력 인자로 bool 형식 인자를 하나 받습니다. 만약 true를 전달하면 키를 눌렀을 때 콘솔 화면에 출력하지 않고 false를 누르면 콘솔 화면에 누른 키를 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;여기에서는 단순히 흐름 제어를 위한 것이지 정보 입력을 위한 것이 아니므로 true를 전달할게요.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee;&quot;&gt;&lt;code&gt;    class Application
    {
        ...중략...
        internal void Init()
        {
            Console.WriteLine(&quot;콘솔 응용의 기본 제어 - 메뉴로 상호 작용&quot;);
            Console.WriteLine(&quot;아무 키나 누르면 시작합니다.&quot;);
            Console.ReadKey(true);
        }

        internal void Run()
        {
        }
        internal void Exit()
        {
            Console.WriteLine(&quot;아무 키나 누르시면 프로그램을 종료합니다.&quot;);
            Console.ReadKey(true);
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이제 사용자와 상호작용하에 프로그램 흐름을 제어할 Run 메서드를 작성합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;전체 흐름은 종료 키를 선택할 때까지 선택한 키에 따라 함수를 수행하는 것을 반복하는 것입니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee;&quot;&gt;&lt;code&gt;  
    class Application
    {
        ...생략...

        internal void Run()
        {
            //반복((키=메뉴 선택())!=종료키)
            {
                //선택한 키에 따라
                {
                    //키1 일 때: 메서드1 수행
                    //키2 일 때: 메서드2 수행
                    //키3 일 때: 메서드3 수행
                    //키4 일 때: 메서드4 수행
                    //키15일 때: 메서드5 수행
                    //다른 키: 잘못 선택한 것을 통보
                }
                //사용자가 결과 확인할 기회를 부여(아무 키나 누를 때까지 대기)
            }
        }
        ...생략...
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;사용자로부터 메뉴를 입력받을 때도 Console.ReadKey 메서드가 적절합니다. 다음은 메뉴 선택과 메서드1~메서드5까지 추가한 예제 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee;&quot;&gt;&lt;code&gt;using System;

namespace 콘솔_응용_상호_작용_개요___메뉴
{    
    class Application
    {
        #region 단일체
        internal static Application Singleton
        {
            get;
            private set;
        }
        static Application()
        {
            Singleton = new Application(); 
        }
        Application()
        {
        }
        #endregion 단일체



        internal void Init()
        {
            Console.WriteLine(&quot;콘솔 응용의 기본 제어 - 메뉴로 상호 작용&quot;);
            Console.WriteLine(&quot;아무 키나 누르면 시작합니다.&quot;);
            Console.ReadKey(true);
        }

        internal void Run()
        {
            ConsoleKey key = ConsoleKey.NoName;
            while((key = SelectMenu())!= ConsoleKey.Escape)//반복((키=메뉴 선택())!=종료키)
            {
                switch(key) //선택한 키에 따라
                {
                    case ConsoleKey.F1: FunA(); break;//키1 일 때: 메서드1 수행
                    case ConsoleKey.F2: FunB(); break;//키2 일 때: 메서드2 수행
                    case ConsoleKey.F3: FunC(); break;//키3 일 때: 메서드3 수행
                    case ConsoleKey.F4: FunD(); break;//키4 일 때: 메서드4 수행
                    case ConsoleKey.F5: FunE(); break;//키15일 때: 메서드5 수행
                    default: Console.WriteLine(&quot;잘못 선택하였습니다.&quot;); break;//다른 키: 잘못 선택한 것을 통보
                }
                Console.WriteLine(&quot;아무 키나 누르세요.&quot;);
                Console.ReadKey(true);//사용자가 결과 확인할 기회를 부여(아무 키나 누를 때까지 대기)
            }
        }
        internal void Exit()
        {
            Console.WriteLine(&quot;아무 키나 누르시면 프로그램을 종료합니다.&quot;);
            Console.ReadKey(true);
        }

        private void FunE()
        {
            Console.WriteLine(&quot;FunE&quot;);
        }

        private void FunD()
        {
            Console.WriteLine(&quot;FunD&quot;);
        }

        private void FunC()
        {
            Console.WriteLine(&quot;FunC&quot;);
        }

        private void FunB()
        {
            Console.WriteLine(&quot;FunB&quot;);
        }

        private void FunA()
        {
            Console.WriteLine(&quot;FunA&quot;);
        }

        private ConsoleKey SelectMenu()
        {
            Console.Clear();
            Console.WriteLine(&quot;사용자와 상호 작용 개요 - 메뉴편&quot;);
            Console.WriteLine(&quot;{0}:FunA&quot;, ConsoleKey.F1);
            Console.WriteLine(&quot;{0}:FunB&quot;, ConsoleKey.F2);
            Console.WriteLine(&quot;{0}:FunC&quot;, ConsoleKey.F3);
            Console.WriteLine(&quot;{0}:FunD&quot;, ConsoleKey.F4);
            Console.WriteLine(&quot;{0}:FunE&quot;, ConsoleKey.F5);
            Console.WriteLine(&quot;종료를 원하시면 {0}를 누르세요.&quot;, ConsoleKey.Escape);
            return Console.ReadKey(true).Key;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;진입점에서는 Application 단일체를 참조한 후 초기화, 상호 작용, 해제화 순으로 진행합니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//콘솔 응용 메뉴를 통한 상호 작용 개요
namespace 콘솔_응용_상호_작용_개요___메뉴
{
    class Program
    {
        static void Main(string[] args)
        {
            Application app = Application.Singleton;
            app.Init();
            app.Run();
            app.Exit();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #373b41; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>c# 코드</category>
      <category>C++</category>
      <category>Console.ReadKey</category>
      <category>단일체 패턴</category>
      <category>독립기념관</category>
      <category>메뉴 선택하기</category>
      <category>소스 코드</category>
      <category>콘솔 응용 흐름 제어</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/332</guid>
      <comments>https://ehpro.tistory.com/332#entry332comment</comments>
      <pubDate>Wed, 8 Jan 2025 10:30:41 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 콘솔 글자 색 바꾸기 &amp;ndash; Windows API 함수 사용</title>
      <link>https://ehpro.tistory.com/331</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=aY8zltEEqIM&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cnXNGk/hyX0rRCC0W/iiceU2kigtA6IIJotaHI6K/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/d20EYi/hyX0AA1n3i/uAgKCxEa1mUK3ikP7j1xqK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C# 동강] 20. 콘솔 글자 색 바꾸기 - Windows API 함수 사용&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/aY8zltEEqIM&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의는 콘솔 글자 색을 바꾸는 실습입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;별다른 알고리즘은 없고 필요한 몇 개의 기술을 사용할 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; 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-filename=&quot;콘솔 글자 색 바꾸기 실행 화면.png&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPVicf/btsLGjM5GI4/quO5YTbDVZeBa8a7UqkvL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPVicf/btsLGjM5GI4/quO5YTbDVZeBa8a7UqkvL0/img.png&quot; data-alt=&quot;콘솔 색 바꾸기 실습 실행화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPVicf/btsLGjM5GI4/quO5YTbDVZeBa8a7UqkvL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPVicf%2FbtsLGjM5GI4%2FquO5YTbDVZeBa8a7UqkvL0%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;284&quot; height=&quot;90&quot; data-filename=&quot;콘솔 글자 색 바꾸기 실행 화면.png&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;콘솔 색 바꾸기 실습 실행화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;콘솔의 글자 색을 바꾸기 위해 Windows API 함수를 사용할 수 있어요.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;- 콘솔의 글자 색을 바꾸는 함수
WINBASEAPI BOOL WINAPI SetConsoleTextAttribute(_In_ HANDLE hConsoleOutput,_In_ WORD wAttributes);
    
- 표준 핸들을 얻어오는 함수
    WINBASEAPI HANDLE WINAPI GetStdHandle(_In_ DWORD nStdHandle);
    
- 표준 출력 핸들 상수
    #define STD_OUTPUT_HANDLE   ((DWORD)-11)    
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Windows API와 같은 Native 기술을 사용할 때 DllImport 어튜리뷰트를 이용하여 외부에 있다는 것을 선언해 주어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 인자 형식이 BOOL, INT, DWORD 등은 int로 표현하세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;WORD는 short 형식으로 표현하세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;HANDLE이나 포인터 형식은 IntPtr로 표현하세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;선언문에서 정적 멤버로 캡슐화하고 외부에 있는 것을 extern으로 나타냅니다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;[DllImport(&quot;Kernel32.dll&quot;)]
static extern int SetConsoleTextAttribute(IntPtr hConsoleOutput, short wAttributes);

[DllImport(&quot;Kernel32.dll&quot;)]
static extern IntPtr GetStdHandle(int nStdHandle);    
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;매크로 상수는 const 멤버로 설정하세요.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;여기에서 이러한 멤버들은 WrapAPI 클래스를 만들어서 래핑(Wrapping)할게요. 단순히 래핑 목적이라 정적 클래스로 정의하는 것을 권합니다. 그리고 외부에서 접근해서 사용할 수 있는 멤버 메서드를 만들어 위에 선언한 멤버를 사용할게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이를 표현한 전체 코드입니다. 참고로 콘솔에서 사용할 수 있는 0~15까지의 색상 값을 열거형으로 정의했어요.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;
using System.Runtime.InteropServices;

namespace Windows_API_활용하여_콘솔_글자색_바꾸기
{
    public enum ConTextColor { LACK, BLUE, GREEN, JADE, RED,
        PURPLE, YELLOW, WHITE, GRAY, LIGHT_BLUE, LIGHT_GREEN,
        LIGHT_JADE, LIGHT_RED, LIGHT_PURPLE,
        LIGHT_YELLOW, LIGHT_WHITE };

    public static class WrapAPI
    {
        [DllImport(&quot;Kernel32.dll&quot;)]
        static extern int SetConsoleTextAttribute(IntPtr hConsoleOutput, short wAttributes);

        [DllImport(&quot;Kernel32.dll&quot;)]
        static extern IntPtr GetStdHandle(int nStdHandle);

        const int STD_OUTPUT_HANDLE = -11;
        public static void SetConsoleTextColor(ConTextColor color)
        {
            IntPtr handle = GetStdHandle(STD_OUTPUT_HANDLE);
            SetConsoleTextAttribute(handle, (short)color);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이제 래핑한 WrapAPI SetConsoleTextColor 정적 메서드를 사용하면 끝입니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실력으로 다지는 C#
//Windows API를 활용하여 콘솔 글자색 바꾸기

using System;
namespace Windows_API_활용하여_콘솔_글자색_바꾸기
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.ReadKey();
            WrapAPI.SetConsoleTextColor(ConTextColor.GREEN);
            Console.WriteLine(&quot;언제나 휴일&quot;);
            Console.ReadKey();
            WrapAPI.SetConsoleTextColor(ConTextColor.WHITE);
            Console.WriteLine(&quot;실습으로 다지는 C#&quot;);
            Console.ReadKey();
            WrapAPI.SetConsoleTextColor(ConTextColor.LIGHT_PURPLE);
            Console.WriteLine(&quot;http://ehpub.co.kr&quot;);
            Console.ReadKey();
            WrapAPI.SetConsoleTextColor(ConTextColor.WHITE);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;낯선 기술을 사용하는 것은 두려울 수도 있지만 즐길 수 있다면 웃음을 줄 수도 있어요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>getstdhandle</category>
      <category>setconsoletextattribute</category>
      <category>setconsoletextcolor</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>언제나휴일</category>
      <category>콘솔 글자 색 바꾸기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/331</guid>
      <comments>https://ehpro.tistory.com/331#entry331comment</comments>
      <pubDate>Wed, 8 Jan 2025 10:00:22 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#]택배 요금 계산 시뮬레이션</title>
      <link>https://ehpro.tistory.com/330</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=OHkPjV2cZg4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bfXuCG/hyX0s34ifY/ULQAwJ8XvN7paJ3tP51eK0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/sIi6z/hyXWw1lVHh/YjQv9LvgP6yGjkSvLqYkA1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C# 동강] 19.택배 요금 계산 시뮬레이션&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/OHkPjV2cZg4&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#]택배 요금 계산 시뮬레이션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot;&gt;&amp;nbsp;이번 강의에서는 택배 요금을 계산하는 시뮬레이션을 만들어 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[19-1] 택배 클래스 다이어그램.png&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkuRv6/btsLE4XRpUK/7gcl4HmhUrrgbyd7xbf411/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkuRv6/btsLE4XRpUK/7gcl4HmhUrrgbyd7xbf411/img.png&quot; data-alt=&quot;택배 요금 실습 클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkuRv6/btsLE4XRpUK/7gcl4HmhUrrgbyd7xbf411/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkuRv6%2FbtsLE4XRpUK%2F7gcl4HmhUrrgbyd7xbf411%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;524&quot; height=&quot;395&quot; data-filename=&quot;[19-1] 택배 클래스 다이어그램.png&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;택배 요금 실습 클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;City, Parcel, Application 세 개의 클래스로 구성하고 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;City 클래스는 도시 이름과 (기준 도시에서) 상대적 거리를 멤버로 갖습니다.&amp;nbsp; 그리고 다른 도시와의 거리를 계산하는 메서드를 제공합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Parcel 클래스는 기준 요금과 무게를 멤버로 갖고 요금을 계산하는 메서드를 제공합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Application은 택배 시스템 시뮬레이션으로 하나의 개체만 허용하는 단일체 패턴을 적용할게요.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;단일체로 표현하기 위해 정적 멤버로 단일체를 참조하는 멤버 필드를 추가합니다. 그리고 정적 생성자에서 단일체를 생성합니다.&amp;nbsp; 정적 생성자는 해당 형식을 사용하기 전에 동작하는 것을 보장하며 한 번만 동작합니다. 단일체를 생성하기 적합한 곳이죠. 그리고 생성자를 정의하세요. 단, 접근 지정은 디폴트 가시성을 갖는 private으로 지정하세요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아래 코드는 단일체를 표현한 코드 예입니다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;class Singleton
{
    static Singleton singleton;
    static Singleton()
    {
        singleton = new Singleton();
    }
    Singleton()
    {
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 택배_요금_계산_시뮬레이션
{
    public class City
    {
        readonly double relative_position;
        public string Name
        {
            get;
            private set;
        }
        public City(string name, double relative_position)
        {
            Name = name;
            this.relative_position = relative_position;
        }
        public double CalculateDistance(City city)
        {
            double distance = relative_position - city.relative_position;
            return Math.Abs(distance);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;namespace 택배_요금_계산_시뮬레이션
{
    public class Parcel
    {
        public const int base_fee = 100;
        double weight;
        public Parcel(double weight)
        {
            this.weight = weight;
        }
        public double CalculateFee(double distance)
        {
            return weight * base_fee * distance;
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;

namespace 택배_요금_계산_시뮬레이션
{
    class Application
    {
        #region 단일체 패턴
        static Application application;
        static Application()
        {
            application = new Application();
        }
        Application()
        {
        }
        #endregion
        List cities = new List();
        internal static void Run()
        {
            application.Init();
            application.Simulation();
        }

        private void Simulation()
        {
            City dep_city = SelectCity(&quot;도착 도시&quot;);
            if(dep_city == null)
            {
                Console.WriteLine(&quot;잘못 선택하였습니다.&quot;);
                return;
            }
            City arr_city = SelectCity(&quot;출발 도시&quot;);
            if(arr_city == null)
            {
                Console.WriteLine(&quot;잘못 선택하였습니다.&quot;);
                return;
            }
            Parcel parcel = MakeParcel();
            PrintDeliveryFee(dep_city, arr_city, parcel);
        }

        private void PrintDeliveryFee(City dep_city, City arr_city, Parcel parcel)
        {
            double distance = dep_city.CalculateDistance(arr_city);
            Console.WriteLine(&quot;택배 요금:{0}원&quot;, parcel.CalculateFee(distance));
        }

        private Parcel MakeParcel()
        {
            Console.WriteLine(&quot;무게 (Kg):&quot;);
            double weight = 0;
            double.TryParse(Console.ReadLine(), out weight);
            return new Parcel(weight);
        }

        private City SelectCity(string msg)
        {
            Console.Write(&quot;{0} (&quot;, msg);
            for(int i = 0; i&amp;lt;cities.Count; i++)
            {
                Console.Write(&quot;{0}:{1} &quot;, i, cities[i].Name);
            }
            Console.Write(&quot;):&quot;);

            int index = 0;
            if(int.TryParse(Console.ReadLine(), out index)==false)
            {
                return null;
            }
            if((index&amp;lt;0)||(index&amp;gt;=cities.Count))
            {
                return null;
            }
            return cities[index];
        }

        private void Init()
        {
            cities.Add(new City(&quot;부산&quot;, 0));
            cities.Add(new City(&quot;대구&quot;, 105.84));
            cities.Add(new City(&quot;대전&quot;, 259.24));
            cities.Add(new City(&quot;서울&quot;, 397.40));
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//택배 요금 계산 시뮬레이션

namespace 택배_요금_계산_시뮬레이션
{
    class Program
    {
        static void Main(string[] args)
        {
            Application.Run();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>c# 소스 코드</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>언제나 휴일</category>
      <category>클래스 다이어그램</category>
      <category>택배 요금</category>
      <category>택배 요금 계산</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/330</guid>
      <comments>https://ehpro.tistory.com/330#entry330comment</comments>
      <pubDate>Wed, 8 Jan 2025 09:30:59 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 실현 관계(Realization) 실습</title>
      <link>https://ehpro.tistory.com/329</link>
      <description>&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=RjMeGGw9HiM&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/ch3ku4/hyXWqNCtuI/OaRwrNlzsIwyL4KakvzC10/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/66GIU/hyX0xEh6ya/K1c7RRB6RX7lzkBikuUuRK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 18. 실현 관계(Realization) 실습&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/RjMeGGw9HiM&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 실현 관계(Realization) 실습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의는 실현(Realization) 관계 실습입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;실현 관계는 기능을 약속한 형식과 이를 구체적으로 구현한 형식 사이의 관계입니다. 결국 인터페이스와 인터페이스에 약속한 기능을 구현한 형식 사이의 관계입니다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능을 약속한 형식과 약속한 기능을 구체적으로 구현한 형식 사이의 관계&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이러한 실현 관계로 표현하였을 때 가장 큰 장점은 같은 방법으로 사용할 수 있다는 것입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; 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-filename=&quot;[18-1] 실현 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rrSJu/btsLGlKSZeM/lFKpzzXqg4nVRyzBWpEbCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rrSJu/btsLGlKSZeM/lFKpzzXqg4nVRyzBWpEbCk/img.png&quot; data-alt=&quot;실현 관계 클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rrSJu/btsLGlKSZeM/lFKpzzXqg4nVRyzBWpEbCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrrSJu%2FbtsLGlKSZeM%2FlFKpzzXqg4nVRyzBWpEbCk%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;463&quot; height=&quot;264&quot; data-filename=&quot;[18-1] 실현 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실현 관계 클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;클래스 다이어그램에서 IStudy 인터페이스와 Student는 실현 관계입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;클래스 다이어그램에서 IStudy 인터페이스와 Gorillar도 실현 관계입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;클래스 다이어그램을 보면서 코드로 표현해 보세요. 특별한 알고리즘은 없어서 설명은 생략할게요. 주의할 점은 Student는 Man에서 파생하고 IStudy에 약속한 기능을 구현하고 있다는 것이죠. 둘 다 파생 문법으로 표현하지만 기반 형식인 Man을 먼저 표시해야 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;class Student:Man, IStudy&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;namespace 실현_관계
{
    interface IStudy
    {
        void Study();
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;namespace 실현_관계
{
    class Man
    {
        string name;
        public Man(string name)
        {
            this.name = name;
        }
        public override string ToString()
        {
            return name;
        }        
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 실현_관계
{
    class Student : Man, IStudy
    {
        readonly int sn;
        public Student(string name,int sn):base(name)
        {
            this.sn = sn;
        }
        public void Study()
        {
            Console.WriteLine(&quot;{0} 공부합니다.&quot;,this);
        }
        public override string ToString()
        {
            return string.Format(&quot;{0}번 이름:{1}&quot;, sn, base.ToString());
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 실현_관계
{
    class Gorilla : IStudy
    {
        public void Study()
        {
            Console.WriteLine(&quot;나도 공부한다. 쿵쾅 쿵쾅&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//실현 관계(Realization)

using System;

namespace 실현_관계
{
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student(&quot;홍길동&quot;,1);
            Gorilla gorilla = new Gorilla();
            Console.WriteLine(&quot;생성한 학생:{0}&quot;, student);

            Test(student);
            Test(gorilla);
        }
        static void Test(IStudy istudy)
        {
            istudy.Study();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Nkh0B/hyXWr6POKQ/xph8hY6A8r4yaLox8cwnp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b5C2GG/hyX0spr4bm/1Ye5fAVg1vXdzUXYP2Caf0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>C++</category>
      <category>realization</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>실현 관계</category>
      <category>언제나 휴일</category>
      <category>언제나휴일</category>
      <category>클래스 다이어그램</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/329</guid>
      <comments>https://ehpro.tistory.com/329#entry329comment</comments>
      <pubDate>Wed, 8 Jan 2025 09:00:55 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 의존(Dependency) 관계 실습 &amp;ndash; Part1</title>
      <link>https://ehpro.tistory.com/328</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=0_gSRI0KJR8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/uLiV5/hyX0lDK3Gj/3QST5z4eh2np0nfc5wL7G0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/uSBMf/hyX0psCCB0/KkkqCksfLRFrRdf8FFu9LK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 16. 의존(Depnendency) 관계 실습 - Part1&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/0_gSRI0KJR8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;의존관계(Dependency) 실습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 강의는 의존(Dependency) 관계 실습(Part 1 &amp;ndash; 설계까지)입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;*아직 대리자(delegate)를 학습하기 전이면 간략히 보신 후에 대리자를 학습 후에 보시기 바랍니다.*&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; 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-filename=&quot;의존.png&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsiCKc/btsLFWxadsk/i0PFOKdZCm2N1cSyNgqLB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsiCKc/btsLFWxadsk/i0PFOKdZCm2N1cSyNgqLB0/img.png&quot; data-alt=&quot;의존관계 클래스다이어그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsiCKc/btsLFWxadsk/i0PFOKdZCm2N1cSyNgqLB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsiCKc%2FbtsLFWxadsk%2Fi0PFOKdZCm2N1cSyNgqLB0%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;256&quot; height=&quot;132&quot; data-filename=&quot;의존.png&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;의존관계 클래스다이어그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 실습에서는 Item 형식과 이를 화면에 노출하는 ItemControl 형식간의 관계를 표현할 것입니다. Item 형식 개체의 속성이 바뀌면 ItemControl 개체에서도 화면 내용을 변경해야겠죠. 이 때 Item 형식 개체를 원본 개체라고 부릅니다. 물론, ItemControl 개체는 의존 개체입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그런데 Item 개체 정보가 바뀌었다는 것을 ItemControl은 어떻게 알수 있을까요? 의존 관계를 제공하기 위해서는 두 개체 사이에 Binding 정보를 관리할 수 있는 시스템 혹은 개체가 필요합니다. 여기에서는 BindingSystem을 정의합시다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;BindingSystem은 내부에 Item 개체 값이 바뀔 때 처리를 위한 이벤트를 멤버로 갖습니다. ItemControl은 BindingSystem에게 Item 개체 정보가 바뀔 때 처리할 이벤트 핸들러를 등록합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Item 개체는 자신의 값이 바뀌면 BindingSystem에게 이를 통보할 거예요. 그리고 BindingSystem에서는 이벤트 핸들러를 등록한 것이 있으면 이를 호출합니다. 결국 ItemControl에서 등록한 이벤트 핸들러가 동작하는 것이죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이와 같은 원리로 ItemContrl은 Item 개체의 값이 바뀐 사실을 인지하고 화면에 바뀐 값을 출력할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[016-1] 의존 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/paMOk/btsLFJri1l2/AXWMwrNUaVJwVvGtnuKj3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/paMOk/btsLFJri1l2/AXWMwrNUaVJwVvGtnuKj3k/img.png&quot; data-alt=&quot;의존관계 클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/paMOk/btsLFJri1l2/AXWMwrNUaVJwVvGtnuKj3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpaMOk%2FbtsLFJri1l2%2FAXWMwrNUaVJwVvGtnuKj3k%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;785&quot; height=&quot;441&quot; data-filename=&quot;[016-1] 의존 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;의존관계 클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일&amp;nbsp;여행&amp;nbsp;및&amp;nbsp;산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bfkWTJ/hyX0nBz3F1/pmPNKPRFIBR0pLQtbAjKJ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/iiydu/hyX0qLPWXZ/QxKCDgL5byFdkdoDz5irX0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>C++</category>
      <category>dependency</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>언제나 휴일</category>
      <category>언제나휴일</category>
      <category>의존 관계</category>
      <category>이벤트 핸들러</category>
      <category>클래스 다이어그램</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/328</guid>
      <comments>https://ehpro.tistory.com/328#entry328comment</comments>
      <pubDate>Tue, 7 Jan 2025 13:00:03 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 연관 관계(Association) 실습 &amp;ndash; 의사, 약사</title>
      <link>https://ehpro.tistory.com/327</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=OUTW5ItGqdo&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/KODfQ/hyXWAWTto6/AfjWO1zO2upBoSk43S7xBK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/wo2Nq/hyX0xYuIYB/3horBTV2CbHqXmiq1bOccK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 15. 연관 관계(Association) 실습 - 의사, 약사&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/OUTW5ItGqdo&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[C#] 연관 관계(Association) 실습 &amp;ndash; 의사, 약사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의는 연관 관계(Association) 실습입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;연관 관계는 두 형식 개체가 협업하는 관계입니다. 현실 세계에서는 수평적인 관계가 이상적이라 생각할 수 있어요. 하지만 프로그램 세계는 명확한 목적을 수행하는 목적 집단입니다. 목적 집단에서는 명확한 수직 관계로 조직화합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;프로그램에 연관 관계가 있을 때 협업하는 메서드를 수행할 때 매우 위험할 수 있어요. 서로 상대의 협업 메서드를 호출하면 실제 메서드는 끝나지 않고 스택 메모리 Overflow가 발생할 수 있는 것입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 실습에서는 이러한 위험성을 확인해 보기로 해요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;실습할 소재는 의사와 약사 사이의 협업입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;의사는 &amp;ldquo;약사와 함께 일하다.&amp;rdquo;, &amp;ldquo;치료하다.&amp;rdquo; 기능을 제공합시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;약사는 &amp;ldquo;의사와 함께 일하다.&amp;rdquo;, &amp;ldquo;조재하다.&amp;rdquo; 기능을 제공합시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; 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-filename=&quot;[15-1] 연관 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjbwzv/btsLEpnbMza/0dcQJnI9g1CGVlnGmYHH1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjbwzv/btsLEpnbMza/0dcQJnI9g1CGVlnGmYHH1K/img.png&quot; data-alt=&quot;연관 관계(Association) 클래스 다이어그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjbwzv/btsLEpnbMza/0dcQJnI9g1CGVlnGmYHH1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjbwzv%2FbtsLEpnbMza%2F0dcQJnI9g1CGVlnGmYHH1K%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;116&quot; data-filename=&quot;[15-1] 연관 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;연관 관계(Association) 클래스 다이어그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 연관_관계_실습
{
    class Druggist
    {
        public void WorkWith(Doctor doctor)
        {
            Console.WriteLine(&quot;약사 - WorkWith&quot;);
            doctor.WorkWith(this);
            Hasty();
        }
        public void Hasty()
        {
            Console.WriteLine(&quot;조재하다.&quot;);
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 연관_관계_실습
{
    class Doctor
    {
        public void WorkWith(Druggist druggist)
        {
            Console.WriteLine(&quot;의사 - WorkWith&quot;);
            druggist.WorkWith(this);
            Treatment();
        }
        public void Treatment()
        {
            Console.WriteLine(&quot;치료하다.&quot;);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//연관(Association) 관계 실습 - 의사, 약사

using System;

namespace 연관_관계_실습
{
    class Program
    {
        static void Main(string[] args)
        {
            Doctor doctor = new Doctor();
            Druggist druggist = new Druggist();
            Console.ReadKey();
            doctor.WorkWith(druggist);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일&amp;nbsp;여행&amp;nbsp;및&amp;nbsp;산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PKjo1MIeqaQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bfkWTJ/hyX0nBz3F1/pmPNKPRFIBR0pLQtbAjKJ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/iiydu/hyX0qLPWXZ/QxKCDgL5byFdkdoDz5irX0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;There is a place I go to when I am having a hard time  It is the Independence Hall of Korea.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PKjo1MIeqaQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>association</category>
      <category>c#</category>
      <category>C++</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>실습으로 다지는 c#</category>
      <category>언제나 휴일</category>
      <category>언제나휴일</category>
      <category>연관 관계</category>
      <category>클래스 다이어그램</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/327</guid>
      <comments>https://ehpro.tistory.com/327#entry327comment</comments>
      <pubDate>Tue, 7 Jan 2025 12:51:57 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 직접 연관 관계(Direct Association) 실습 &amp;ndash; 계산기, 사각형</title>
      <link>https://ehpro.tistory.com/326</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=TGz1vtcF-GI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/WuseL/hyXWwGavfn/WogjRxxOBmxlUWFm3L27v0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/boT6PU/hyXWv8jXFM/hrfVSFyryOzj4msmkIdOzK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 14. 직접 연관 관계 (Direct Association) 실습 &amp;ndash; 계산기, 사각형&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/TGz1vtcF-GI&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 직접 연관 관계(Direct Association) 실습 &amp;ndash; 계산기, 사각형&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의는 직접 연관 관계(Direct Association) 실습입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;직접 연관 관계는 명령을 내리는 형식과 명령을 수행하는 형식 사이의 관계로 가장 흔한 관계입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 실습은 계산기와 사각형을 소재로 실습해 봅시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;계산기에서는 사각형 개체를 입력받아 면적을 계산하는 기능을 제공합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;사각형은 너비와 높이를 멤버 필드로 갖고 이들 값을 가져오기 속성을 제공합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; 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-filename=&quot;[14-1] 직접 연관 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9VeUk/btsLC3qyqVC/9FwLMZ86refwaKtrbqr8h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9VeUk/btsLC3qyqVC/9FwLMZ86refwaKtrbqr8h0/img.png&quot; data-alt=&quot;직접 연관 관계(Direct Association)&amp;amp;nbsp; 클래스 다이어그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9VeUk/btsLC3qyqVC/9FwLMZ86refwaKtrbqr8h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9VeUk%2FbtsLC3qyqVC%2F9FwLMZ86refwaKtrbqr8h0%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;514&quot; height=&quot;141&quot; data-filename=&quot;[14-1] 직접 연관 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직접 연관 관계(Direct Association)&amp;nbsp; 클래스 다이어그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;namespace 직접_연관_관계_실습
{
    class Rectangle
    {
        public int Height
        {
            get;
            private set;
        }
        public int Width
        {
            get;
            private set;
        }
        public Rectangle(int height, int width)
        {
            Height = height;
            Width = width;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;namespace 직접_연관_관계_실습
{
    class Calculator
    {
        public int CalculateArea(Rectangle rectnagle)
        {
            int width = rectnagle.Width;
            int height = rectnagle.Height;
            return width * height;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//14. 직접 연관(Direct Association) 관계 실습 - 계산기, 사각형

using System;

namespace 직접_연관_관계_실습
{
    class Program
    {
        static void Main(string[] args)
        {
            Calculator calculator = new Calculator();
            Rectangle rectangle = new Rectangle(4,5);
            int area = calculator.CalculateArea(rectangle);
            Console.WriteLine(&quot;면적:{0}&quot;, area);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일&amp;nbsp;여행&amp;nbsp;및&amp;nbsp;산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/shorts/nfrJfbWCZDg&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/39Tlw/hyXWnPWCOg/XU911uOyi0uD6020eTx3l0/img.jpg?width=405&amp;amp;height=720&amp;amp;face=182_268_207_296,https://scrap.kakaocdn.net/dn/b5ChDl/hyXWrENyXi/TsudWK1jgDg9D0Uf7rJxk0/img.jpg?width=405&amp;amp;height=720&amp;amp;face=182_268_207_296&quot; data-video-width=&quot;405&quot; data-video-height=&quot;720&quot; data-video-origin-width=&quot;405&quot; data-video-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;에버랜드에 요정이 나타났다 #에버랜드#요정 #christmas&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/nfrJfbWCZDg&quot; width=&quot;405&quot; height=&quot;720&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;에버랜드 크리스마스 퍼레이드 요정이 나타났다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>direct association</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>실습으로 다지는 c#</category>
      <category>언제나 휴일</category>
      <category>에버랜드 크리스마스 퍼레이드 요정이 나타났다</category>
      <category>직접 연관 관계</category>
      <category>직접연관관계</category>
      <category>클래스 다이어그램</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/326</guid>
      <comments>https://ehpro.tistory.com/326#entry326comment</comments>
      <pubDate>Sun, 5 Jan 2025 15:30:26 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 구성(Composition) 관계 실습 &amp;ndash; 사람, 눈</title>
      <link>https://ehpro.tistory.com/325</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=NnHD0-L2aW8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/c0Sq0Q/hyXWCTTcgO/K8uY1E3SmHucKcqG8KVgu0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/ba1s26/hyXWrkxEHs/P8EMonJaaviJGxTK9knE7k/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 13. 구성 관계 실습 - 사람, 눈&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/NnHD0-L2aW8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 구성(Composition) 관계 실습 &amp;ndash; 사람, 눈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의는 구성(Composition) 관계 실습입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; 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-filename=&quot;[13-1] 구성 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Sj28/btsLENGMLA4/uuOtrg4TuJO1IXLSMmGqm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Sj28/btsLENGMLA4/uuOtrg4TuJO1IXLSMmGqm1/img.png&quot; data-alt=&quot;구성(Composition) 관계 클래스다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Sj28/btsLENGMLA4/uuOtrg4TuJO1IXLSMmGqm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Sj28%2FbtsLENGMLA4%2FuuOtrg4TuJO1IXLSMmGqm1%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;330&quot; height=&quot;140&quot; data-filename=&quot;[13-1] 구성 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;330&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구성(Composition) 관계 클래스다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;클래스 다이어그램을 바탕으로 코드를 구현해 보세요. 주의할 점은 Man 생성자에서 Eye 개체를 생성해야 한다는 것입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;별다른 알고리즘을 갖고 있는 것이 아니어서 코드 설명은 생략할게요.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 구성_관계_실습
{
    class Eye
    {
        double sight;
        bool opened;
        public bool Opened
        {
            get
            {
                return opened;
            }
        }
        public Eye(double sight)
        {
            this.sight = sight;
        }
        public void Open()
        {
            Console.WriteLine(&quot;앞이 보이네. 시력:{0}&quot;, sight);
            opened = true;
        }
        public void Close()
        {
            Console.WriteLine(&quot;앞이 컴컴&quot;);
            opened = false;
        }
        public void See()
        {
            if(opened)
            {
                Console.WriteLine(&quot;앞이 잘 보여&quot;);
            }
            else
            {
                Console.WriteLine(&quot;앞이 안 보여&quot;);
            }
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 구성_관계_실습
{
    class Man
    {
        Eye[] eyes = new Eye[2];
        string name;
        public string Name
        {
            get
            {
                return name;
            }
        }
        public Man(string name)
        {
            this.name = name;
            eyes[0] = new Eye(2.0);
            eyes[1] = new Eye(2.0);
        }
        public void Walk()
        {
            if(eyes[0].Opened==false)
            {
                eyes[0].Open();
            }
            if (eyes[1].Opened == false)
            {
                eyes[1].Open();
            }
            Console.WriteLine(&quot;Go~&quot;);
        }
        public void Sleep()
        {
            if (eyes[0].Opened)
            {
                eyes[0].Close();
            }
            if (eyes[1].Opened)
            {
                eyes[1].Close();
            }
            Console.WriteLine(&quot;쿨~쿨~&quot;);
        }
        public override string ToString()
        {
            return name;
        }

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;stata&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//구성 관계 실습

namespace 구성_관계_실습
{
    class Program
    {
        static void Main(string[] args)
        {
            Man man = new Man(&quot;홍길동&quot;);
            man.Walk();
            man.Sleep();
            man.Walk();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=i36hf-_ZFIo&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bleHi8/hyXWA9AcbX/YUPf9vxk9a8XglmweCIq7k/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/hm1Ao/hyXWm4zIsr/jGYDyVJ4MlWOCfKXfhpLdk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 독립기념관 - 통일 염원의 동산 산책&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/i36hf-_ZFIo&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;독립기념관 통일 염원의 동산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>C++</category>
      <category>composition</category>
      <category>compostion</category>
      <category>구성 관계</category>
      <category>독립기념관</category>
      <category>소스 코드</category>
      <category>실습으로 다지는 c#</category>
      <category>클래스 다이어그램</category>
      <category>통일 염원의 동산</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/325</guid>
      <comments>https://ehpro.tistory.com/325#entry325comment</comments>
      <pubDate>Sun, 5 Jan 2025 15:00:49 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 집합(Aggregation) 관계 실습 &amp;ndash; 쇼핑 센터, 상품</title>
      <link>https://ehpro.tistory.com/324</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=vryfmpptkuQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bXMssR/hyXWoVAMyh/reRqW8utj03KRvOWuNkfm0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bmk24W/hyXWxdYMmw/IQiBhUbQDCuekiyZeXzYIk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 12. 집합 관계 실습  - 쇼핑 센터, 상품&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/vryfmpptkuQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 집합(Aggregation) 관계 실습 &amp;ndash; 쇼핑 센터, 상품&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의는 집합(Aggregation) 관계를 코드로 표현하는 실습입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;실습 소재는 쇼핑 센터와 상품입니다. 집합 관계는 이처럼 컬렉션과 원소 사이의 관계입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;상품은 상품 이름, 가격, 회사 이름, 일련 번호를 갖습니다. 일련 번호는 순차적으로 자동 부여하며 상품은 쇼핑 센터에 입고할 수 있게 표현해 봅시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 클래스 다이어그램을 작성해 보세요.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[012-1] 집합관계 클래스다이어그램.png&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4pvHn/btsLFc7byhl/H402XdpKYv3SQGXVKJ2yik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4pvHn/btsLFc7byhl/H402XdpKYv3SQGXVKJ2yik/img.png&quot; data-alt=&quot;집합(Aggregation) 관계 클래스 다이어그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4pvHn/btsLFc7byhl/H402XdpKYv3SQGXVKJ2yik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4pvHn%2FbtsLFc7byhl%2FH402XdpKYv3SQGXVKJ2yik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;818&quot; height=&quot;298&quot; data-filename=&quot;[012-1] 집합관계 클래스다이어그램.png&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;집합(Aggregation) 관계 클래스 다이어그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이를 코드로 작성합시다.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;namespace 집합_관계
{
    public class Product
    {
        public string Name
        {
            get;
            private set;
        }
        public int Price
        {
            get;
            private set;
        }
        public string Company
        {
            get;
            private set;
        }
        readonly int pn;
        public int PN
        {
            get
            {
                return pn;
            }
        }
        static int lastpn;
        public Product(string name,int price,string company)
        {
            Name = name;
            Price = price;
            Company = company;
            lastpn++;
            pn = lastpn;
        }
        public override string ToString()
        {
            return Name;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;

namespace 집합_관계
{
    class Mall : IEnumerable
    {
        Dictionary&amp;lt;int, Product&amp;gt; pdic = new Dictionary&amp;lt;int, Product&amp;gt;();

        public bool InProduct(Product product)
        {
            if(pdic.ContainsKey(product.PN))
            {
                return false;
            }
            pdic[product.PN] = product;
            return true;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return pdic.Values.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return pdic.GetEnumerator();
        }
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//집합 관계 실습
using System;

namespace 집합_관계
{
    class Program
    {
        static void Main(string[] args)
        {
            Mall mall = new Mall();
            mall.InProduct(new Product(&quot;Escort C#&quot;, 5000, &quot;언제나 휴일&quot;));
            mall.InProduct(new Product(&quot;실습으로 다지는 C#&quot;, 5000, &quot;휴일&quot;));
            foreach(Product product in mall)
            {
                Console.WriteLine(product);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=NmL5NNhIY2s&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/i9WzV/hyXWnoRtwF/p5XwMPabRog5gCWrujqwZ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=694_320_738_368,https://scrap.kakaocdn.net/dn/2TRht/hyXWsjlvPj/49MKCtMELNobADskHtReuK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=694_320_738_368&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 잊지말자. #유관순길#역사문화둘레길 2코스 2.17km #유관순열사기념관#유관순생가지#&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/NmL5NNhIY2s&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;역사문화둘레길 2코스 유관순길&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>aggregation</category>
      <category>c#</category>
      <category>c# 소스 코드</category>
      <category>C++</category>
      <category>소스 코드</category>
      <category>실습</category>
      <category>실습으로 다지는 c#</category>
      <category>언제나 휴일</category>
      <category>집합 관계</category>
      <category>클래스 다이어그램</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/324</guid>
      <comments>https://ehpro.tistory.com/324#entry324comment</comments>
      <pubDate>Sun, 5 Jan 2025 14:30:28 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 일반화 관계(Generalization) 실습 &amp;ndash; 포유류, 호랑이, 사자</title>
      <link>https://ehpro.tistory.com/323</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=nIYoZ3-n904&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/lpFEg/hyXWu2EDhs/fjYdzMxI5unLkeK076Egl0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/qCIKv/hyXWnPZkAa/63qkjmsygI0lPEMb2TKalK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 11. 일반화(Generalization) 관계 실습  - 포유류, 사자, 호랑이&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/nIYoZ3-n904&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 일반화 관계(Generalization) 실습 &amp;ndash; 포유류, 호랑이, 사자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의에서는 일반화 관계(Generalization)를 코드로 표현하는 실습입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;일반화 관계는 &amp;ldquo;A는 B이다.&amp;rdquo;로 표현할 수 있는 형식 사이의 관계라고 했어요. 이번 실습에서는 &amp;ldquo;호랑이는 포유류이다.&amp;rdquo;, &amp;ldquo;사자는 포유류이다.&amp;rdquo;를 표현할 거예요.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;포유류는 공통적으로 새끼에게 젖을 물리는 행위를 합니다. 그리고 울기도 합니다. 물론, 호랑이와 사자는 울음 소리가 다르죠.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이러한 내용을 실습해 볼 거예요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; 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-filename=&quot;[010-1] 일반화 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2pIGU/btsLC7fkfOS/sFnnwu2qkg6BqPLwzlqf71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2pIGU/btsLC7fkfOS/sFnnwu2qkg6BqPLwzlqf71/img.png&quot; data-alt=&quot;일반화 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2pIGU/btsLC7fkfOS/sFnnwu2qkg6BqPLwzlqf71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2pIGU%2FbtsLC7fkfOS%2FsFnnwu2qkg6BqPLwzlqf71%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;379&quot; height=&quot;215&quot; data-filename=&quot;[010-1] 일반화 관계 클래스 다이어그램.png&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일반화 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여러분께서 실습할 내용과 클래스 다이어그램을 토대로 구현을 해 보세요. 그리고 비교해 보시기 바랍니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기반 형식 포유류(Mammal)에는 울다(Cry) 메서드를 약속합니다. 기능을 구현하지 않고 약속만 할 때 abstract 키워드를 명시하여 추상 메서드로 만듭니다. 또한 추상 멤버가 하나라도 있다면 해당 형식은 반드시 추상 클래스로 정의하여야 합니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 일반화_관계_실습
{
    abstract class Mammal
    {
        public abstract void Cry();
        public void Nurse()
        {
            Console.WriteLine(&quot;새끼에게 젖을 물리다.&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;호랑이와 사자는 포유류를 기반으로 파생 형식으로 정의합니다. 그리고 기반 형식에 추상 메서드로 정의한 Cry를 반드시 재정의해 주어야 합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 일반화_관계_실습
{
    class Tiger:Mammal
    {
        public override void Cry()
        {
            Console.WriteLine(&quot;어흥~ 난 호랑이야.&quot;);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 일반화_관계_실습
{
    class Lion:Mammal
    {
        public override void Cry()
        {
            Console.WriteLine(&quot;어흥~ 난 사자야.&quot;);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 테스트하는 코드에서는 호랑이와 사자 개체를 생성하여 Cry와 Nurse 메서드를 호출해 보기로 합시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반화 관계에서는 기반 형식에 정의한 멤버를 파생 형식에서 상속받는 특징이 있기 때문에 Nurse 메서드를 호출할 수 있어요.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//일반화 관계 실습 - 포유류, 호랑이, 사자

namespace 일반화_관계_실습
{
    class Program
    {
        static void Main(string[] args)
        {
            Mammal[] mammals = new Mammal[2];
            mammals[0] = new Tiger();
            mammals[1] = new Lion();

            foreach(Mammal mammal in mammals)
            {
                mammal.Cry();
                mammal.Nurse();
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실행 결과는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;erlang&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;어흥~ 난 호랑이야.
새끼에게 젖을 물리다.
어흥~ 난 사자야.
새끼에게 젖을 물리다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=6hCWNYy56qA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/pcqu6/hyXWun04Sm/mqffOdrQOJtyArzpUTePu0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bb70h3/hyXWBm59AJ/gQK6Ka21WKCdXLqZdqk7q0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[충남 천안] 잊지말자. #대한독립만세길 #역사문화둘레길산책 1코스 1.37km#병천사거리#유관순열사&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/6hCWNYy56qA&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;역사문화둘레길 1코스 대한독립만세길&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>Generalization</category>
      <category>대한독립만세길</category>
      <category>상속</category>
      <category>소스 코드</category>
      <category>소스 코드 구현</category>
      <category>실습으로 다지는 c#</category>
      <category>언제나 휴일</category>
      <category>일반화 관계</category>
      <category>클래스 다이어 관계</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/323</guid>
      <comments>https://ehpro.tistory.com/323#entry323comment</comments>
      <pubDate>Sun, 5 Jan 2025 14:00:25 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 클래스 간의 관계</title>
      <link>https://ehpro.tistory.com/322</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=yNyaR6vQa_c&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/i0gH5/hyXWnh7MQb/rHE7rU4YJtLhwIVtFH0YPK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/l5ZGg/hyXWwGaj70/kYWTKOmlhtHkSP4TZ1Sxhk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 10. 클래스 간의 관계&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/yNyaR6vQa_c&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 클래스 간의 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의에서는 클래스 간의 관계를 알아볼 거예요.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;클래스 다이어그램으로 관계를 나타낼 때 7가지의 관계가 있어요.&lt;/p&gt;
&lt;pre class=&quot;gcode&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;일반화 관계(Generalization)
집합 관계(Aggregation)
구성 관계(Composition)
직접 연관 관계(Direct Associtaion)
연관 관계 (Association)
의존 관계 (Dependency)
실현 관계 (Realization)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일반화 관계(Generalization)&lt;/b&gt;는 기반 형식과 파생 형식 사이의 관계입니다. &amp;ldquo;피아니스트는 음악가이다.&amp;rdquo; 처럼 &amp;ldquo;이다.&amp;rdquo;로 표현할 수 있는 형식 사이의 관계입니다. 음악가 종류에는 피아니스트, 드러머, 기타리스트 등이 있죠. 이 때 음악가를 기반 형식이라고 말하고 피아니스트를 파생 형식이라고 말합니다. UML에서는 삼각형과 실선으로 표현합니다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피아니스트는 음악가이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.-일반화.png&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nCFEK/btsLEMny3tL/McB7vEN9FbAEudwV8dkEn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nCFEK/btsLEMny3tL/McB7vEN9FbAEudwV8dkEn0/img.png&quot; data-alt=&quot;일반화 관계(Generalization)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nCFEK/btsLEMny3tL/McB7vEN9FbAEudwV8dkEn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnCFEK%2FbtsLEMny3tL%2FMcB7vEN9FbAEudwV8dkEn0%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;234&quot; height=&quot;84&quot; data-filename=&quot;2.-일반화.png&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;일반화 관계(Generalization)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;집합 관계(Aggregation)&lt;/b&gt;은 컬렉션과 원소 사이의 관계입니다. &amp;ldquo;필통은 연필과 지우개 등을 가지고 있다.&amp;rdquo; 처럼 &amp;ldquo;가지고 있다.&amp;rdquo; 혹은 &amp;ldquo;가질 수 있다.&amp;rdquo;로 표현할 수 있는 형식 사이의 관계입니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필통은 연필과 지우개 등을 가지고 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.-집합.png&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be59FW/btsLCIz8A3C/PQNSzMerSCqGzkr589gQJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be59FW/btsLCIz8A3C/PQNSzMerSCqGzkr589gQJk/img.png&quot; data-alt=&quot;집합 관계(Aggregation)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be59FW/btsLCIz8A3C/PQNSzMerSCqGzkr589gQJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe59FW%2FbtsLCIz8A3C%2FPQNSzMerSCqGzkr589gQJk%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;204&quot; height=&quot;123&quot; data-filename=&quot;3.-집합.png&quot; data-origin-width=&quot;204&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;집합 관계(Aggregation)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구성 관계(Composition)&lt;/b&gt;은 포함 형식과 내부 형식 사이의 관계입니다. &amp;ldquo;사람은 눈과 귀 등을 가지고 있다.&amp;rdquo; 처럼 &amp;ldquo;가지고 있다.&amp;rdquo; 혹은 &amp;ldquo;가질 수 있다.&amp;rdquo;로 표현할 수 있는 형식 사이의 관계입니다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람은 눈과 귀 등을 가지고 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.-구성.png&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yEN7r/btsLEHT54uF/11b9budWgFSe9KNZp5LsQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yEN7r/btsLEHT54uF/11b9budWgFSe9KNZp5LsQ1/img.png&quot; data-alt=&quot;구성 관계(Composition)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yEN7r/btsLEHT54uF/11b9budWgFSe9KNZp5LsQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyEN7r%2FbtsLEHT54uF%2F11b9budWgFSe9KNZp5LsQ1%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;179&quot; height=&quot;117&quot; data-filename=&quot;4.-구성.png&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;구성 관계(Composition)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이처럼 집합 관계와 구성 관계는 &amp;ldquo;가지고 있다.&amp;rdquo;로 표현할 수 있는 형식 사이의 관계입니다. 차이점은 집합 관계에서는 소유 개체와 피소유 개체가 만들어지는 과정이 별도로 진행합니다. 하지만 구성 관계에서는 동시에 진행합니다. 필통과 연필은 별도로 만들어지겠죠. 하지만 눈과 귀는 사람이 태어날 때 가지고 태어납니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;집합 관계는 대부분 컬렉션과 원소 사이의 관계라고 생각할 수 있어요.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집합 관계는 컬렉션과 원소 사이의 관계&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;직접 연관 관계(Direct Association)&lt;/b&gt;는 가장 흔한 관계입니다. 명령을 내리는 형식과 이를 수행하는 형식 사이의 관계입니다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고용주는 노동자에게 일을 시킨다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.-직접-연관-관계.png&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zykvv/btsLEbnDKyR/N51p1prGblDfiVl8kexD0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zykvv/btsLEbnDKyR/N51p1prGblDfiVl8kexD0k/img.png&quot; data-alt=&quot;직접 연관 관계(Direct Association)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zykvv/btsLEbnDKyR/N51p1prGblDfiVl8kexD0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzykvv%2FbtsLEbnDKyR%2FN51p1prGblDfiVl8kexD0k%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;200&quot; height=&quot;67&quot; data-filename=&quot;5.-직접-연관-관계.png&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직접 연관 관계(Direct Association)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;연관 관계(Association)&lt;/b&gt;는 서로 상대를 알고 명령할 수 있는 관계입니다. 프로그램에서 위험한 관계이며 다른 안전한 관계로 바꿀 것은 권합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.-연관-관계.png&quot; data-origin-width=&quot;219&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEs8UQ/btsLCKq94aE/D2e9WxYQPsEDkzUPgY1d6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEs8UQ/btsLCKq94aE/D2e9WxYQPsEDkzUPgY1d6K/img.png&quot; data-alt=&quot;연관 관계(Association)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEs8UQ/btsLCKq94aE/D2e9WxYQPsEDkzUPgY1d6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEs8UQ%2FbtsLCKq94aE%2FD2e9WxYQPsEDkzUPgY1d6K%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;219&quot; height=&quot;65&quot; data-filename=&quot;6.-연관-관계.png&quot; data-origin-width=&quot;219&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;연관 관계(Association)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;의존 관계(Dependency)&lt;/b&gt;는 원본 개체의 변화에 따라 의존 개체도 변화하는 형식 사이의 관계입니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 정보가 바뀌면 회원 컨트롤에 표시한 정보를 변경한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 어떠한 형식 개체를 생성하는 책임을 갖고 있을 때도 의존 관계로 표시합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.-의존-관계.png&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7QIPh/btsLEjFXynd/j25YDLJQKHqDc5TskHbdik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7QIPh/btsLEjFXynd/j25YDLJQKHqDc5TskHbdik/img.png&quot; data-alt=&quot;의존 관계(Dependency)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7QIPh/btsLEjFXynd/j25YDLJQKHqDc5TskHbdik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7QIPh%2FbtsLEjFXynd%2Fj25YDLJQKHqDc5TskHbdik%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;256&quot; height=&quot;132&quot; data-filename=&quot;7.-의존-관계.png&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;의존 관계(Dependency)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실현관계(Realization)&lt;/b&gt;는 약속한 기능을 구현하는 관계입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8.-실현-관계.png&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccjebR/btsLENNxh0K/kvW8VxCKre1wnV0T12g4MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccjebR/btsLENNxh0K/kvW8VxCKre1wnV0T12g4MK/img.png&quot; data-alt=&quot;실현관계(Realization)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccjebR/btsLENNxh0K/kvW8VxCKre1wnV0T12g4MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccjebR%2FbtsLENNxh0K%2FkvW8VxCKre1wnV0T12g4MK%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;201&quot; height=&quot;80&quot; data-filename=&quot;8.-실현-관계.png&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실현관계(Realization)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일&amp;nbsp;여행&amp;nbsp;및&amp;nbsp;산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=-DilFXlWVoo&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/xQgr6/hyXWun03Zh/LfsR7tpGLQfNcMPRJPtPkk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bpUP9h/hyXWvNX4rn/yErAzWARcIRzONd1Tot3qk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[에버랜드 공연] 크리스마스 퍼레이드#에버랜드#크리스마스#퍼레이드#오후2시&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/-DilFXlWVoo&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;에버랜드 크리스마스 퍼레이드&lt;/figcaption&gt;
&lt;/figure&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>C++</category>
      <category>구성 관계</category>
      <category>구성 관계(composition)</category>
      <category>실습으로 다지는 c#</category>
      <category>실현 관계</category>
      <category>실현 관계 (realization)</category>
      <category>언제나 휴일</category>
      <category>연관 관계</category>
      <category>연관 관계 (association)</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/322</guid>
      <comments>https://ehpro.tistory.com/322#entry322comment</comments>
      <pubDate>Sun, 5 Jan 2025 13:30:29 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 캡슐화 실습 &amp;ndash; 학생 클래스 정의하기</title>
      <link>https://ehpro.tistory.com/321</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=rvzrV4RKLVw&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bBV94f/hyXWA2PifY/Fmar2XbEYZvaH82UGkH4Gk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/dr8lJ6/hyXWtCE8e2/P7RBewW0KXpyGLG30DjsqK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 9. 캡슐화 실습 - 학생 클래스 정의하기&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/rvzrV4RKLVw&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 캡슐화 실습 &amp;ndash; 학생 클래스 정의하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 강의에서는 캡슐화 실습을 해 봅시다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;캡슐화는 여러 개의 멤버를 하나의 형식으로 묶는 과정을 말합니다. 이번 실습에서는 학생 클래스를 정의하는 실습을 해 보기로 할게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;실습할 학생 클래스의 멤버는 다음과 같아요.&lt;/p&gt;
&lt;pre class=&quot;actionscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;학생 클래스
    멤버 필드
        아이큐
        매력
        번호 - 읽기 전용, 순차 부여
        이름
        가장 최근에 부여한 번호 - 정적 멤버
    멤버 메서드
        생성자(이름)
        공부하다(횟수)
        춤추다(횟수)
        노래하다(횟수)
        ToString 재정의
    멤버 속성
        get은 public, set private
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;OOP 프로그래밍에서는 구현할 프로그램을 UML 다이어그램을 이용하여 요구 분석 및 아키텍쳐링, 설계를 한 후에 구체적으로 구현하고 테스트를 하곤 하죠. 특히 형식을 정의할 때 이를 클래스 다이어그램으로 표시하고 형식과 형식 사이의 관계를 도식하곤 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 실습할 학생 클래스를 클래스 다이어그램으로 표현하면 다음처럼 표현할 수 있어요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[009-1] 학생 클래스 다이어그램.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYmgO1/btsLErxbypr/aDOayNcCzrFJsOHuYK6gMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYmgO1/btsLErxbypr/aDOayNcCzrFJsOHuYK6gMK/img.png&quot; data-alt=&quot;학생 클래스 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYmgO1/btsLErxbypr/aDOayNcCzrFJsOHuYK6gMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYmgO1%2FbtsLErxbypr%2FaDOayNcCzrFJsOHuYK6gMK%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;364&quot; height=&quot;414&quot; data-filename=&quot;[009-1] 학생 클래스 다이어그램.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;학생 클래스 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사각형을 삼등분하였을 때 첫 번째 칸은 클래스 이름, 두 번째 칸은 멤버 필드, 세 번째 칸은 멤버 메서드입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 멤버 앞에 + 표시는 public 접근 지정을 의미하고 -는 private 접근 지정을 의미합니다. 참고로 protected 접근 지정은 #으로 표시합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;lastnum과 get_LastNum처럼 밑줄 친 멤버는 정적 멤버를 의미합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특수한 의미를 나타내기 위해 &amp;lt;&amp;lt;스테레오 타입&amp;gt;&amp;gt; 을 사용할 수도 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 시나리오에 맞게 코드를 작성해 보세요. 메서드 내에서 구체적으로 수행할 작업은 여러분들이 추가적으로 시나리오를 작성하여 구현해 보세요. 그리고 난 후에 비교해 보시기 바랍니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;using System;

namespace 캡슐화_실습___학생_클래스_정의하기
{
    class Student//학생 클래스
    {
        #region 멤버 필드
        int iq;//    아이큐
        int cp;//    매력
        readonly int num;//    번호
        string name;//    이름
        static int lastnum;//    가장 최근에 부여한 번호
        #endregion
        #region        //멤버 메서드
        public Student(string name)//    생성자
        {
            this.name = name;
            lastnum++;
            num = lastnum;
        }
        //    공부하다
        public void Study(int tcnt)
        {
            Console.WriteLine(&quot;{0}번 {1}학생 {2}횟수 공부하다.&quot;, num, name, tcnt);
            iq += tcnt;
        }
        //    춤추다
        public void Dance(int tcnt)
        {
            Console.WriteLine(&quot;{0}번 {1}학생 {2}횟수 춤추다.&quot;, num, name, tcnt);
            cp += tcnt;
        }
        //    노래하다
        public void Sing(int tcnt)
        {
            Console.WriteLine(&quot;{0}번 {1}학생 {2}횟수 노래하다.&quot;, num, name, tcnt);
            iq += tcnt / 2;
            cp += tcnt / 2;
        }
        //    ToString 재정의
        public override string ToString()
        {
            return string.Format(&quot;번호:{0} 이름:{1}&quot;, num, name);
        }
        #endregion
        #region//멤버 속성
        //    get은 public, set private
        public int IQ
        {
            get
            {
                return iq;
            }
            private set
            {                
                iq = value;
            }
        }
        public int CP
        {
            get
            {
                return cp;
            }
            private set
            {
                cp = value;
            }
        }
        public int Num
        {
            get
            {
                return num;
            }
        }
        public string Name
        {
            get
            {
                return name;
            }
            private set
            {
                name = value;
            }
        }
        public static int LastNum
        {
            get
            {
                return lastnum;
            }
        }
        
        #endregion
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//9. 캡슐화 실습 - 학생 클래스 정의하기
using System;


namespace 캡슐화_실습___학생_클래스_정의하기
{
    class Program
    {
        static void Main(string[] args)
        {
            Student stu1 = new Student(&quot;홍길동&quot;);
            Student stu2 = new Student(&quot;강감찬&quot;);
            Console.WriteLine(stu1);
            Console.WriteLine(stu2);

            stu1.Study(3);
            Console.WriteLine(&quot;번호:{0} 이름:{1} 아이큐:{2} 매력:{3}&quot;, stu1.Num, stu1.Name, stu1.IQ, stu1.CP);
            stu1.Dance(4);
            Console.WriteLine(&quot;번호:{0} 이름:{1} 아이큐:{2} 매력:{3}&quot;, stu1.Num, stu1.Name, stu1.IQ, stu1.CP);
            stu1.Sing(6);
            Console.WriteLine(&quot;번호:{0} 이름:{1} 아이큐:{2} 매력:{3}&quot;, stu1.Num, stu1.Name, stu1.IQ, stu1.CP);

            Console.WriteLine(&quot;가장 최근에 부여한 학생 번호:{0}&quot;, Student.LastNum);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실행 결과는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;번호:1 이름:홍길동
번호:2 이름:강감찬
1번 홍길동학생 3횟수 공부하다.
번호:1 이름:홍길동 아이큐:3 매력:0
1번 홍길동학생 4횟수 춤추다.
번호:1 이름:홍길동 아이큐:3 매력:4
1번 홍길동학생 6횟수 노래하다.
번호:1 이름:홍길동 아이큐:6 매력:7
가장 최근에 부여한 학생 번호:2&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=alYJnnfYsdc&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/9apdb/hyXWuVPWKa/jb5jxQKkIuunPTaKKSsuek/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bhKSGO/hyXWo9dKpa/vh4dMRekeTsdDeR7vPmXJ1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;코타키나발루 이마고(IMAGO) 전통춤 공연 [말레이시아] (부제) INFJ가 사람들 앞에 나서다니, 유튜브&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/alYJnnfYsdc&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;코타키나발루 IMAGO 대나무 전통춤 공연&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>C++</category>
      <category>실습으로 다지는 c#</category>
      <category>언제나 휴일</category>
      <category>캡슐화</category>
      <category>코타키나발루 imago 대나무춤 전통 공연</category>
      <category>클래스 다이어그램</category>
      <category>학생 클래스</category>
      <category>학생 클래스 정의하기</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/321</guid>
      <comments>https://ehpro.tistory.com/321#entry321comment</comments>
      <pubDate>Sun, 5 Jan 2025 13:00:56 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 랜덤 값 맞추기</title>
      <link>https://ehpro.tistory.com/320</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=cxPP-fKhfoE&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/boEnRy/hyXWonLhoK/5RxuO7jtgKUE64kZoYfAF1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/cEEdyT/hyXWptvus9/QfkkQqxWa3ADYr4ROPXza0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 8. 랜덤 수 맞추기&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/cxPP-fKhfoE&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 랜덤 값 맞추기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의에서는 컴퓨터가 생각한 랜덤 값(0~99)을 사용자가 10번 시도 내에 맞추는 프로그램을 만들어 봅시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 문제를 해결하기 위한 논리를 생각하고 의사 코드(pseudo code)로 표현해 보세요. 여러분께서 먼저 작성한 후에 비교해 보세요.&lt;/p&gt;
&lt;pre class=&quot;mercury&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;rnum := 랜덤 값
반복(tcnt:1-&amp;gt;10)                            
    guess := 추측값 입력
    조건(guess is equals rnum)                                    
        반복문 탈출
    조건(guess&amp;gt;rnum)
        더 작다고 알려준다.
    아니면
        더 크다고 알려준다.

조건(시도 횟수가 10보다 작거나 같으면)
    시도 횟수와 성공하였음을 알려준다.
아니면            
    실패하였다고 알려준다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 프로젝트를 생성하여 의사 코드를 주석으로 처리하고 코드를 작성해 봅시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로그램 시작부에 어떠한 프로그램인지 보여주기로 합시다. 참고로 C#에서 랜덤 값을 생성할 때 사용하는 형식은 Random 클래스입니다. 시작할 때 Random 형식 개체를 생성하세요.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;Random random = new Random();
Console.WriteLine(&quot;0~99 사이의 정수 중에 컴퓨터가 생각한 수를 맞춰보세요.&quot;);
Console.WriteLine(&quot;*** 10회 안에 맞춰야 성공입니다.&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;0~99 사이의 값 중에 랜덤 값을 발생시킵니다. Random 형식 개체의 Next 메서드를 호출하면 랜덤 값을 발생시킵니다. 만약 입력 인자로 정수 n을 전달하면 n가지(0~n-1) 정수 중에 하나의 랜덤 값을 반환합니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;int rnum = random.Next(100);//rnum:= 랜덤 값            
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;사용자는 총 10회 시도할 수 있습니다. 시도 횟수를 기억할 변수(tcnt)와 사용자가 예측한 정수를 기억할 변수(guess)를 선언하고 반복문을 작성합시다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;int tcnt;
int guess;
for(tcnt=1; tcnt&amp;lt;=10; tcnt++)//반복(tcnt: 1-&amp;gt;10)
{
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자에게 몇 번째 시도인지 알려주고 예상 값을 입력받습니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;Console.Write(&quot;{0}번째 시도, 예상값:&quot;, tcnt);
int.TryParse(Console.ReadLine(), out guess);//guess:= 추측값 입력
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예측한 값과 랜덤 값이 일치하면 반복문을 탈출합니다.&lt;/p&gt;
&lt;pre class=&quot;gauss&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;if(guess == rnum)//조건(guess is equals rnum)
{
    break;//반복문 탈출
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일치하면 반복문을 탈출하였기 때문에 현재 반복문 내부라면 일치하지 않다는 것입니다. 이제 예측한 값이 랜덤 값보다 큰 지 판별하여 결과를 알려줍니다.&lt;/p&gt;
&lt;pre class=&quot;arcade&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;if(guess&amp;gt;rnum)//조건(guess &amp;gt; rnum)
{
    Console.WriteLine(&quot;더 작습니다.&quot;);//더 작다고 알려준다.
}
else//아니면
{
    Console.WriteLine(&quot;더 큽니다.&quot;);//더 크다고 알려준다.
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이제 반복문에서 할 일은 끝났습니다. 반복문 수행 후에 성공하여 반복문을 나온 것이지 시도 횟수를 모두 사용하여 나온 것인지 판별합니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;if(tcnt&amp;lt;=10)//조건(시도 횟수가 10보다 작거나 같으면)
{
    Console.WriteLine(&quot;{0}번 시도하여 정답을 맞추셨군요&quot;, tcnt);//시도 횟수와 성공하였음을 알려준다.
}
else//아니면
{
    Console.WriteLine(&quot;실패하였습니다.&quot;);//실패하였다고 알려준다.
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 컴퓨터가 생각한 랜덤한 정수를 알려줍니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;Console.WriteLine(&quot;컴퓨터가 생각한 정수는 {0}&quot;, rnum); &lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트를 빌드한 후에 테스트를 수행하세요. 여기에서는 실행 결과는 생략할게요.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음은 이번 실습에서 작성한 소스 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//ehpub.co.kr
//실습으로 다지는 C#
//8. 랜던 값 맞추기
using System;

namespace _008_랜덤_값_맞추기
{
    class Program
    {
        static void Main(string[] args)
        {
            Random random = new Random();
            Console.WriteLine(&quot;0~99 사이의 정수 중에 컴퓨터가 생각한 수를 맞춰보세요.&quot;);
            Console.WriteLine(&quot;*** 10회 안에 맞춰야 성공입니다.&quot;);

            int rnum = random.Next(100);//rnum:= 랜덤 값
            int tcnt;
            int guess;
            for(tcnt=1; tcnt&amp;lt;=10; tcnt++)//반복(tcnt: 1-&amp;gt;10)
            {
                Console.Write(&quot;{0}번째 시도, 예상값:&quot;, tcnt);
                int.TryParse(Console.ReadLine(), out guess);//guess:= 추측값 입력
                if(guess == rnum)//조건(guess is equals rnum)
                {
                    break;//반복문 탈출
                }
                if(guess&amp;gt;rnum)//조건(guess &amp;gt; rnum)
                {
                    Console.WriteLine(&quot;더 작습니다.&quot;);//더 작다고 알려준다.
                }
                else//아니면
                {
                    Console.WriteLine(&quot;더 큽니다.&quot;);//더 크다고 알려준다.
                }
            }

            if(tcnt&amp;lt;=10)//조건(시도 횟수가 10보다 작거나 같으면)
            {
                Console.WriteLine(&quot;{0}번 시도하여 정답을 맞추셨군요&quot;, tcnt);//시도 횟수와 성공하였음을 알려준다.
            }
            else//아니면
            {
                Console.WriteLine(&quot;실패하였습니다.&quot;);//실패하였다고 알려준다.
            }
            Console.WriteLine(&quot;컴퓨터가 생각한 정수는 {0}&quot;, rnum);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일&amp;nbsp;여행&amp;nbsp;및&amp;nbsp;산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=KvObzEoMOoM&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/ZP0ZB/hyXWxLNvEx/QqGq0abYjnMiLyJmonqA31/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/xjpL0/hyXWxSw15m/UdB7KvJrwz7GXILFVrVkr0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[에버랜드 공연] Very Merry! 산타빌리지 댄스 모음&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/KvObzEoMOoM&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;에버랜드 공연 Very Merry Santa Village&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>C++</category>
      <category>random</category>
      <category>very merry santa village</category>
      <category>랜덤 값 맞추기</category>
      <category>소스 코드</category>
      <category>실습으로 다지는 c#</category>
      <category>언제나 휴일</category>
      <category>에버랜드 공연</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/320</guid>
      <comments>https://ehpro.tistory.com/320#entry320comment</comments>
      <pubDate>Sun, 5 Jan 2025 12:30:37 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 암스트롱의 수</title>
      <link>https://ehpro.tistory.com/319</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=TO5388P20TQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/isgxH/hyXWv8jvNr/WQTL9BKt0uJIeIMunp61ek/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/iGEnk/hyXWo9dGE2/JD2S8vUQMkSWl82tqkNND1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 7. 암스트롱의 수 구하기&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/TO5388P20TQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 암스트롱의 수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 실습에서는 암스트롱의 수를 판별하는 메서드를 만들어 봅시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;암스트롱의 수는 ABC = AXAXA + BXBXB + CXCXC인 정수를 말합니다. 예를 들어 153 = 1 = 125 + 27 입니다. 이러한 수를 암스트롱의 수라고 말합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;[007-1] 암스트롱의 수.png&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQr7y/btsLDUzCQtu/VzeUEp8ja09omiKcFh0nx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQr7y/btsLDUzCQtu/VzeUEp8ja09omiKcFh0nx1/img.png&quot; data-alt=&quot;암스트롱의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQr7y/btsLDUzCQtu/VzeUEp8ja09omiKcFh0nx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQr7y%2FbtsLDUzCQtu%2FVzeUEp8ja09omiKcFh0nx1%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;230&quot; height=&quot;40&quot; data-filename=&quot;[007-1] 암스트롱의 수.png&quot; data-origin-width=&quot;230&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;암스트롱의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이러한 암스트롱의 수를 판별하는 메서드를 만들기 전에 먼저 메서드 이름과 입력 매개 변수와 리턴 형식을 결정합니다. 언제나 알고리즘은 입력 인자와 수행 결과가 어떠한 것이 올 수 있는지를 판단할 수 있어야 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;메서드 이름은 IsAmstrong으로 정할게요. 그리고 입력 인자는 판별할 정수가 필요하므로 정수형 변수 num으로 결정하고 반환은 판별 결과이므로 bool로 결정합시다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;bool IsAmstrong(int num)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 암스트롱의 수를 판별하는 알고리즘을 생각해 보세요. 그리고 이를 의사 코드(pseudo code)로 작성하고 주석으로 변환해 보세요.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;bool IsAmstrong(int num)
{
    //조건(num이 3자리 정수가 아니라면)
        //거짓 반환
    //a := num의 100의 자리의 수
    //b := num의 10의 자리의 수
    //c := num의 1의 자리의 수
    //num2 = a의 3승 + b의 3승 + c의 3승
    //num이 num2와 같은지 판별 결과 반환
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;fortran&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt; 이제 주석을 코드로 치환해 봅시다. 현재는 개발자가 추가 정의하는 형식이 없기 때문에 Program 클래스에 정적 메서드로 정의하세요.&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;dart&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;static bool IsAmstrong(int num)
{
    if ((num &amp;lt; 100) || (num &amp;gt; 999))//조건(num이 3자리 정수가 아니라면)
    {
        return false;//거짓 반환
    }
    int a = num / 100;//a:= num의 100의 자리의 수
    int b = (num % 100) / 10; //b := num의 10의 자리의 수
    int c = num % 10;// c:= num의 1의 자리의 수
    int num2 = a * a * a + b * b * b + c * c * c;//num2 = a의 3승 + b의 3승 + c의 3승
    return num == num2;//num과 num2가 같은지 판별 결과 반환
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이제 암스트롱의 수를 구하는 로직을 작성해 봅시다. 암스트롱의 수는 세 자리 정수이므로 100에서 999 사이의 정수를 확인해 보면 모든 암스트롱의 수를 알아낼 수 있겠죠.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;static void Main(string[] args)
{
    Console.WriteLine(&quot;abc=a*a*a+b*b*b+c*c*c&quot;);
    for(int i = 100; i&amp;lt;1000;i++)
    {
        if(IsAmstrong(i))
        {
            Console.WriteLine(&quot;{0}&quot;, i);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;실행하여 결과를 확인해 보세요.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;abc=a*a*a+b*b*b+c*c*c
153
370
371
407 &lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//ehpub.co.kr
//실습으로 다지는 C#
//7. 암스트롱의 수
//ABC = A의 3승 + B의 3승 + C의 3승
using System;


namespace _007_암스트롱의_수
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(&quot;abc=a*a*a+b*b*b+c*c*c&quot;);
            for(int i = 100; i&amp;lt;1000;i++)
            {
                if(IsAmstrong(i))
                {
                    Console.WriteLine(&quot;{0}&quot;, i);
                }
            }
        }
        static bool IsAmstrong(int num)
        {
            if ((num &amp;lt; 100) || (num &amp;gt; 999))//조건(num이 3자리 정수가 아니라면)
            {
                return false;//거짓 반환
            }
            int a = num / 100;//a:= num의 100의 자리의 수
            int b = (num % 100) / 10; //b := num의 10의 자리의 수
            int c = num % 10;// c:= num의 1의 자리의 수
            int num2 = a * a * a + b * b * b + c * c * c;//num2 = a의 3승 + b의 3승 + c의 3승
            return num == num2;//num과 num2가 같은지 판별 결과 반환
        }
            
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 산책 및 여행&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=bNhmV3FjN7s&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/dYyRVi/hyXWAIvuXu/klCAWV7iMjenqRrQLHx6T1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/dBsiR5/hyXWA2MT5l/UAplkJCcRRsYXgKxe3XCWK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[눈길 산책][충남 천안 신불당] 아름드리공원 산책#아름드리공원#천안#신불당#산책#눈길&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/bNhmV3FjN7s&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;아름드리공원 눈길 산책&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>C++</category>
      <category>소스 코드</category>
      <category>실습으로 다지는 c#</category>
      <category>아름드리공원</category>
      <category>암스트롱의 수</category>
      <category>암스트롱의 수 구하기</category>
      <category>언제나 휴일</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/319</guid>
      <comments>https://ehpro.tistory.com/319#entry319comment</comments>
      <pubDate>Sun, 5 Jan 2025 12:00:48 +0900</pubDate>
    </item>
    <item>
      <title>[실습으로 다지는 C#] 두 개의 정수 사이의 합계 구하기</title>
      <link>https://ehpro.tistory.com/318</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PFB0Q6rP-W0&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/hMQHH/hyXWB8w5zJ/XH6hJJVOhkpk9yGnhfwXV0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/dAJ7ES/hyXWtWWd2n/uUr8vgKFDhMwKnQ4qapUw1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[실습으로 다지는 C#] 6. 두 개의 정수를 입력받아 두 정수 사이의 합계를 구하기&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PFB0Q6rP-W0&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;[실습으로 다지는 C#] 두 개의 정수 사이의 합계 구하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이번 강의에서는 두 개의 정수를 입력 받은 후에 두 개의 정수 사이의 합계를 구하는 실습을 해 봅시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;먼저 어떻게 해야 문제를 해결할 수 있을지 생각한 후에 의사 코드(pseudo code) 형태로 작성해 보세요. 작성한 후에 비교해 보시기 바랍니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;input := 정수를 입력 받는다.
 조건(정수로 변환(input,out num1)이 실패)
     오류를 출력 후 알고리즘 종료
 input := 정수를 입력 받는다.
 조건(정수로 변환(input,out num2)이 실패)
     오류를 출력 후 알고리즘 종료
 조건(num1&amp;lt;num2)
     두 수를 교환(ref num1, ref num2)
 sum:=두 정수 사이의 합계 구하기(num2,num1)
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;gcode&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;두 수를 교환(ref num1, ref num2)
     temp:= num1
     num1:= num2
     num2:= temp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;두 정수 사이의 합계 구하기(start, end):합계
     sum:=0
     반복(value:= start-&amp;gt;end)
         sum:= sum+value
     sum 반환   &lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그리고 프로젝트를 생성한 후에 의사 코드를 주석으로 치환해 보세요. 두 수를 교환하는 부분과 두 정수 사이의 합계를 구하는 부분은 별도의 메서드로 정의해야겠죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;마찬가지로 여러분께서 주석을 작성한 후에 비교해 보세요.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//5. 반복문 실습1
//두 개의 정수를 입력받은 후에 두 수 사이의 모든 정수의 합계 구하기
using System;

namespace _005_반복문_실습1___두_개의_정수를_입력받은_후에_두_수_사이의_모든_정수의_합계_구하기
{
    class Program
    {
        static void Main(string[] args)
        {
            //input:= 정수를 입력 받는다.
            //조건(정수로 변환(input, out num1)이 실패)
            {
                //    오류를 출력 후 알고리즘 종료                
            }

            //input := 정수를 입력 받는다.
            //조건(정수로 변환(input, out num2)이 실패)
            {
                //    오류를 출력 후 알고리즘 종료                
            }

            //조건(num1 &amp;lt; num2)
            {
                //    두 수를 교환(ref num1, ref num2)
            }

            //sum:= 두 정수 사이의 합계 구하기(num2, num1)            
        }

        //두 수를 교환(ref num1, ref num2)
        static void Swap(ref int num1, ref int num2)
        {
            //temp:= num1
            //num1:= num2
            //num2:= temp
        }

        //두 정수 사이의 합계 구하기(start, end):합계
        static int CalSum(int start, int end)
        {
            //sum:= 0
            //반복(value:= start-&amp;gt;end)
            {
                //    sum:= sum + value
            }
            //sum 반환
            return 0;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이제 주석을 코드로 편집해 봅시다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;사용자로부터 입력받는 것은 문자열이므로 정수로 변환하는 작업이 필요합니다. 그리고 변환에 실패하였다면 사용자가 잘못 사용한 것으로 판단해야겠죠.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;Console.WriteLine(&quot;첫 번째 정수를 입력하세요.&quot;);
string input = Console.ReadLine();//input:= 정수를 입력 받는다.
int num1;
if(int.TryParse(input,out num1)==false)//조건(정수로 변환(input, out num1)이 실패)
{
    Console.WriteLine(&quot;정수가 아닙니다.&quot;);//    오류를 출력 후 알고리즘 종료
    return;
}

Console.WriteLine(&quot;두 번째 정수를 입력하세요.&quot;);
input = Console.ReadLine();//input := 정수를 입력 받는다.
int num2;
if(int.TryParse(input,out num2) == false)//조건(정수로 변환(input, out num2)이 실패)

{
    Console.WriteLine(&quot;정수가 아닙니다.&quot;);//    오류를 출력 후 알고리즘 종료
    return;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;두 개의 정수 중에 큰 값은 num1에 작은 값은 num2로 설정할게요. 이를 위해 num2가 더 크면 두 수를 교환합니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;if(num1&amp;lt;num2)//조건(num1 &amp;lt; num2)
{
    Swap(ref num1, ref num2);//    두 수를 교환(ref num1, ref num2)
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;int sum = CalSum(num2, num1);   //sum:= 두 정수 사이의 합계 구하기(num2, num1)
Console.WriteLine(&quot;{0}에서 {1}사이의 합계는 {2}입니다.&quot;, num2, num1, sum);&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//두 수를 교환(ref num1, ref num2) static void Swap(ref int num1, ref int num2) {    int temp = num1;//temp:= num1   num1 = num2;//num1:= num2    num2 = temp;//num2:= temp }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;두 정수 사이의 합계를 구할 때는 합계를 0으로 초기화를 한 후에 반복해서 작은 값에서 큰 값 사이의 값들을 더하면 되겠죠. 이를 위해 반복문에서는 더해야 할 값을 작은 값으로 초기화하고 순차적으로 증가하면서 큰 값이 될 때까지 반복하게 해야 합니다. 그리고 반복해야 할 작업은 현재 합계와 변화하는 값을 더하는 작업을 해야겠죠.&lt;/p&gt;
&lt;pre class=&quot;fortran&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//두 정수 사이의 합계 구하기(start, end):합계
static int CalSum(int start, int end)
{
    int sum = 0;//sum:= 0
    for (int value = start; value &amp;lt;= end; value++)//반복(value:= start-&amp;gt;end)
    {
        sum += value;//    sum:= sum + value
    }
    return sum;//sum 반환            
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이제 빌드 후에 테스트를 수행하세요.&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;=테스트 case1=
 첫 번째 정수를 입력하세요.
 1
 두 번째 정수를 입력하세요.
 100
 1에서 100사이의 합계는 5050입니다.
 =테스트 case2=
 첫 번째 정수를 입력하세요.
 100
 두 번째 정수를 입력하세요.
 1
 1에서 100사이의 합계는 5050입니다.
 =테스트 case3=
 첫 번째 정수를 입력하세요.
 1
 두 번째 정수를 입력하세요.
 백
 정수가 아닙니다.
 =테스트 case4=
 첫 번째 정수를 입력하세요.
 백
 정수가 아닙니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373b41; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;다음은 이번 실습에서 작성한 전체 소스 코드입니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #e8eaee; color: #373b41; text-align: start;&quot;&gt;&lt;code&gt;//http://ehpub.co.kr
//실습으로 다지는 C#
//5. 반복문 실습1
//두 개의 정수를 입력받은 후에 두 수 사이의 모든 정수의 합계 구하기
using System;

namespace _005_반복문_실습1___두_개의_정수를_입력받은_후에_두_수_사이의_모든_정수의_합계_구하기
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(&quot;첫 번째 정수를 입력하세요.&quot;);
            string input = Console.ReadLine();//input:= 정수를 입력 받는다.
            int num1;
            if(int.TryParse(input,out num1)==false)//조건(정수로 변환(input, out num1)이 실패)
            {
                Console.WriteLine(&quot;정수가 아닙니다.&quot;);//    오류를 출력 후 알고리즘 종료
                return;
            }

            Console.WriteLine(&quot;두 번째 정수를 입력하세요.&quot;);
            input = Console.ReadLine();//input := 정수를 입력 받는다.
            int num2;
            if(int.TryParse(input,out num2) == false)//조건(정수로 변환(input, out num2)이 실패)
            {
                Console.WriteLine(&quot;정수가 아닙니다.&quot;);//    오류를 출력 후 알고리즘 종료
                return;
            }

            if(num1&amp;lt;num2) 조건(num1=&quot;&quot; &amp;lt;=&quot;&quot; num2)=&quot;&quot; {=&quot;&quot; swap(ref=&quot;&quot; num1,=&quot;&quot; ref=&quot;&quot; num2);=&quot;&quot; 두=&quot;&quot; 수를=&quot;&quot; 교환(ref=&quot;&quot; }=&quot;&quot; int=&quot;&quot; sum=&quot;CalSum(num2,&quot; num1);=&quot;&quot; sum:=&quot;두&quot; 정수=&quot;&quot; 사이의=&quot;&quot; 합계=&quot;&quot; 구하기(num2,=&quot;&quot; num1)=&quot;&quot; console.writeline(&quot;{0}에서=&quot;&quot; {1}사이의=&quot;&quot; 합계는=&quot;&quot; {2}입니다.&quot;,=&quot;&quot; num2,=&quot;&quot; sum);=&quot;&quot; static=&quot;&quot; void=&quot;&quot; temp=&quot;num1;//temp:=&quot; num1=&quot;&quot; num2=&quot;&quot; 구하기(start,=&quot;&quot; end):합계=&quot;&quot; calsum(int=&quot;&quot; start,=&quot;&quot; end)=&quot;&quot; 0=&quot;&quot; for=&quot;&quot; (int=&quot;&quot; value=&quot;start;&quot; value++)=&quot;&quot; 반복(value:=&quot;start-&quot;&amp;gt;end)
            {
                sum += value;//    sum:= sum + value
            }
            return sum;//sum 반환            
        }
    }
}&amp;lt;/num2)&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제나휴일 여행 및 산책&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=h3r3flqrI5M&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cKuiqq/hyXWrY6Vlc/U6fjzX8OCFBatngDU4rBo1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/beaUV6/hyXWvf7Bwo/rkXQZy0VkcrncFKGCoMqp1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;[겨울 에버랜드]  윈터토피아 with 무민&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/h3r3flqrI5M&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;겨울 에버랜드 Wintertopia with Moomin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#/실습으로 다지는 C#</category>
      <category>c#</category>
      <category>C++</category>
      <category>두 개의 정수 사이의 합계 구하기</category>
      <category>반복문 실습</category>
      <category>소스 코드</category>
      <category>실습으로 다지는 c#</category>
      <category>언제나 휴일</category>
      <category>프로그래밍 실습</category>
      <author>언휴</author>
      <guid isPermaLink="true">https://ehpro.tistory.com/318</guid>
      <comments>https://ehpro.tistory.com/318#entry318comment</comments>
      <pubDate>Sun, 5 Jan 2025 11:30:45 +0900</pubDate>
    </item>
  </channel>
</rss>