<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>waca's field</title>
    <link>https://mattlee.tistory.com/</link>
    <description>tech and life</description>
    <language>ko</language>
    <pubDate>Wed, 10 Jun 2026 21:05:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>wisecow</managingEditor>
    <image>
      <title>waca's field</title>
      <url>https://tistory1.daumcdn.net/tistory/2682444/attach/23f87e563ff44fdfa106eaa19dedea03</url>
      <link>https://mattlee.tistory.com</link>
    </image>
    <item>
      <title>금의 가치 | 비트코인 현상, 블록체인 2.0 | 마이클 J.케이시, 폴 비냐 지음</title>
      <link>https://mattlee.tistory.com/97</link>
      <description>&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;금이 비싼 이유는 금의 고유의 기능과는 크게 관련이 없다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;우리가 흔히 아는 골드바, 그 골드바 1개의 진짜 가치는 무엇일까? 골드바에 내재되어 있는 가치는 도대체 무엇인가? 골드버그들은 금은 견고하고 대체 가능성이 큰 금속이기 때문에 무수한 쓰임새를 갖고 있다고 말한다. // 골드버그(Gold Bug)란 금본위제도가 화폐의 내재적 가치 문제를 해결할 수 있는 방법이라고 주장하는 무리를 일컫는다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;금의 성질은 알면 알수록 놀랍다고 할 수 있다.펴서 늘릴 수도 있으면서도 동시에 내구성이 강하다. 녹여서 모양을 변형할 수 있으며, 이때 광택을 전혀 잃지 않는다. 또한 전기 전도성은 매우 뛰어나 전기회로판에 이용되며, 내구도가 강하고 변색이 잘 되지 않아 치아 임플란트에도 쓰인다. 그러나 확실히 하고 넘어가자. 이런 쓰임새들 때문에 우리가 금을 가치 있게 여기는 것은 아니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;사실 금이 가치를 갖는 이유는 공급의 희소성 때문이다. 금에 매겨진 가치는 전통적으로 보석 장식품으로 쓰였으며 건축물과 인테리어 장식 등으로 사용된 것을 보면 알 수 있듯이 인식된 아름다움과 더 관련이 깊다. 그럼에도 불구하고 아직도 금의 가치에 대한 논쟁은 진행 중이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;우리가 꽃을 보면 그러하듯이 본능적으로 금을 보면 아름답다고 여기는 것인지, 또는 금으로 된 장식물이 부와 번영, 명예 등을 상징하므로 가치가 있다는 통합적 사고를 통해 아름답다고 여기는 것인지 구분하기란 쉽지 않다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;금은 희소하며 이것은 부인할 수 없는 사실이다. 흔히 인류 역사를 통틀어 채굴된 금의 총량은 올림픽 수영장 2개를 채울 정도밖에 안 된다고 얘기한다. 그러나 희소성은 상대적 개념이고 수요가 있을 경우에만 성립한다. 다른 많은 종류의 금속들 또한 희소하다고 볼 수 있지만 수요가 크지 않기 때문에 가치가 높지 않다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;중요한 것은 사람들이 금을 필요로 한다는 사실이다. 금은 우리가 가치 있다고 믿기 때문에 통화나 투자 대상으로서 가치가 있다. 금의 통화로서의 가치는 추상적인 사회의 산물인 것이다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Reading Note</category>
      <category>Gold bug</category>
      <category>골드버그</category>
      <category>금의 가치</category>
      <category>화폐</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/97</guid>
      <comments>https://mattlee.tistory.com/97#entry97comment</comments>
      <pubDate>Sun, 19 Nov 2017 00:06:31 +0900</pubDate>
    </item>
    <item>
      <title>화폐 제도 | 비트코인 현상, 블록체인 2.0 | 마이클 J.케이시, 폴 비냐 지음</title>
      <link>https://mattlee.tistory.com/96</link>
      <description>&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;화폐란 가상의 개념이다. 화폐의 본질은 실존의아닌, 믿음에 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;미크로네시아 연방의 섬인 얍(Yap) 섬은 &lt;b&gt;독특한 화폐제도&lt;/b&gt;를 가지고 있었다. 초기에 이곳에 상륙한 유럽인들은 &lt;b&gt;페이(fei)&lt;/b&gt;라고 불리는 &lt;b&gt;돌 바퀴(Stone wheel)&lt;/b&gt;로 운영되는 &lt;b&gt;화폐제도&lt;/b&gt;를 보고 매우 당황했다. 페이는 300마일 정도 떨어진 곳에서 채굴되며, 지름이 12피트(약 3.7미터)나 된다. 거래가 끝나면, 이 &lt;b&gt;거대한 돌덩이&lt;/b&gt;를 새로운 주인에게 다시 운반하는 것이 너무나 불편한 일이었다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;그래서 종종 옛주인이 돌 바퀴를 계속 갖고 있곤 했다. 그러나 얍 사회에서는 재산권을 나타내는 이 장대한 물건의 소유권이 거래를 거듭하며 누구에게로 넘어갔는지에 대한 &lt;b&gt;상호 간 협의과 원활히&lt;/b&gt; 이루어졌으며, 이 페이는 채무 관계의 청산 및 결제 수단으로서 잘 기능하고 있었다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;미국의 젊은 탐험가였던 윌리엄 헨리 퍼네스 3세(William Henry Furness)가 책에서 했던 이야기에는, 바벨썹(Babelthaup)섬에서 옮기는 도중 페이 하나가 바다로 빠져버렸지만, &lt;b&gt;여전히 새로운 주인이 소유권을 가진 거래 가능한 통화&lt;/b&gt;로 인식되고 있었다는 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;페이 시스템&lt;/b&gt;은 인간 사회가 어떻게 가치와 권력에 대한 &lt;b&gt;추상적 관념을 창조&lt;/b&gt;해내는지를 보여준다. 그리고 이 관념은 돈의 가치가 허구적일지라도 &lt;b&gt;어디에서나 쓰일 수 있다고 누구나 인식하게 된다면 엄청난 사회적 힘을 발휘&lt;/b&gt;한다. 그리하여 이전에는 훨씬 야만적이고 한게점이 많았던 권력 체제였음에도 불구하고 고대 그리스에서는 돈의 등장과 함께 민주주의라는 혁신적인 시스템이 출현할 수 있었던 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;돈이 새로운 세상의 도래를 이끌었고, 많은 가능성들을 창조해냈다. 그러나 추상적 개념을 받아들이는 것만큼 강력한 힘을 가진 것이 또 있었으니, 이는 문명의 발전이었다. 문명의 발전은 개인 중심의 사고에서 벗어나, 세상이 어떻게 돌아가고 특히 가치라는 것이 어떻게 성립하는 것인지에 대해 유의미한 설명을 하고자 하는 투쟁이었다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;벽돌과 박격포를 파는 가게와 기타 물질적 재화들을 보고 자란 옛날 사람들은 요즘 사람들의 '가상의 재화'를 사는 것을 이해하기 힘들어 한다. 이 가상의 재화들은 가상화폐로 지불하는 것이 훨씬 쌀 때가 많으며 우리는 종종 &quot;돈이란 무엇인가&quot;라는 주제로 지적인 토론을 벌이곤 한다. 그렇지만 우리 머릿속 깊이 자리 잡은 1달러 또는 1유로, 혹은 심지어 비트코인처럼 그 자체가 지닌 물질적 가치를 넘어 사고하기란 쉽지 않다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;지금 당장 자신의 지갑에서 1달러를 꺼내보자. 1달러가 될 수도 있고 1유로, 혹은 1,000원인 그 종이를 꺼내보자. 그리고 자세히 들여다보고 이제 스스로에게 물어보자.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;도대체 이것의 가치는 무엇인가?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Reading Note</category>
      <category>가상화폐</category>
      <category>비트코인</category>
      <category>화폐 제도</category>
      <category>화폐란</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/96</guid>
      <comments>https://mattlee.tistory.com/96#entry96comment</comments>
      <pubDate>Sat, 18 Nov 2017 23:57:15 +0900</pubDate>
    </item>
    <item>
      <title>오류 제어</title>
      <link>https://mattlee.tistory.com/95</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39); font-size: 11pt;&quot;&gt;/* 본 포스팅은 한빛미디어의 '쉽게 배우는 데이터 통신과 컴퓨터 네트워크 | 박기현 저'를 참고하여 작성되었음을 미리 알려드립니다. */&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(47, 157, 39); font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;#&amp;nbsp;전송 오류의 유형&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;전송 프레임의 오류를 극복하고, 상위 계층에 신뢰성 있는 전송 서비스를 제공하려면 다음과 같은 기본 기능을 이용해 오류 복구 기능을 제공해야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;* 수신 호스트의 응답 프레임&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;송신 호스트가 전송한 데이터 프레임의 일부가 깨지는 프레임 변형 오류를 확인한 수신 호스트는 송신 호스트에게 응답 프레임을 전송해 원래의 데이터 프레임을 재전송하도록 요구할 수 있다. 수신 호스트가 전송하는 응답 프레임의 종류에는 데이터 프레임이 정상적으로 도착했을 때 회신하는 &lt;b&gt;긍정 응답 프레임&lt;/b&gt;과 데이터 프레임이 깨졌을 때 회신하는 &lt;b&gt;부정 응답 프레임&lt;/b&gt;이 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;* 송신 호스트의 타이머 기능&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;송신 호스트가 전송한 데이터 프레임이 수신 호스트에게 도착하지 못하는 프레임 분실 오류가 발생하면 수신 호스트는 이 사실을 인지할 수 없다. 따라서 오류의 복구 과정이 송신 호스트의 주도로 이루어져야 한다. 송신 호스트는 데이터 프레임을 전송한 후에 일정 시간 이내에 수신 호스트로부터 긍정 응답 프레임 회신이 없으면 &lt;b&gt;타임아웃(Timeout)&lt;/b&gt; 기능을 동작시켜 데이터 프레임을 재전송한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;* 순서 번호 기능&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;수신 호스트의 &lt;b&gt;긍정 응답 프레임을 분실하면&lt;/b&gt; 데이터 프레임이 제대로 도착했음에도 불구하고 송신 호스트가 이를 인지할 수 없다. 따라서 송신 호스트가 타임아웃 기능에 의해 원래 데이터를 재전송함으로써 수신 호스트가 데이터 프레임을 &lt;b&gt;중복 수신&lt;/b&gt;하는 결과를 초래한다. 이럴 때 수신 호스트가 중복 데이터 프레임을 가려내려면 각 프레임 내부에 &lt;b&gt;순서 번호(Sequence Number)&lt;/b&gt;를 기록해야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;데이터 프레임은 원래의 데이터 외에 오류 검출을 위한 정보도 함께 포함한다. 오류 검출을 위한 정보에는 &lt;b&gt;수신 호스트에서 오류를 감지하는 기능만 하는 정보&lt;/b&gt;와 &lt;b&gt;오류가 발생한 프레임을 복구하는 기능&lt;/b&gt;을 하는 정보가 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;오류를 감지만 하는 방법을 사용할 때는 송신 호스트의 도움을 받아 오류 복구 기능을 수행 해야 한다. 즉, 수신 호스트가 데이터 프레임을 올바로 수신하면 송신 호스트에 &lt;b&gt;긍정 응답(Positive Acknowledgement)&lt;/b&gt; 프레임을 보냄으로써, 송수신 호스트 사이의 전송이 완결된다. 그러나 프레임 변형 오류가 발생하면 &lt;b&gt;부정 응답(Negative Acknowledgement)&lt;/b&gt; 프레임을 회신해 송신 호스트의 재전송 기능에 따라 오류 복구 과정을 진행한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;* 정상적인 전송&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;송신 호스트가 전송한 데이터가 오류 없이 수신 호스트에게 전송된 경우다. &lt;b&gt;수신 호스트는&lt;/b&gt; 데이터 프레임을 제대로 수신했다는 &lt;b&gt;긍정 응답 프레임을 회신함&lt;/b&gt;으로써 하나의 &lt;b&gt;데이터 프레임에 대한 전송 과정이 완료&lt;/b&gt;된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;송신 호스트가 긍정 응답 프레임을 회신 받지 못하면 데이터 프레임에 오류가 발생했다는 의미다. 일반적으로 변형된 프레임을 수신한 호스트는 부정 응답 프레임을 전송할 수도 있지만, 프로토콜의 종류에 따라서는 부정 응답 프레임을 지원하지 않을 수도 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;이때는 수신 호스트가 회신할 방법이 없으므로 &lt;b&gt;송신 호스트의 타임아웃 기능에 따라 오류 복구 기능을 시작&lt;/b&gt;한다. 데이터 프레임은 정상적으로 전송되었지만, 수신 호스트의 긍정 응답 프레임이 송신 호스트에게 도착하지 못해도 송신 호스트의 타임아웃 기능에 따라 오류를 복구한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;* 프레임 변형&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;데이터 프레임이 수신 호스트에 도착했으나, &lt;b&gt;전송 과정에서 프레임의 내용이 변형되는 오류&lt;/b&gt;가 발생하는 경우다. &lt;b&gt;프레임 변형 오류를 인지한 수신 호스트는 송신 호스트에게 부정 응답 프레임을 전송함&lt;/b&gt;으로써, 원래의 데이터 프레임을 재전송하는 오류 복구 과정이 진행된다. 앞서 언급한 것처럼 부정 응답 프레임을 재전송하는 오류 복구 과정이 진행된다. 앞서 언급한 것처럼 부정 응답 프레임을 사용하지 않는 프로토콜 에서는 송신 호스트의 타임아웃 기능에 따라 복구 과정을 시작한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;한편 재전송된 데이터 프레임은 올바르게 전송될 수도 있지만, 반대로 이 과정에서 &lt;b&gt;또 다시 변형 오류가 발생&lt;/b&gt;할 수도 있다. 또한 &lt;b&gt;긍정이나 부정 응답 프레임도 전송 과정에서 변형이나 분실과 같은 오류가 발생&lt;/b&gt;할 수 있다. 따라서 데이터 링크 계층 프로토콜에서 다루는 전송 오류 문제의 원리는 매우 단순하지만, 프로토콜 설계시 세심한 주의가 필요하다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 프레임 내부에 시퀀스 번호(순서 번호)를 두는 이유도 이 때문이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;* 프레임 분실&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;데이터 링크 계층의 주요 기능 중 하나는 프레임을 전송한 &lt;b&gt;송신 호스트가 동작하는 타임아웃 기능&lt;/b&gt;이다. 송신 호스트가 전송한 데이터 프레임이 전송 과정에서 사라지는 프레임 분실 오류를 생각해보자. 수신 호스트는 송신 호스트로부터 어떠한 데이터 프레임도 전달 받지 못했기 때문에 긍정 응답이나 부정 응답 프레임을 회신할 수 없다. 결과적으로 송신 호스트도 응답 프레임을 회신받을 수 없어 응답 프레임을 무작정 기다려야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;수신 호스트는 데이터 프레임의 분실 여부를 인지할 수 없으므로&lt;/b&gt; 오류 복구는 &lt;b&gt;송신 호스트 주도로 타임아웃(Timeout)기능&lt;/b&gt;에 따라 처리된다. 즉, 송신 호스트는 데이터 프레임을 전송한 후에 특정 시간까지 수신 호스트의 긍정 응답 프레임이 도착하지 않으면 타임아웃 기능에 따라 원래의 프레임을 스스로 재전송한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;# 순서(Sequence) 번호&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;데이터 링크 계층의 오류 복구 기능이 수행되는 과정에서 동일한 데이터 프레임이 수신 호스트에 중복해 도착할 수 있다. 따라서 오류 없이 수신된 중복 데이터의 문제에 대비해야 한다. 중복 데이터 처리는 프레임 내부에 각 프레임의 고유 번호인 &lt;b&gt;순서 번호(Sequence Number)&lt;/b&gt;를 기록하여 해결한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;* 순서 번호의 필요성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;올바르게 수신한 데이터 프레임에 대한 긍정 응답 프레임이 사라지는 오류가 발생하면 송신 호스트의 타임아웃 기능에 따라 재전송 과정이 진행된다. 재전송된 데이터 프레임이 제대로 수신되면 수신 호스트 입장에서는 동일한 프레임을 중복해 수신하는 결과를 초래한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;송신 호스트 입장에서 보면 자신이 동일한 데이터 프레임을 두 번 전송했는지, 아니면 서로 다른 두 개의 데이터 프레임을 연속 전송했는지 구분할 수 있다. 그러나 &lt;b&gt;수신 호스트는 두 경우를 구분할 방법이 없다.&lt;/b&gt; 따라서 수신 호스트가 두 경우를 구분할 수 있도록 데이터 프레임별로 고우의 순서 번호를 표기하는 방식이 필요하다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 데이터 전송이 모두 성공한다고 가정하면, 순서 번호가 따로 필요 없겠지만 실패할 확률은 엄연히 존재하기 때문에 이것에 대한 대비책으로서 순서 번호가 필요한 것이다. 좀 더 풀어 설명해보면, 수신한 데이터 프레임의 시퀀스 번호가 1이었고, 다음에 온 데이터 프레임 시퀀스 번호도 1이라면 이는 중복을 의미한다. 바로 이 원리로 수신 호스트는 데이터의 중복 여부를 파악할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; color: rgb(47, 157, 39);&quot;&gt;&lt;b&gt;# 흐름 제어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;오류 제어와 함께 데이터 링크 계층에서 제공하는 주요 기능은 전송 데이터의 속도 조절이다. 송신 호스트는 &lt;b&gt;수신 호스트가 감당할 수 있을 정도의 전송 속도&lt;/b&gt;를 유지하면서 데이터 프레임을 전송해야 하는데, 이러한 기능을 &lt;b&gt;흐름 제어(Flow Control)&lt;/b&gt;라 한다. 흐름 제어는 송신 호스트가 수신 호스트보다 아주 빨리 데이터를 전송하는 경우에 필요하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;흐름 제어 기능을 제공하지 않으면 수신 호스트는 자신에게 도착한 데이터 프레임을 내부 버퍼에 보관할 여유를 갖지 못한다. 따라서 전송 매체를 통해 올바르게 도착한 데이터가 분실되는 결과를 초래할 수 있다. 흐름 제어 기능의 부재에 따른 프레임 분실은 앞서 설명한 전송 오류의 프레임 분실과 동일한 결과를 가져오기 때문에 이것도 데이터를 재전송하는 방법으로 복구해야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;흐름 제어의 기본 원리는수신 호스트가 다음에 수신할 프레임의 전송 시점을 송신 호스트에 통지하는 방식이다. 가장 많이 사용하는 흐름 제어 프로토콜의 예는 슬라이딩 윈도우 프로토콜이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/Network</category>
      <category>긍정 응답 프레임</category>
      <category>네트워크 오류 제어</category>
      <category>부정 응답 프레임</category>
      <category>송수신</category>
      <category>시퀀스 번호</category>
      <category>타임아웃</category>
      <category>흐름 제어</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/95</guid>
      <comments>https://mattlee.tistory.com/95#entry95comment</comments>
      <pubDate>Wed, 25 Oct 2017 21:22:21 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;Pycharm settings&amp;gt;Theme, Changing font_size etc...</title>
      <link>https://mattlee.tistory.com/90</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 모든 IDE가 그렇듯, Pycharm 또한 테마 혹은 폰트를 변경하기 위해서는 File &amp;gt; Settings를 클릭하여 설정창을 띄운 후 원하는 부분을 수정해주면 된다. 하지만 수많은 옵션 속에 우리가 원하는 부분만을 골라내어 수정하기란 매우 번거롭다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;이 글은 Pycharm 사용이 익숙치 않은 분들에게 가장 도움이 될 수 있는 몇 가지 옵션을 쉽고 빠르게 적용할 수 있게끔 사진과 함께 안내한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 도움이 될 수 있다는 건 물론 나의 주관적인 판단이다. 테마를 다양하게 설정할 수 있는 방법과 Visual Studio에서와 같이 Ctrl + MouseWheel 로 폰트 크기를 조절할 수 있게끔 설정할 수 있는 방법을 소개한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;먼저 Pycharm의 테마를 다양하게 설정할 수 있는 방법을 소개한다. 방법이라 봤자 쓸만한 Plugin을 다운받는 것이 전부이지만. 첫째로, File &amp;gt; Settings를 클릭하여 창을 연다. 좌측의 메뉴 중 Plugins 항목을 클릭하면 아래와 같은 화면을 만나볼 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 850px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99185A3359D3344C24&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99185A3359D3344C24&quot; width=&quot;850&quot; height=&quot;665&quot; filename=&quot;Plugins.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 위의 창에서 확인해야 할 건 하단의 3가지 탭이다. Install JetBrains plugin... / Browse repositories... / Install plugin from disk... 탭 중 Browse repositories... 탭을 클릭하자. 아래의 사진과 같이 검색창에 'Material Theme UI'라고 검색한 후 Install을 클릭해서 설치한다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 826px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9929733359D3352423&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9929733359D3352423&quot; width=&quot;826&quot; height=&quot;695&quot; filename=&quot;Material Theme UI.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;Install을 진행한 이후에 Pycharm을 다시 실행시켜주면, 아래의 사진과 같이 상단 메뉴바의 Tools에 Material Theme 항목이 추가되어 있는 것을 확인할 수 있고, 기본 Pycharm에서 제공하는 3가지 밋밋한 테마 이외의 다양한 컬러의 테마를 만나볼 수 있다. 자신이 원하는 테마를 선택하여 적용하면 된다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 뿐만 아니라 File &amp;gt; Settings에 가면 Material Theme 항목이 Appearance &amp;amp; Behavior에도 추가되어 있는 걸 확인할 수 있는데, 해당 탭에서는 폰트 컬러 등 사용자가 원하는 디자인을 추가할 수 있게끔 되어 있다. 아마 따로 작업을 해주지 않아도 사용하는데는 큰 무리가 없을 것이다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 850px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995F7C3359D335F02E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995F7C3359D335F02E&quot; width=&quot;850&quot; height=&quot;389&quot; filename=&quot;Material Theme.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;이제 마지막으로 Ctrl + MouseWheel 로 폰트 사이즈를 조절할 수 있는 방법을 소개한다. 생각보다 간단한데, File &amp;gt; Settings &amp;gt; Editor &amp;gt; General 탭에서 맨 위에서 2번째 항목인 Change font size (Zoom) with Ctrl + Mouse Wheel 항목을 체크해주면 된다. 아래 사진을 참고하자.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 850px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9924FE3359D336FE2B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9924FE3359D336FE2B&quot; width=&quot;850&quot; height=&quot;665&quot; filename=&quot;Change Font size.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;매우 간단한 설정이지만, 이것 또한 찾는데 시간이 꽤나 걸렸다. 또한 대부분 영어로 설명이 된 자료여서 읽고 해석하는데도 시간이 걸렸다. 위 두 가지 설정이 내가 생각하는 가장 기본적이면서도 꼭 필요한 셋팅이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;마지막으로 한 가지만 더 설명하자면, 화면 분할하는 방법 또한 소개하고 싶다. 아래의 사진과 같이 상단 메뉴의 Window &amp;gt; Editor Tabs &amp;gt; Split Vertically 또는 Split Horizontally 를 클릭하면 된다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 547px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D2133359D338531B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D2133359D338531B&quot; width=&quot;547&quot; height=&quot;565&quot; filename=&quot;Split window.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;화면 분할을 하면 아래와 같이 여러 개의&amp;nbsp;.py 파일을 에디터에서 보며 작업할 수 있어 편리하다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 위 3가지 기본 설정만 하는데도 시간이 1시간 30분 정도는 걸린 것 같다. 이 글을 보는 사람들은 나처럼 시간을 낭비하지 않고 바로발로 셋팅할 수 있기를 바란다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 850px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9967E23359D338D635&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9967E23359D338D635&quot; width=&quot;850&quot; height=&quot;627&quot; filename=&quot;화면분할.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/Django</category>
      <category>Pycharm</category>
      <category>pycharm font size</category>
      <category>파이참</category>
      <category>파이참 font</category>
      <category>파이참 마우스 휠</category>
      <category>파이참 셋팅</category>
      <category>파이참 테마</category>
      <category>파이참 폰트 사이즈</category>
      <category>파이참 화면 분할</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/90</guid>
      <comments>https://mattlee.tistory.com/90#entry90comment</comments>
      <pubDate>Tue, 3 Oct 2017 16:15:14 +0900</pubDate>
    </item>
    <item>
      <title>cmd 오류: 기본 클래스 *을(를) 찾거나 로드할 수 없습니다. 에 대하여</title>
      <link>https://mattlee.tistory.com/89</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;자바를 cmd에서 컴파일 하고, 컴파일 한 .class 파일을 cmd에서 실행하려할 때 어김없이 등장하는 오류가 있는데,&amp;nbsp;&amp;nbsp;'기본 클래스 *를 찾거나 로드할 수 없습니다.' 라는 오류다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;나의 경우 보통 자바 파일을 관리할 때 패키지를 이용하여 관리한다. 패키지를 사용하다 보면 아래의 오류를 정말 많이 만날 수 있다. 해결법을 먼저 소개하자면, &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;b&gt;java 명령&lt;/b&gt;&lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;은 패키지의 parent 디렉토리에서 실행하되 실행할 .class 파일의 이름을 줄 때&lt;/span&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;패키지명&lt;/span&gt;.클래스파일명&lt;/b&gt; &lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;으로 입력해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;java 명령어의 인자로 클래스 이름을 전달할 경우, 패키지 이름을 포함한 full class name을 전달해야 한다. java 프로그램에서는 인자로 들어온 full class name을 기준으로 .class 파일들을 찾기 때문이다. 결국 .class 파일의 상위 디렉토리(parent 또는 root 디렉토리)에서 실행을 해야 한다는 뜻이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;/* &lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;나의 경우 실행할&lt;/span&gt;&lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;&amp;nbsp;IOEx.class파일의 parent 디렉토리가 &lt;b&gt;'자바의 정석\src'&lt;/b&gt; 였고, 이 위치에서 '&lt;b&gt;java&lt;/b&gt;&lt;/span&gt; &lt;b&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;streamEx&lt;/span&gt;.IOEx&lt;/b&gt; &lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;매개변수&lt;/span&gt;' &lt;span style=&quot;color: rgb(53, 53, 53);&quot;&gt;명령을 주어 성공적으로 실행을 시켰다. &lt;/span&gt;*/&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 850px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E3073359C8698E0A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E3073359C8698E0A&quot; width=&quot;850&quot; height=&quot;462&quot; filename=&quot;커맨드 오류.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;내가 만든 IOEx.class&amp;nbsp;파일은 매개변수로 준 소스파일(.java)의 내용을 &lt;b&gt;그대로 출력해주는 기능&lt;/b&gt;을 담고 있다. 따라서 제대로 실행이 된다면 매개변수로 넘겨준 IOEx.java 파일의 내용이 그대로 cmd창에 출력되어야 할 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;실행은 되었다는 건&amp;nbsp;맨 아래의 3줄을 보면 알 수 있지만&amp;nbsp;보다시피&lt;b&gt; 아무런 것도 출력되지 않는다.&lt;/b&gt;&amp;nbsp;IOEx 클래스 파일은 실행을 시켰지만 &lt;b&gt;매개변수 값을 잘못 준 탓&lt;/b&gt;이다. IOEx.class 파일의 역할은 매개변수로 주어진 IOEx.java 의 소스코드를 그대로 출력해주는 것인데 화면에 아무것도 없다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;아래와 같이 IOEx.java 파일의 &lt;b&gt;파일 경로를 현재 디렉토리를 기준으로 다시 설정&lt;/b&gt;해서 입력해서 결국 제대로 작동시켰다. cmd 창으로 java 실습을 할 때는 이처럼 패키지, 파일 경로 등을 특히 신경써야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;/* 기존의 IOEx.java 매개변수를 &lt;b&gt;streamEx\IOEx.java 로 경로를 추가해 다시 설정&lt;/b&gt;해주었다. &lt;b&gt;streamEX라는 패키지(폴더) 안에&lt;/b&gt; 이 파일이 있었으므로 이는 당연한 수순이었다. */&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 850px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99ECB93359C86CC809&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99ECB93359C86CC809&quot; width=&quot;850&quot; height=&quot;434&quot; filename=&quot;커맨드 오류 해결.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;cmd 창에서 작업을 할 일은 매우 드물겠지만, 매번 접하는 오류다 보니 한 번쯤 정리할 필요성을 느껴 이렇게 정리하게 되었다. 두번 다시 만나고 싶지 않은 오류 중 하나다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Develop Story/JAVA</category>
      <category>class path</category>
      <category>java cmd error</category>
      <category>기본 클래스를 찾거나 로드할 수 없습니다.</category>
      <category>자바 커맨드 에러</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/89</guid>
      <comments>https://mattlee.tistory.com/89#entry89comment</comments>
      <pubDate>Mon, 25 Sep 2017 11:50:06 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;네트워크 주소의 표현&amp;gt;</title>
      <link>https://mattlee.tistory.com/88</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39); font-size: 11pt;&quot;&gt;/* 본 포스팅은 한빛미디어의 '쉽게 배우는 데이터 통신과 컴퓨터 네트워크 | 박기현 저'를 참고하여 작성되었음을 미리 알려드립니다. */&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(47, 157, 39); font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(47, 157, 39); font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;시스템을 설계할 때는 &lt;b&gt;기능이나 목적과 함께 구분자(Identifier)를 부여하는 방법을 가장 먼저 고려&lt;/b&gt;해야 한다. 디지털화된 컴퓨터에서는 구분자를 숫자로 된 주소로 표현할 수밖에 없다. 그러나 이런 주소 표현 방식은 일반 사용자에게 불편하므로 보통 외우기 쉬운 기호 형식의 이름을 추가로 부여한다. &lt;b&gt;주소와 이름은 일대일 관계&lt;/b&gt;가 이루어지며, &lt;b&gt;이들을 연결하는 기능이 필요&lt;/b&gt;하다. 대상을 유일하게 구별하는 구분자는 일반적으로 아래 네 가지 특징이 있다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;유일성: &lt;/b&gt;구분자의 가장 중요한 역할은 대상 시스템을 서로 구분하여 지칭하는 것이다. 따라서 서로 다른 시스템이 같은 구분자를 갖지 않는 유일성을 보장해야 한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 유일성이 보장되지 않는다면 구분자라 부를 수 조차 없는 것이다. 구분할 수가 없으니까.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;확장성: &lt;/b&gt;시스템은 활용의 보편화가 진행되면서 자연스럽게 확장 과정을 거친다. 따라서 사용하는 구분자의 양도 증가한다. 시스템의 최대 수용 규모를 예측하여 구분자의 최대 한계를 올바르게 설정하지 않으면, 표현할 수 있는 공간의 크기가 제한되어 시스템의 확장성도 제한된다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;/* 실제로 IP 주소는 원래 32비트의 이진 숫자로 구성되어 있었는데, 인터넷 사용자가 급격히 많아짐에 따라 주소 표현 공간을&amp;nbsp;128비트로 확장했다. */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;편리성:&lt;/b&gt; 일반적으로 시스템의 설계 과정에서 부여되는 구분자는 시스템의 내부 처리 구조를 효율적으로 운용할 수 있도록 해준다. 컴퓨터 시스템은 내부적으로 숫자 기반으로 처리되기 때문에 구분자의 체계도 숫자 위주다. 또 배치, 검색 등을 원활하게 수행하기 위해 보통 일반인이 의미를 이해할 수 없는 형식이다.&lt;br /&gt;&amp;nbsp;이처럼 시스템 내부 동작에 종속된 구분자 주소 체계는 사용자가 의미를 파악하기 어렵기 때문에 기호로 된 이름을 추가로 부여해야 한다. 따라서 하나의 시스템이 숫자로 된 주소와 문자로 된 이름을 모두 가지므로 이를 매핑(Mapping)하는 기능이 필요하다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 110101010010111010 과 같이 되어 있는 데이터는 확실하게 사람이 해석하기 난해한 구조로 되어 있다. 따라서 이름을 추가로 부여하는 것이고, 후에는 이 이름과 본래 담겨 있는 수를 매칭, 매핑 해주는 작업이 필요한 것이다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;정보의 함축:&lt;/b&gt; 구분자는 응용 환경에 필요한 다양한 정보를 포함하는 경우가 많다. 예를 들어, 주민번호에는 생년월일, 성별 구분 등의 의미가 부여되어 있다. 집주소도 광역시부터 시작해 지역을 소규모로 분할하는 구조를 가져 위치를 쉽게 가늠할 수 있다. 이처럼 구분자는 응용 환경에 적절히 대응할 수 있는 정보를 포함해야 한다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 주소와 이름&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;시스템을 지칭하는 구분자는 &lt;b&gt;내부적으로 처리, 관리되는 숫자 기반의 주소(Address)&lt;/b&gt;와 사용자의 이해와 편리성을 도모하는 &lt;b&gt;기호로 된 이름(Name)을 함께 제공&lt;/b&gt;해야 한다. 일반 사용자는 내부 주소를 몰라도 &lt;b&gt;이름만으로 시스템에 접근할 수 있어야 하며&lt;/b&gt;, 이름과 주소를 연결하는 방법은 &lt;b&gt;내부적으로 처리&lt;/b&gt;되어야 한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 우리가 1101010101010 과 같은 이진주소를 다 알아서 사용할 필요가 없다는 뜻이다. 애초에 그렇게 시스템을 설계하면 이는 편리성의 원칙을 완전히 무시한 꼴이 된다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;네트워크 규모가 작아 관리하는 시스템이 작으면 간단한 형식의 주소와 이름을 사용할 수 있다. 따라서 주소와 이름을 관리하는 시스템도 그리 복잡하지 않다. 그러나 관리 대상이 많아지면 주소와 이름 공간도 커지고, 이를 관리하는 시스템의 기능도 복잡해진다.&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt; // 그렇기에 설계할 때 더욱 주의를 기울여야 한다. 유일성의 원칙이 깨지지 않으면서 확장성과 편리성의 극대화를 이루는 설계를 지향하자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;네트워크에는 &lt;b&gt;여러 종류의 주소와 이름이 존재&lt;/b&gt;한다. 각 계층의 기능을 담당하는 &lt;b&gt;프로토콜마다 주소를 별도로 관리&lt;/b&gt;하기 때문이다. 예를 들어, IP 프로토콜은 호스트를 구분하기 위하여 IP 주소를 사용하며, 데이터 링크 계층에서는 LAN 카드별로 MAC 주소를 따로 부여한다. 전송 계층을 수행하는 TCP에서는 호스트에서 수행되는 네트워크 프로세스마다 별도의 포트(Port)주소를 할당하고 관리한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# IP 주소&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&amp;nbsp;IP 주소(IP Address)&lt;/b&gt;는 네트워크 계층의 기능을 수행하는 IP 프로토콜이 호스트를 구분하려고 사용하는 주소 체계다. 임의의 호스트를 &lt;b&gt;인터넷에 연결하려면 반드시 IP 주소를 할당&lt;/b&gt;받아야 한다. IP 주소는 32비트 이진 숫자로 구성되는데, 보통 8비트씩 네 부분으로 나누어 십진수로 표현한다. // 11010011&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;(211)&lt;/span&gt; 11011111&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;(223)&lt;/span&gt;&amp;nbsp;11001001&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;(201)&lt;/span&gt;&amp;nbsp;00011110&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;(30)&lt;/span&gt; -&amp;gt;&lt;b&gt; 211.223.201.30&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;IP 주소는 유일성을 보장하기 위해 &lt;b&gt;국제 표준화 기구에서 전체 주소를 관리하고 할당&lt;/b&gt;해 중복 주소의 사용을 원천적으로 차단한다. IP 프로토콜이 처음 개발될 당시에는 현재처럼 폭넓게 활용되리라 예측하지 못했다. &lt;b&gt;따라서 IP 주소로 표현할 수 있는 최대 주소 공간의 크기를 32비트로 제한&lt;/b&gt;함으로써 확장성에 많은 문제점이 야기되고 있다. 이를 &lt;b&gt;해결하려고 새로운 프로토콜 IPv6(Internet Protocol Version 6)&lt;/b&gt;에서는&lt;b&gt; 주소 표현 공간을 128비트로 확장&lt;/b&gt;했다. 그리고 현재의 IP 프로토콜은 IPv6과 구분하기 위해 IPv4로 표현한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;IP 주소&lt;/b&gt;는 임의로 할당되는 것이 아니라 &lt;b&gt;어떤 규칙에 따라 인접한 숫자를 그룹으로 묶어 관리&lt;/b&gt;한다. 따라서 &lt;b&gt;경로 선택 시 IP 주소를 중요한 기준으로 활용&lt;/b&gt;할 수 있다. IP 주소를 보고 &lt;b&gt;라우터는 어디로 패킷(데이터)을 보내야 하는지 경로를 설정&lt;/b&gt;할 수 있다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 예를 들어 211.223.201.0 ~ 211.223.201.30 은 전산실에서 사용한다 등 네트워크를 관리하는 학교별 단체별 자기들끼리 정한 규칙이 있을 것이다. 이러한 정보를 이용하면 인접한 곳에 데이터를 보낼 때 어떤 경로를 이용하는 것이 효율적인지 등의 판단을 내리기 훨씬 수월하다는 의미다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 호스트 이름&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;인터넷에서 &lt;b&gt;특정 호스트와 연결하려면 반드시 호스트의 IP 주소를 알아야 한다. &lt;/b&gt;그런데 숫자로 된 IP 주소는 기억하기 힘들어 보통 의미 파악이 쉬운 &lt;b&gt;문자로 된 호스트 이름을 사용&lt;/b&gt;한다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;아래 그림은 일반 사용자가 문자로 된 호스트 이름을 사용하였을 때 IP 주소로 변환되는 과정을 보여준다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 580px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9934583359C4589B1D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9934583359C4589B1D&quot; width=&quot;580&quot; height=&quot;406&quot; filename=&quot;호스트 이름과 IP 주소의 변환.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 맨 밑에 있는 네트워크 계층의 IP 프로토콜에서는 호스트를 구분하려고 IP 주소만 사용한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 컴퓨터에게 필요한 건 문자가 아니라 오로지 숫자이기 때문에.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;그에 비해 일반 사용자는 IP 주소 대신 문자로 된 호스트 이름을 사용하기 때문에 중간 계층에서 이를 변환하는 기능을 수행해야 한다. 일반적으로 FTP, 텔넷 같은 네트워크 응용 프로그램은 실행시 사용자에게 호스트 이름을 명령어 인수로 입력받는다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 따라서 가장 먼저 수행해야 할 작업은 이름과 주소 변환 기능인 &lt;b&gt;DNS(Domain Name System)&lt;/b&gt;를 이용하여 IP 주소를 얻는 것이다. DNS에서는 호스트 이름을 국가 도메인, 단체 종류, 단체 이름, 호스트라는 네 계층 구조로 나누고, 이들을 점(.)으로 구분해 표기한다. 예를 들어, &lt;b&gt;reddevil.koteam.co.kr&lt;/b&gt;과 같은 호스트 이름은 대한민국(kr)에 있는 일반 회사(co) 중에서 koteam라는 회사에 소속된 reddevil라는 호스트다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&amp;lt;호스트&amp;gt; . &amp;lt;단체 이름&amp;gt; . &amp;lt;단체 종류&amp;gt; . &amp;lt;국가 도메인&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none; margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;국가 도메인은 호스트가 위치한 국가의 이름을 두 글자의 약자로 표시한다. 한국은 kr, 일본은 jp로 나라마다 고유한 국가 도메인이 존재한다. 단체 종류는 해당 단체의 성격에 따라 부여된다. &lt;b&gt;co(company)&lt;/b&gt;는 회사, &lt;b&gt;ac(academy)&lt;/b&gt;는 교육 기관, &lt;b&gt;go(government)&lt;/b&gt;는 정부 소속 기관이다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;단체 이름은 단체를 상징하는 이름을 사용한다. 회사의 경우는 회사명을, 학교의 경우는 학교 이름을 사용한다. 마지막으로 호스트는 소속 단체의 네트워크 관리자가 내부 규칙에 따라 부여한 이름을 사용한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 내부 규칙을 따랐다는 말은 그 단체 안에서의 룰을 적용시켰다는 의미일 뿐이다. 회사나 단체에서 어떤 의사결정을 함에 있어 아무 생각도 없이 호스트 이름을 만들지는 않을 것이니 각 회사별 단체별 규칙을 따랐다는 것을 서술한 것이다.&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/Network</category>
      <category>dns</category>
      <category>Domain Name System</category>
      <category>IP 주소</category>
      <category>네트워크 주소</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/88</guid>
      <comments>https://mattlee.tistory.com/88#entry88comment</comments>
      <pubDate>Fri, 22 Sep 2017 09:37:45 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;인터네트워킹(Internetworking)과 프로토콜(Protocol)&amp;gt;</title>
      <link>https://mattlee.tistory.com/87</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39); font-size: 11pt;&quot;&gt;/* 본 포스팅은 한빛미디어의 '쉽게 배우는 데이터 통신과 컴퓨터 네트워크 | 박기현 저'를 참고하여 작성되었음을 미리 알려드립니다. */&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;네트워크와 네트워크의 연결을 &lt;b&gt;인터네트워킹(Internetworking)&lt;/b&gt;이라 한다. 연결하는 네트워크 수가 증가할수록 복잡도가 커진다. 인터넷은 IP 프로토콜을 지원하는 전 세계의 모든 네트워크가 연결된 시스템을 의미하며, &lt;b&gt;라우터&lt;/b&gt;라는 중개장비를 사용해 네트워크를 연결한다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;# 네트워크의 연결&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;서로 독립적으로 운영되는 두 네트워크가 연동되어 정보를 교환하려면, &lt;b&gt;이를 적절히 연결하여 데이터를 중개할 수 있는 인터네트워킹 시스템이 필요&lt;/b&gt;하다. 여기서 네트워크가 연동한다는 의미는 물리적인 연결뿐만 아니라, 데이터 중개에 필요한 상위 통신 프로토콜을 모두 지원함을 뜻한다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;인터네트워킹 시스템에 의해 연결된 두 네트워크는 물리적으로 같은 종류일 필요는 없다. 상위 계층 프로토콜이 지원하는 논리적 기능이 달라도 된다. 하지만 &lt;b&gt;인터네트워킹 시스템은 &lt;/b&gt;양쪽 네트워크에 대한&lt;b&gt; 서로 다른 물리적, 기능적 인터페이스를 모두 지원해야 &lt;/b&gt;한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 그렇지 않으면 물리적, 기능적 인터페이스가 모두 같아야 한다는 말인데, &lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;매우 비효율적이라는 걸 금방 알 수 있을 것이&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;또한 이 과정에서 데이터 표현 방식을 포함해 &lt;b&gt;프로토콜이 다르면 필요한 변환 작업을 수행&lt;/b&gt;해야 한다. 이렇게 인터네트워킹 시스템은 둘 이상의 네트워크를 유기적으로 연동할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 프로토콜&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;프로토콜(Protocol)은 &lt;b&gt;통신 시스템이 데이터를 교환하기 위해 사용하는 통신 규칙&lt;/b&gt;이다. OSI 7 계층 모델에서는 각 계층에서 수행되는 프로토콜이 서로 독립적이라고 간주한다. 따라서 계층 1에는 계층 1끼리 통신할 수 있는 프로토콜이 존재하고, 계층 2에는 계층 2 끼리 통신할 수 있는 프로토콜이 존재한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;/*&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;우리가 스마트폰으로 상대방과 전화를 할 때에도 프로토콜이 존재한다. 스마트폰은 단지 미리 주어진 규칙대로 자신의 일을 묵묵히 수행하는 것 뿐이다. 서로 규칙이 다르면 원활한 통화는 절대 이루어질 수 없다. */&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;/* 예를 들어, 분명 나는 전화벨이 울리고 통화 버튼을 눌러서 통화를 하는 것으로 알고 있었는데 상대방의 스마트폰은 내 그런 절차를 모르고 바로 통화를 할 수 있는 것으로 인지하여 통화가 진행된다고 해보자. 상대방이 듣지도 않는데 말을 하는 현상 등이 생길 것이다. 당장은 이해가 안될 수 있지만 상호 협의된 규칙이라고 일단은 생각해두는 것이 낫겠다. */&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* 더군다나 상호 협약된 규칙이 없다면 그때 그때마다 규칙을 새롭게 생성하고 정해야 하는데, 전세계적으로 스마트폰 기종만 100개가 넘는데 일일이 다 적용시킨다고 생각해 보면, 엄청난 비용과 비효율성이 발생할 것임이 자명하다. */&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 게이트웨이&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;인터네트워킹 기능을 수행하는 시스템을 일반적으로 &lt;b&gt;게이트웨이(Gateway)&lt;/b&gt;라 부른다. 게이트웨이는 기능에 따라 종류가 다양하지만 &lt;b&gt;리피터, 브리지, 라우터 &lt;/b&gt;등이 가장 일반적인 구분이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 리피터&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;리피터(Repeater)는 물리 계층의 기능을 지원&lt;/b&gt;한다. 물리적 신호는 전송 거리가 멀면 감쇄되기 때문에 중간에 이를 보완해 주어야 한다. 리피터는 한쪽에서 입력된 신호를 물리적으로 단순히 증폭하여 다른 쪽으로 중개하는 역할을 한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 소리를 지르면 가까이에선 크게 들리지만 멀면 멀수록 작게들리는 것과 같이 물리적 신호는 거리가 멀수록 점점 감쇄한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 브리지&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;브리지(Bridge)는 &lt;b&gt;리피터 기능에 데이터 링크 계층의 기능이 추가된 게이트웨이&lt;/b&gt;이다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 데이터 링크 계층은 물리 계층으로 데이터를 전송하는 과정에서 발생하는 잡음(Noise)과 같은 물리적 오류를 감지(Sense)하는 기능을 제공하여 송수신 호스트가 오류를 인지할 수 있게 해준다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 라우터&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;라우터(Router)는 물리 계층, 데이터 링크 계층, 네트워크 계층의 기능을 지원한다. 네트워크 계층은 경로 선택 기능을 제공해야 하므로 임의의 네트워크에서 들어온 데이터를 어느 네트워크로 전달할지 판단할 수 있어야 한다. 이를 지원하기 위하여 라우터는 자신과 &lt;b&gt;연결된 네트워크와 호스트 정보를 유지하고 관리&lt;/b&gt;함으로써, 어떤 경로를 이용할 수 있고, 또 어떤 경로를 이용해야 빠르게 전송할 수 있는지를 판단한다. 이런 판단을 위한 정보는 일반적으로 &lt;b&gt;라우팅 테이블(Routing Table)에 보관&lt;/b&gt;한다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 데이터 단위&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 네트워크 프로토콜을 사용해 데이터를 교환할 때는 먼저 &lt;b&gt;데이터를 특정 형태로 규격화하는 작업&lt;/b&gt;이 필요하다. 예를 들어, 우편물을 보낼 때 정해진 규격 봉투를 사용하는 것과 같다. 규격 봉투에 보내는 사람, 받는 사람, 우표 등의 규칙에 따라 정보를 기입하는 것처럼, 네트워크에서도 데이터를 프로토콜에 맞춰 묶어준다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;OSI 7 계층 모델의 각 계층에서 규격화된 데이터는 다음과 같이 고유 명칭이 있다. 계층에 상관없이 사용할 때는 통칭하여 &lt;b&gt;PDU(Protocol Data Uniit)라고 부른다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;APDU(Application Protocol Data Unit): &lt;/b&gt;응용 계층에서 사용하는 데이터의 단위&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;PPDU(Presentation Protocol Data Unit): &lt;/b&gt;표현 계층에서 사용하는 데이터의 단위&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;SPDU(Session Protocol Data Unit): &lt;/b&gt;세션 계층에서 사용하는 데이터의 단위&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;TPDU(Transport Protocol Data Unit):&lt;/b&gt; 전송 계층에서 사용하는 데이터의 단위. 인터넷에서 사용하는 전송 계층 프로토콜인 &lt;b&gt;TCP에서는 세그먼트(Segment)&lt;/b&gt;라고 부르고,&lt;b&gt; UDP에서는 데이터그램(Datagram)&lt;/b&gt;이라고 부른다. 데이터그램은 일반적인 의미로도 자주 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;NPDU(Network Protocol Data Unit): &lt;/b&gt;네트워크 계층에서 사용하는 데이터의 단위, &lt;b&gt;보통 패킷(Packet)&lt;/b&gt;이라고 부른다. 패킷은 원래 네트워크 계층의 IP 프로토콜에서 유래되었지만 요즘은 일반 용어로 많이 사용한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;DPDU(Data Link Protocol Data Unit): &lt;/b&gt;데이터 링크 계층에서 사용하는 데이터의 단위, 보통&lt;b&gt; 프레임(Frame)&lt;/b&gt;이라고 부른다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/Network</category>
      <category>APDU</category>
      <category>DPDU</category>
      <category>IP</category>
      <category>NPDU</category>
      <category>PPDU</category>
      <category>SPDU</category>
      <category>TCP</category>
      <category>TPDU</category>
      <category>네트워크</category>
      <category>데이터</category>
      <category>데이터 단위</category>
      <category>라우터</category>
      <category>리피터</category>
      <category>브리지</category>
      <category>패킷</category>
      <category>프로토콜</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/87</guid>
      <comments>https://mattlee.tistory.com/87#entry87comment</comments>
      <pubDate>Wed, 20 Sep 2017 19:31:57 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;스트림(Stream)&amp;gt;</title>
      <link>https://mattlee.tistory.com/86</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 스트림&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;스트림(Stream)&lt;/b&gt;이라는 영단어는 흐르는 시냇물을 뜻한다. 종이배를 시냇물에 올려 두면 떠내려가듯, 컴퓨터 공학에서 스트림은 데이터라는 종이배를 띄울 수 있는 시냇물이다. 즉, 데이터의 흐름을 의미한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;입력 스트림&lt;/b&gt;은 키보드, 마우스, 네트워크 등과 같은 &lt;b&gt;입력 장치로부터 입력된 데이터가 순서대로 프로그램으로 흘러가는 데이터의 흐름 혹은 소프트웨어 장치&lt;/b&gt;를 말하고, &lt;b&gt;출력 스트림&lt;/b&gt;은 &lt;b&gt;프로그램에서 출력된 데이터가&lt;/b&gt; 프린터, 콘솔, LCD, 네트워크 등과 같은 &lt;b&gt;출력 장치로 순서대로 전송되도록 보장하는 데이터의 흐름 혹은 소프트웨어 장치&lt;/b&gt;를 말한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;입력 스트림은 데이터가 &lt;b&gt;입력 장치에서 프로그램으로 들어가는 방향&lt;/b&gt;이며, &lt;b&gt;프로그램에서 출력 장치로 데이터가 이동하는 방향&lt;/b&gt;이 출력 스트림의 방향이다. 입력 스트림의 경우 먼저 들어온 데이터가 먼저 프로그램에게 전달되는 &lt;b&gt;FIFO&lt;/b&gt;(Frist In First Out) 구조이고, 출력 스트림의 경우 프로그램에서 출력되어진 순서대로 출력된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;/*&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;프로그램에서 출력된다는 뜻은 데이터의 전송, 흐름을 뜻한다. 예를 들어 사용자가 한글이나 워드 프로그램에서 인쇄를 눌렀다면, 그 데이터가 입력스트림으로 PC 본체에 흘러 들어가고 본체에 들어온 데이터는 다시 출력 스트림을 통해 연결된 프린터기로 가는 구조라고 생각하면 된다. 결국 출력도 데이터의 흐름이라고 생각하면 된다. */&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;스트림을 통해 흘러가는 &lt;b&gt;데이터의 기본 단위는 바이트&lt;/b&gt;다. 프로그램은 입력 스트림으로부터 받은 바이트들을 문자로 해석하거나, 4바이트씩 끊어 정수(Integer)로 인식하는 등 &lt;b&gt;다양하게 해석&lt;/b&gt;할 수 있다. 이는 전적으로 프로그램을 제작하는 프로그래머에게 달려있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;컴퓨터의 입출력 시스템은&amp;nbsp;서로 유기적으로 연결될 수도 있다. 아래의 코드를 예로 살펴보자.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;InputStreamReader rd = new InputStreamReader(System.in);&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;이 프로그램 코드는 표준 입력 스트림을 발생시키는 장치인 &lt;b&gt;System.in에 의해 리턴되는 스트림 데이터를 문자 스트림으로 변환&lt;/b&gt;하는 &lt;b&gt;InputStreamReader&lt;/b&gt;에 연결시킨다. &lt;b&gt;InputStreamReader&lt;/b&gt;를 통해 데이터를 읽으면 입력된 순서로 &lt;b&gt;문자 값으로 해석&lt;/b&gt;하여 읽을 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;예를 들어보자. 사용자가 키보드로 'b', '!' 키를 입력하면, 표준 입력 스트림 &lt;b&gt;System.in&lt;/b&gt;은 단순히 'b'와 '!'키의 바이트 정보를 보낸다. 바이트 스트림이&lt;b&gt; InputStreamReader를 통과&lt;/b&gt;하면서&lt;b&gt; InputStreamReader는 이들 바이트 정보를 문자로 인식&lt;/b&gt;하여 'b', '!'의 문자로 응용프로그램에게 전달해준다.&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt; // 데이터를 문자로서 해석하기 위해 InputStreamReader를 거쳤다고 생각하면 된다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;결국&amp;nbsp;연결된 스트림을 통해 표준 입력 스트림의 데이터가 문자 스트림으로 변환된다. 스트림은 데이터 처리를 위하여 몇 개라도 연결이 가능하다. 아래는 스트림의 몇 가지 특징을 적어 놓았다.&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;스트림은 지연될 수 있다: 입력 스트림의 데이터가 흘러가는 통로가 비어 있다면, 프로그램은 읽어갈 데이터가 없으므로 스트림에 데이터가 도착할 때까지 기다린다. 반대로 출력 스트림의 데이터가 흐르는 통로에 데이터가 꽉 차 있다면 프로그램은 더 이상 출력할 수 없기에 빈 공간이 생길 때까지 기다린다. 이처럼 입출력 시스템은 지연될 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;스트림은 바이트 스트림과 문자 스트림으로 나눌 수 있다: 자바에서 스트림의 종류에는 바이트 스트림과 문자 스트림이 있다. 프로그램은 필요에 따라 이들 중 하나를 선택하여 사용하면 된다.&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;자바에서는 응용프로그램이 입출력 스트림을 생성하여 입출력을 수행할 수 있도록 입출력 스트림을 위한 클래스를 제공한다. 아래는 텍스트로 이루어진 스트림 클래스 계층 구조이다.&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt; // 출처:&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/package-tree.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;https://docs.oracle.com/javase/7/docs/api/java/io/package-tree.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;h2 title=&quot;Class Hierarchy&quot; style=&quot;color: rgb(53, 56, 51); font-family: Arial, Helvetica, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Class Hierarchy&lt;/span&gt;&lt;/h2&gt;&lt;ul style=&quot;color: rgb(53, 56, 51); font-family: Arial, Helvetica, sans-serif; font-size: 12.16px;&quot;&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.lang.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html&quot; title=&quot;class in java.lang&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;Object&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Console.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;Console&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Flushable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Flushable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/File.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;File&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.lang.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html&quot; title=&quot;interface in java.lang&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Comparable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;lt;T&amp;gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Serializable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FileDescriptor.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FileDescriptor&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;InputStream&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Closeable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;ByteArrayInputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FileInputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FilterInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FilterInputStream&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;BufferedInputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/DataInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;DataInputStream&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;DataInput&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/LineNumberInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;LineNumberInputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/PushbackInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;PushbackInputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;ObjectInputStream&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInput.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;ObjectInput&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectStreamConstants.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;ObjectStreamConstants&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/PipedInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;PipedInputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/SequenceInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;SequenceInputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/StringBufferInputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;StringBufferInputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.GetField.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;ObjectInputStream.GetField&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.PutField.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;ObjectOutputStream.PutField&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectStreamClass.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;ObjectStreamClass&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Serializable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectStreamField.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;ObjectStreamField&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.lang.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html&quot; title=&quot;interface in java.lang&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Comparable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;lt;T&amp;gt;)&lt;/span&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/OutputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;OutputStream&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Closeable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Flushable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Flushable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayOutputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;ByteArrayOutputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FileOutputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FilterOutputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FilterOutputStream&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/BufferedOutputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;BufferedOutputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;DataOutputStream&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/DataOutput.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;DataOutput&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;PrintStream&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.lang.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html&quot; title=&quot;interface in java.lang&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Appendable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Closeable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;ObjectOutputStream&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutput.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;ObjectOutput&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectStreamConstants.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;ObjectStreamConstants&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/PipedOutputStream.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;PipedOutputStream&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.security.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/security/Permission.html&quot; title=&quot;class in java.security&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;Permission&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.security.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/security/Guard.html&quot; title=&quot;interface in java.security&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Guard&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Serializable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.security.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/security/BasicPermission.html&quot; title=&quot;class in java.security&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;BasicPermission&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Serializable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/SerializablePermission.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;SerializablePermission&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FilePermission.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FilePermission&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Serializable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;RandomAccessFile&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Closeable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;DataInput&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/DataOutput.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;DataOutput&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Reader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;Reader&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Closeable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.lang.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/Readable.html&quot; title=&quot;interface in java.lang&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Readable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;BufferedReader&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/LineNumberReader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;LineNumberReader&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/CharArrayReader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;CharArrayReader&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FilterReader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FilterReader&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/PushbackReader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;PushbackReader&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/InputStreamReader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;InputStreamReader&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FileReader&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/PipedReader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;PipedReader&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/StringReader.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;StringReader&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;StreamTokenizer&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.lang.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html&quot; title=&quot;class in java.lang&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;Throwable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Serializable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.lang.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/Error.html&quot; title=&quot;class in java.lang&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;Error&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/IOError.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;IOError&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.lang.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html&quot; title=&quot;class in java.lang&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;Exception&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/IOException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;IOException&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/CharConversionException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;CharConversionException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/EOFException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;EOFException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FileNotFoundException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FileNotFoundException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;InterruptedIOException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/ObjectStreamException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;ObjectStreamException&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/InvalidClassException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;InvalidClassException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/InvalidObjectException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;InvalidObjectException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/NotActiveException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;NotActiveException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/NotSerializableException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;NotSerializableException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/OptionalDataException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;OptionalDataException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/StreamCorruptedException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;StreamCorruptedException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/WriteAbortedException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;WriteAbortedException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/SyncFailedException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;SyncFailedException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/UnsupportedEncodingException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;UnsupportedEncodingException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/UTFDataFormatException.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;UTFDataFormatException&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Writer.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;Writer&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;(implements java.lang.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html&quot; title=&quot;interface in java.lang&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Appendable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Closeable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;, java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/Flushable.html&quot; title=&quot;interface in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Flushable&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;)&lt;/span&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;BufferedWriter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/CharArrayWriter.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;CharArrayWriter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FilterWriter.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FilterWriter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/OutputStreamWriter.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;OutputStreamWriter&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/FileWriter.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;FileWriter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/PipedWriter.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;PipedWriter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;PrintWriter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li type=&quot;circle&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;java.io.&lt;/span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/7/docs/api/java/io/StringWriter.html&quot; title=&quot;class in java.io&quot; style=&quot;color: rgb(76, 107, 135);&quot;&gt;&lt;span class=&quot;strong&quot; style=&quot;font-weight: bold; font-size: 11pt;&quot;&gt;StringWriter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/JAVA</category>
      <category>InputStream</category>
      <category>java stream</category>
      <category>OutputStream</category>
      <category>Stream</category>
      <category>스트림 개념</category>
      <category>입력 스트림</category>
      <category>자바 스트림</category>
      <category>출력 스트림</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/86</guid>
      <comments>https://mattlee.tistory.com/86#entry86comment</comments>
      <pubDate>Mon, 18 Sep 2017 01:03:30 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;OSI 7계층 모델의 계층별 기능&amp;gt;</title>
      <link>https://mattlee.tistory.com/85</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* 본 포스팅은 한빛미디어의 '쉽게 배우는 데이터 통신과 컴퓨터 네트워크 | 박기현 저'를 참고하여 작성되었음을 미리 알려드립니다. */&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 물리 계층 1 Physical Layer&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;네트워크에서 호스트가 데이터를 전송하려면 반드시 전송 매체로 연결되어 있어야 한다. 물리 계층(Physical Layer)은 호스트를 전송 매체와 연결하기 위한 인터페이스 규칙과 전송 매체의 특성을 다룬다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 데이터 링크 계층 2 Data Link Layer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;물리 계층으로 데이터를 전송하는 과정에서는 &lt;b&gt;잡음(Noise) 같은 여러 외부 요인에 의해 물리적 오류가 발생&lt;/b&gt;할 수 있다. &lt;b&gt;데이터 링크 계층(Data Link Layer)은 물리적 전송 오류를 감지(Sense)하는 기능을 제공&lt;/b&gt;해 송수신 호스트가 오류를 인지할 수 있게 해준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;발생 가능한 물리적 오류의 종류에는 &lt;b&gt;데이터가 도착하지 못하는 데이터 분실&lt;/b&gt;과 &lt;b&gt;내용이 깨져서 도착하는 데이터 변형&lt;/b&gt;이 있다. 일반적으로 컴퓨터 네트워크에서의 &lt;b&gt;오류 제어(Error Control)&lt;/b&gt;는 &lt;b&gt;송신자가 원 데이터를 재전송(Retransmission)하는 방법으로 처리&lt;/b&gt;한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 네트워크 계층 3 Network Layer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;송신 호스트가 전송한 데이터가 수신 호스트까지 도착하려면 &lt;b&gt;여러 중개 시스템을 거친다.&lt;/b&gt; 이 과정에서 데이터가 &lt;b&gt;올바른 경로를 선택할 수 있도록 지원&lt;/b&gt;하는 계층이&lt;b&gt; 네트워크 계층(Network Layer)&lt;/b&gt;이다. 중개 시스템의 기능은 일반적으로 &lt;b&gt;라우터(Router) 장비가 수행&lt;/b&gt;한다. 네트워크 부하가 증가하면 특정 지역에&lt;b&gt; 혼잡(Congestion)이 발생&lt;/b&gt;할 수 있는데, 이것도 데이터의 전송 경로와 관계가 있으므로 &lt;b&gt;네트워크 계층이 제어&lt;/b&gt;한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 전송 계층 4 Transport Layer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;컴퓨터 네트워크에서 &lt;b&gt;데이터를 교환하는 최종 주체&lt;/b&gt;는 호스트 시스템이 아니고, &lt;b&gt;호스트에서 실행되는 프로세스&lt;/b&gt;다. &lt;b&gt;전송 계층(Transport Layer)&lt;/b&gt;은 송신 프로세스와 수신 프로세스간의 &lt;b&gt;연결(Connection) 기능을 제공&lt;/b&gt;하기 때문에 프로세스 사이의 &lt;b&gt;안전한 데이터 전송을 지원&lt;/b&gt;한다. &lt;b&gt;계층 4까지의 기능은 운영체제에서 시스템 콜(System Call) 형태로 상위 계층에 제공&lt;/b&gt;하며, &lt;b&gt;계층 5~7의 기능은 사용자 프로그램으로 작성&lt;/b&gt;된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 세션 계층 5 Session Layer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;세션 계층(Session Layer)&lt;/b&gt;은 전송 계층의 연결과 유사한 세션 연결을 지원하지만 이보다 더 &lt;b&gt;상위의 논리적 연결&lt;/b&gt;이다. 즉, &lt;b&gt;응용 환경에서의 사용자 간의 대화(Dialog) 개념의 연결&lt;/b&gt;로 사용되기 때문에 &lt;b&gt;전송 계층의 연결과는 구분&lt;/b&gt;된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 표현 계층 6 Presentation Layer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;표현 계층(Presentation Layer)&lt;/b&gt;은 전송되는 &lt;b&gt;데이터의 의미(Semantic)&lt;/b&gt;를 잃지 않도록 &lt;b&gt;올바르게 표현하는 방법(Syntax)&lt;/b&gt;을 다룬다. 정보를 교환하는 시스템이 &lt;b&gt;표준화된 방법으로 데이터를 인식할 수 있도록 해주는 역할&lt;/b&gt;을 한다. 표현 계층의 주요 기능은 &lt;b&gt;압축과 암호화&lt;/b&gt;다. 동영상과 같은 대용량의 멀티미디어&lt;b&gt; 데이터를 압축(Compression)&lt;/b&gt;해 전송 데이터의 양을 줄일 수 있다. &lt;b&gt;암호화&lt;/b&gt;는 외부의 침입자로부터 데이터를 안전하게 보호하는 기능인데, 전자상거래가 증가하면서 중요성이 커지고 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 응용 계층 7 Application Layer&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;응용 계층(Application Layer)&lt;/b&gt;은 &lt;b&gt;사용자의 다양한 네트워크 응용 환경을 지원&lt;/b&gt;한다. 기능은 한 분야에 한정되지 않고 매우 광범위하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* 일반 사용자는 OSI 7 계층 맨 위에 있는 응용 계층을 통해 데이터의 송수신을 요청하며, 이 요청은 하위 계층으로 순차적으로 전달되어 맨 아래에 있는 물리 계층을 통해 상대 호스트에 전송된다. 그리고 요청이 각 계층으로 하달되는 과정에서 계층 별로 담당하는 기능을 수행해 데이터를 안전하게 전달한다. (7레벨 부터 1레벨까지 순차적으로 진행) */&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* 데이터를 수신한 호스트에서는 송신 호스트와 반대 과정으로 처리한다. 즉 물리 계층으로 들어온 데이터는 순차적인 상향 전달 과정 (1레벨 물리 계층부터 7레벨 응용 계층까지)을 거쳐 응용 계층으로 올라간다. 그리고 처리가 완료된 결과를 회신할 때는 반대 과정을 순차적으로 밟아 송신 호스트로 되돌아간다. */&lt;/span&gt;&lt;/p&gt;</description>
      <category>Develop Story/Network</category>
      <category>OSI 7계층</category>
      <category>OSI 모델</category>
      <category>네트워크 7계층</category>
      <category>네트워크 모델</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/85</guid>
      <comments>https://mattlee.tistory.com/85#entry85comment</comments>
      <pubDate>Wed, 13 Sep 2017 17:06:10 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;시스템 기초 용어&amp;gt;</title>
      <link>https://mattlee.tistory.com/84</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* 본 포스팅은 한빛미디어의 '쉽게 배우는 데이터 통신과 컴퓨터 네트워크 | 박기현 저'를 참고하여 작성되었음을 미리 알려드립니다. */&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;네트워크는 외형적으로 &lt;b&gt;시스템과 전송 매체로 구성&lt;/b&gt;된다. 데이터 통신을 위한 전송 매체는 &lt;b&gt;전송 대역, 전송 속도, 전송 오류율&lt;/b&gt; 같은 &lt;b&gt;물리적인 특성이 주 관심사&lt;/b&gt;므로 &lt;b&gt;논리적인 기능은 비교적 단순&lt;/b&gt;한다. 시스템은 전송 매체를 이용해 논리적으로 다양한 연동 형태로 구성할 수 있어 개념의 확장이 폭넓고 복잡하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;네트워크를 구성하는 시스템&lt;/b&gt;이 반드시 컴퓨터처럼 복잡한 기능을 수행해야 하는 것은 아니지만, &lt;b&gt;일반적으로 컴퓨터 시스템으로 가정&lt;/b&gt;한다. 네트워크 시스템은 수행 기능에 따라 다음과 같이 다양하게 부를 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 노드&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;노드(Node)는 인터넷에 연결된 시스템을 가장 일반화한 용어다. &lt;b&gt;데이터를 주고받을 수 있는 모든 시스템을 통칭&lt;/b&gt;한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 호스트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;호스트(Host)는 일반적으로 &lt;b&gt;컴퓨팅 기능이 있는 시스템&lt;/b&gt;이다. 일반 사용자가 응용 프로그램을 실행할 수 있어 &lt;b&gt;사용자가 네트워크에 접속하는 창구 역할&lt;/b&gt;을 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 클라이언트&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;호스트를 세분화할 때 호스트 사이에 제공되는 서비스를 기준으로 클라이언트와 서버로 나눈다. &lt;b&gt;클라이언트(Client)는 서비스를 요청하는 시스템&lt;/b&gt;이다. 호스트는 다양한 서비스를 서로 주고받기 때문에 임의의 호스트가 클라이언트나 서버로 고정되지 않는다. 이용하는 서비스의 종류에 따라서 클라이언트가 될 수도 있고, 서버가 될 수도 있다. 그러므로 특정 서비스를 기준으로 클라이언트와 서버라는 상대적 용어로 구분한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 서버&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;서버(Server)는 서비스를 주고받는 호스트들의 관계에서 &lt;b&gt;특정 서비스를 제공하는 시스템&lt;/b&gt;이다. 일반적으로 서버는 클라이언트보다 &lt;b&gt;먼저 실행 상태가 되어 클라이언트의 요청에 대기&lt;/b&gt;해야 한다. 그리고 &lt;b&gt;영원히 종료하지 않으면서&lt;/b&gt; 클라이언트의 요청이 있을 때마다 서비스를 반복해서 제공해야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 클라이언트와 서버&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;아래의 그림은 임의의 서비스를 기준으로 클라이언트와 서버의 &lt;b&gt;상대적인 관계&lt;/b&gt;를 설명한다. 그림에서 호스트 2는 &lt;b&gt;파일 송수신 기능&lt;/b&gt;을 제공하는 &lt;b&gt;FTP(File Transfer Protocol) 서비스&lt;/b&gt;를 제공하며, 호스트 3은 &lt;b&gt;원격 단말기 기능인 텔넷(Telnet) 서비스&lt;/b&gt;를 제공한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 580px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9997EC3359B8DED80D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9997EC3359B8DED80D&quot; width=&quot;580&quot; height=&quot;326&quot; filename=&quot;클라이언트와 서버.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; FTP 서비스를 먼저 살펴보면, 호스트 1은 호스트 2에 FTP 서비스를 요청한다. 따라서 FTP 서비스를 기준으로 하면 호스트 1이 클라이언트가 되고, 호스트 2는 서버가 된다. 반면, 텔넷 서비스는 호스트 2가 호스트 3에 요청한다. 텔넷 서비스를 기준으로 하면 호스트 2가 클라이언트고, 호스트 3은 서버다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;따라서 호스트 2는 사용하는 &lt;b&gt;서비스의 종류에 따라 클라이언트가 되기도 하고, 서버가 되기도 한다.&lt;/b&gt; 결론적으로 클라이언트와 서버라는 용어는 서비스 이용의 상대적 위치에 따라 결정된다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 절대적인 개념이 결코 아니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;클라이언트와 서버의 명칭을 &lt;b&gt;호스트 시스템에 부여해 사용할 수도&lt;/b&gt; 있다. 특히 다양한 서비스 기능을 제공하는 대형 시스템을 서버로 설정해 다수의 클라이언트가 서버에 접속해 서비스를 이용하도록 할 수 있다. 그러나 &lt;b&gt;기능적인 관점에서는 위의 그림처럼 호스트에서 실행되는 응용 서비스별로 구분하는 것이 더 정확&lt;/b&gt;하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;인터넷에서 네트워크 서비스의 기능은 대부분 응용 프로그램으로 구현되므로 보통 클라이언트 프로세스, 서버 프로세스라는 호칭이 더 자연스러울 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/Network</category>
      <category>네트워크</category>
      <category>네트워크 프로그래밍</category>
      <category>서버</category>
      <category>시스템 기초 용어</category>
      <category>클라이언트</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/84</guid>
      <comments>https://mattlee.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 13 Sep 2017 16:37:22 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;네트워크 기초 용어&amp;gt;</title>
      <link>https://mattlee.tistory.com/83</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* 본 포스팅은 한빛미디어의 '쉽게 배우는 데이터 통신과 컴퓨터 네트워크 | 박기현 저'를 참고하여 작성되었음을 미리 알려드립니다. */&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;네트워크(Network)&lt;/b&gt;는 &lt;b&gt;전송 매체(Transmission Media)&lt;/b&gt;로 서로 연결해 &lt;b&gt;데이터를 교환하는 시스템(System)의 모음&lt;/b&gt;이다. 시스템과 전송 매체의 &lt;b&gt;연결 지점에 대한 규격을 인터페이스(Interface)&lt;/b&gt;라 하고, 시스템이 데이터를 교환할 때 임의의 통신 규칙을 따르는데 이 규칙을 &lt;b&gt;프로토콜(Protocol)&lt;/b&gt;이라 한다. 서로 다른 시스템이 상호 연동해 동작하려면 연동 형식의 통일이 필요하고 이 통일을 &lt;b&gt;표준화(Standardization)&lt;/b&gt;라 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;시스템은 반드시 컴퓨터일 필요는 없지만 &lt;b&gt;보통 컴퓨터 시스템으로 가정&lt;/b&gt;한다. 시스템은 물리적으로 공유하는 전송 매체로 서로 연결한다. 시스템이 전송 매체를 통해 데이터를 교환하려면 반드시 표준화된 프로토콜을 사용해야 한다. 흔히 사용하는 &lt;b&gt;인터넷은 IP(Internet Protocol)라는 네트워크 프로토콜을 사용하는 네트워크 집합체&lt;/b&gt;다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 시스템&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;시스템(System)&lt;/b&gt;은 체제라고도 하는데, &lt;b&gt;내부 규칙에 따라 능동적으로 동작하는 대상&lt;/b&gt;이다. 자동차, 커피 자판기, 컴퓨터, 마이크로 프로세서, 하드 디스크 같은 물리적인 대상뿐만 아니라, 신호등으로 교통을 제어하는 운영 시스템, MS 윈도우즈 등의 운영체제, 프로그램의 실행 상태를 의미하는 &lt;b&gt;프로세스 같은 논리적인 대상도 시스템&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;시스템의 동작에 필요한 외부 입력이 있을 수 있으며, 내부 정보와 외부 입력의 조합에 따른 출력이 있을 수 있다. 작은 시스템이 여러 개 모여 더 큰 시스템을 구성할 수 있으므로 크기로는 시스템을 구분하지 않는다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 인터페이스&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;인터페이스(Interface)&lt;/b&gt;는&lt;b&gt; 시스템과 시스템을 연결하기 위한 표준화된 접근 방법&lt;/b&gt;이다. 예를 들어, 컴퓨터 본체와 키보드를 연결하려면 키보드의 잭을 본체의 정해진 위치에 꽂아야 한다. 이를 위해서는 상호 간의 데이터 교환을 위한 RS-232C, USB 같은 논리적인 규격뿐만 아니라, 잭의 크기 모양 같은 &lt;b&gt;물리적인 규격도 표준화되어야 한다. &lt;/b&gt;인터페이스를 이용해 연결하는 시스템은 능력과 권한이 같은 경우도 있지만 서비스를 주고받는 상하 관계일 수도 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;/* &lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;RS-232는 PC와 음양 커플러, 모뎀 등을 접속하는 직렬 방식의 인터페이스의 하나이다. 인터페이스는 포트라고도 하여 일반적으로 직렬 포트라고 불리기도 한다. &lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;USB는 범용직렬버스라고 불리며(Universal Serial Bus) 컴퓨터와 주변 기기를 연결하는 데 쓰이는 입출력 표준의 하나이다. 대표적인 버전으로는 USB 1.0, 1.1, 2.0, 3.0, 3.1 등이 있다. */ 출처: 위키피디아&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 전송 매체&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;시스템끼리 정해진 인터페이스를 연동해 데이터를 전달하려면 &lt;b&gt;물리적인 전송 수단인 전송 매체(Transmission Media)&lt;/b&gt;가 반드시 있어야 한다. 전송 매체는 사람의 눈으로 볼 수 있는 동축 케이블을 포함하여 소리를 전파하는 공기, 무선 신호&amp;nbsp;등 다양하다. &lt;b&gt;인터페이스는 시스템 간의 연동을 위한 논리적인 규격&lt;/b&gt;이고, 인터페이스에서 정해진 규칙은 &lt;b&gt;매체를 통해 전송됨&lt;/b&gt;으로써 구현되고 동작된다고 볼 수 있다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 프로토콜&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;상호 연동되는 시스템이 전송 매체를 통해 데이터를 교환할 때는 특정 규칙을 따르는데, 이 규칙을 &lt;b&gt;프로토콜(Protocol)&lt;/b&gt;이라 한다. 일반적으로 프로토콜은 주종 관계가 아닌 동등한 위치에 있는 시스템 사이의 규칙이라는 측면이 강조되어 인터페이스와 구분된다. &lt;b&gt;인터페이스는 두 시스템이 연동하기 위한 특정한 접촉 지점(Access Point)&lt;/b&gt;을 의미하는 경우가 많지만, 프로토콜은 주고받는 정보의 형식과 그 과정에서 발생하는 일련의 절차적 순서에 무게를 둔다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 네트워크&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;통신용 매체를 공유하는 여러 시스템이 프로토콜을 사용하여 데이터를 주고받을 때 이들을 &lt;b&gt;하나의 단위로 통칭하여 네트워크(Network)&lt;/b&gt;라 부른다. 일반적인 컴퓨터 네트워크에서는 &lt;b&gt;물리적인 통신 매체로 연결된 컴퓨터 간에 동일한 프로토콜을 이용&lt;/b&gt;해 데이터를 주고받는다. 소규모 네트워크가 모여 더 큰 네트워크를 구성할 수 있는데, &lt;b&gt;네트워크끼리는 라우터(Router)라는 중개 장비를 사용&lt;/b&gt;해 연결한다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 인터넷&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;인터넷(Internet)은 전 세계의 네트워크가 유기적으로 연결되어 동작하는 통합 네트워크다. 인터넷으로 연결된 시스템, 인퍼테이스, 전송 매체, 프로토콜 등은 종류가 매우 다양하지만 데이터 전달 기능에 한해서는 공통적으로 IP(Internet Protocol) 프로토콜을 사용한다. 인터넷이라는 용어는 IP의 첫 번째 단어인 Internet에서 유래되었다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 표준화&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;서로 다른 시스템이 상호 연동해 동작하려면 표준화(Standardization)라는 연동 형식의 통일이 필요하다. 예를 들어, 프린트 용지를 생각해보자. 일반적으로 프린터와 프린트 용지를 만드는 회사는 다르다. 하지만 사전에 A4 규격이라는 통일된 틀을 만들어두었기 때문에 여러 회사의 각기 다른 제품에서 프린트 용지를 자유롭게 사용할 수 있게 되었다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* IP는 'Internet Protocol'의 약자이지만, 고유 명사화되어있으므로 IP 프로토콜이라고 부를 수 있다. TCP, UDP 등 대부분의 네트워크 프로토콜도 마찬가지다. */&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/Network</category>
      <category>네트워크</category>
      <category>네트워크 기초</category>
      <category>네트워크 용어</category>
      <category>네트워크 프로그래밍</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/83</guid>
      <comments>https://mattlee.tistory.com/83#entry83comment</comments>
      <pubDate>Wed, 13 Sep 2017 16:18:27 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;기억의 집 | 최승자 시집&amp;gt;</title>
      <link>https://mattlee.tistory.com/82</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 20살 이후로 처음 읽어보는 시집일 것이다. 메마른 땅에 촉촉한 비가 달게 받아들여지듯, 황무지 같던 내 마음에 이 시집은&amp;nbsp;감성의 싹이 틔어날 수 있게 해준 씨앗이다. 시인이 그랬듯, 지금은 서정 연습시대. 연습하지 않으면 내 안의 감정들이 사라져 버릴지도 모르기에 시집을 조용히 꺼내들었다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;시집을 읽으면서 가장 인상 깊었던 4가지의 시와 감상평을 아래 남겨 보았다. 시인의 배경과 삶의 철학 등을 잘 알지는 못하지만 시가 주는 울림은 상상이상이었고, 오랫 동안 마음 속에 남아있을 것 같다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr class=&quot;tx-hr-border-2&quot; style=&quot;display:block; border: black 0 none; border-top: black 1px solid; border-bottom: black 3px solid; height: 7px&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;서녘 항구&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;저무는 해 닻을 내리고&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;서녘 항구,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;불타는 관절염의 뼈들을 이끌고&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;나 여기까지 왔네.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;흔들어, 흔들어줘!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;순교도 배교도 구원이 될 수 없는 시대,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;침묵하는 배들이 바닷속에 뿌리내릴 때&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;내 일생을 내 일평생을&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;흔들어, 흔들어줘!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* 저무는 해의 닻을 내린다는 표현은 짧게는 하루가 끝나감을, 길게는 인생이 노년기에 접어듬을 연상시킨다. 그런 점에서 보면 뜨거운 가슴을 가졌던 젊은 시절과는 달리 이제는 점점 차갑게 식어가는 자신의 형상을 닻을 내리고 항구에 정착해 있는 배에 비유한 것 같다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;하지만, 이렇게 인생이 져감은 뭔가 석연치 않다. 항구에 떠 있는 배는 이른 새벽이 되면 다시 닻을 올려 바다로 역동적인 항해를 떠나지만, 화자 본인은 그럴 수 없다. 그렇기에 화자는 지금 이 순간, 배가 정착해 있는 이 순간에 자신의 일생을 인생을 다시 흔들어 달라고 하고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;살면서 생긴 미련, 아쉬움들을 뒤로한 채 편히 저물어갈 수 없음이 느껴진다. */&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;물망초&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;우리가 엽전 열닷 냥 찌개 백반의&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;자유를 위해 분주할 때에도&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;모든 길들은 소리 없이 굽이치며 앓고,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;보이지 않는 곳에서 물망초들은 피어난다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;외부를 향한 내부의 내부의&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;피흘림을 고요히 지우며&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;물망초는 또 한 가지를 뻗는다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;그와 같이 내 낮은 흐느낌 또한&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;하나의 말이 될 수 있을 때까지&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;잠시만 기다려 다오.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;내가 이 잔을 다 비울 때까지&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;내가 꿈속에서 다시 한번만 돌아누울 때까지&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;내가 내 시야를 스스로 거둘 때까지&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;잠시만 기다려다오,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;죽음이여&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;잠시만,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;영원히.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; color: rgb(47, 157, 39);&quot;&gt;/* 시를 처음 읽었을 때 알 수 있는 건 화자가 현세에 미련이 남아 있구나라는 것과 그 미련은 필연적으로 화자가 겪었을 어떤 일련의 사건들 - 그 사건들은 대부분 화자에게 상처 내지 부정적 감정을 줬던 것들 - 과 관련이 있겠구나 라는 점이다. 그리고 내면의 상처나 부정적인 감정 등을 완전히 이겨내고 털어내지 못했다는 것도 알 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;수 많은 피흘림과 흐느낌을 고요히 지우며 물망초가 가지를 뻗듯이 화자 또한 내면의 상처, 슬픔, 흐느낌 등을 내려놓아 말로 꺼낼 수 있기를 바라고 있다. 많은 세월이 흘렀음에도 아직 극복하지 못함에 대한 아쉬움이 여실히 드러난다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px; color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;특히 마지막 문단에 잠시만 기다려다오. 에서 영원히 라고 바뀌는 부분은 아쉬움을 서정적으로 정말 잘 표현했다. 애절함과 아쉬움이 잘 묻어난다. */&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;그 거&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;술은 끊어도 담배는 못 끊겠는 거, 그거.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;담배는 끊어도 커피는 못 끊겠는 거, 그거.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;커피는 끊어도 목숨은 못 끊겠는 거, 그거.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;믿지 못하는 사이&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;두 발이 푹푹 빠져들어간다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;빠져들어간다는 것까지도&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;믿지 못하는 사이로&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;두 발은 더욱 습한 곳으로&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;푹푹 빠져들어간다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;(나의 이성과 감정은 언제나&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;나의 현실보다 뒤지는 거, 그거.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;/* 시집에 있는 모든 시 중 가장 소박하면서 귀엽지 않았나 라는 생각을 했다. 누구나 흔히 겪는 심적 갈등을 재치 있지만 깊이가 있는 시다. 욕구 중에서도 순위가 있다면 역시 제일은 살고 싶은 욕구라는 것 또한&amp;nbsp;시에 드러났다는 점이 참 좋다. */&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;그날의 함성은 아직도 유효하다&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;---4.19 에 부쳐&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;만질 수 있는 것과 만질 수 없는 것,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;그 사이에서 4월의 亡者들은&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 亡(망할 망), 者(사람 자), 죽은 사람을 뜻함&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;돌아앉아 오래도록 꿈을 꾸고&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;그날의 함성은 아직도 유효하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;최루탄을 쏘지 마라,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;우리는 헤어지지 못한다,&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp; 않는다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-left: 8em;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;식도와 내장 속으로&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;소리 없이 피 번지는&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;그윽한 內出血의 4월에&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; // 內(안 내), 出(날 출), 血(피 혈)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;우리는 다시 본다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;어떻게 절망이 희망 속으로 행군해가는가,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;어떻게 슬픔의 이데올로기는&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;기쁨의 이데올로기와 쾌속으로 만나는가를.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;최루탄을 쏘지 마라&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;그날의 함성은 아직도 유효하다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* 나는 직접적으로 운동권에 속해보거나 시위, 데모를 해 본 경험 등은 없지만, 이 시에서 흘러 나오는 뜨거운 감정은 나에게도 스며들어왔다. 특히 우리는 헤어지지 못한다라는 부분이 특히 그렇다. 사실은 헤어지지 않는 것이지만, 그건 어느새 의지의 영역이 아닌 의지로는 차마 담지 못하는 뜨거운 감정이 되어버린다. 앞에서 쓰러져 가는, 혹은 고통 당하는 동료들을 볼 때의 그 마음은 아직 경험해보진 않았지만, 어떤지 알 수 있을 것만 같다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;결론적으로 보면 항쟁은 성공했고, 슬픔의 이데올로기는 기쁨의 이데올로기로 이어졌다. 절망이 희망속으로 행군하여 이러낸 쾌거다. 그 날의 뜨거움의 열기가 오랜 세월을 넘어 현대까지 흘러 들어온다.&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;*/&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Reading Note</category>
      <category>기억의 집</category>
      <category>시집</category>
      <category>최승자</category>
      <category>최승자 시인</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/82</guid>
      <comments>https://mattlee.tistory.com/82#entry82comment</comments>
      <pubDate>Wed, 6 Sep 2017 13:31:44 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;컴퓨터와 프로그래밍&amp;gt;</title>
      <link>https://mattlee.tistory.com/81</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;/* 본 포스팅은 kocw의 유상미 교수의 '객체지양언어2' 강의를 듣고 정리한 내용임을 미리 알려드립니다. 유상미 교수의&amp;nbsp;본 강의&amp;nbsp;링크는 '&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://www.kocw.net/home/search/kemView.do?kemId=1192791&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(255, 94, 0);&quot;&gt;http://www.kocw.net/home/search/kemView.do?kemId=1192791&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;' 이며, kocw 사이트에서 따로 객체지향언어2나 교수 이름으로 검색하시면 만나볼 수 있습니다.&amp;nbsp;*/&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 컴퓨터, 프로그램, 언어&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;컴퓨터&lt;/b&gt;는 CPU, 메모리 등으로 결합된 &lt;b&gt;하드웨어와 &lt;/b&gt;프로그램과 같은 &lt;b&gt;소프트웨어로 구성되어 있다.&lt;/b&gt; 컴퓨터를 사용한다는 건 프로그램을 실행한다는 것과 동일한 의미이다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;프로그램은 컴퓨터의 중앙처리장치(CPU)가 처리하는 일련의 명령들과 데이터로 구성되어 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;프로그래밍 언어는 크게 &lt;b&gt;저급 언어&lt;/b&gt;(low-level language)와 &lt;b&gt;고급 언어&lt;/b&gt;(high-level language)로 나눌 수 있다. &lt;b&gt;저급 언어는 컴퓨터 처리에 용이&lt;/b&gt;(즉, 컴퓨터와 친하다)하며 &lt;b&gt;고급 언어는 인간 친화적&lt;/b&gt;이다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 인간 친화적이란 말은 사람이 이해하기 쉽게 구성되어 있다는 뜻이다. 0과 1만으로 이루어진 것보다 print와 같은 문장으로 출력을 할 수 있으니 인간 친화적이라 할 만한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;1세대 부터 지금의 5세대에 이르기까지의 과정을 살펴 보면, 흔히 말하는 0과 1로만 구성된 기계어를 작성한 시대가 1세대, 기계어에 1:1로 대응하도록 기호화한 언어인 어셈블리어를 사용하던 시대가 2세대이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;1~2세대&lt;/b&gt;에 사용하던 언어를 가리켜 &lt;b&gt;저급 언어&lt;/b&gt;라 칭한다. &lt;b&gt;지금과 같은 고급 언어&lt;/b&gt;는 C, 포트란, 베이직, 코볼 등으로 일컬어지는 3세대부터 비주얼베이직, 델파이 파워빌드 등으로 구성됐던 4세대 언어에 이어 자바, C#, C++ 등에 해당하는 &lt;b&gt;5세대 언어까지&lt;/b&gt;를 일컫는다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 490px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/993FD63359AE5D0F09&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F993FD63359AE5D0F09&quot; width=&quot;490&quot; height=&quot;350&quot; filename=&quot;프로그래밍 언어 역사.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: rgb(123, 115, 102); font-family: 돋움, dotum, Tahoma, AppleGothic, sans-serif; font-size: 12px;&quot;&gt;출처: http://www.atmarkit.co.jp/fcoding/articles/gauche/01/gauche01a.html&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위 그림을 살펴 보면, 초기 고급 언어 중 &lt;b&gt;포트란&lt;/b&gt;(FORTRAN)은 수치 계산 분야에 많이 사용되었고 &lt;b&gt;코볼&lt;/b&gt;(COBOL)은 사무처리 분야에서 많이 사용되었다. &lt;b&gt;ALGOL &lt;/b&gt;언어는 C, Pascal, Simula&amp;nbsp;언어에 많은 영향을 미쳤다. 이 중 C++은 기존의 Simula의 객체지향 개념의 영향을 받아 제작된 객체지향 언어다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;1980년대부터 C언어의 함수지향 개념의&amp;nbsp;한계를 넘기 위한 새로운 소프트웨어 개발&amp;nbsp;연구가 진행되면서 객체지향개념이 등장하게 되었다. 오늘날의 C++, Java, C# 등은 대표적인&amp;nbsp;객체지향언어로 사랑받고 있다.&amp;nbsp;&lt;b&gt;Java&lt;/b&gt;의 경우&amp;nbsp;객체지향개념과 함께 &lt;b&gt;Lisp이란 언어의 Garbage Collection 이란 개념&lt;/b&gt;을 가지고 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;Lisp 언어가 있는 아래의 언어를 살펴 보면, Simula의 객체지향의 영향을 받은&amp;nbsp;Smalltalk 언어가 있다. 또한 최근에 초보자가 쉽게 작성할 수 있다 하여 사랑 받는 Python이 있다. 중간 기준선 위 아래로 구분된 건 &lt;b&gt;동적언어냐 정적언어냐에 따라 구분&lt;/b&gt;할 수 있다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 위쪽이 정적 언어이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 인터프리터 컴파일러&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;프로그래밍 언어를 이용해서 작성된 프로그램을 &lt;b&gt;소스코드 또는 소스 파일&lt;/b&gt;이라고 칭한다. 이 코드는 &lt;b&gt;인간이 이해하기 쉬운 형태&lt;/b&gt;로 작성되어 있기 때문에 &lt;b&gt;컴퓨터가 처리할&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&amp;nbsp;수 있는 언어로 변환&lt;/b&gt;을 해야 한다. 이런 &lt;b&gt;변환 과정을 번역&lt;/b&gt;이라고 하는데, 번역을 하는 방식엔 &lt;b&gt;인터프리터 방식과 컴파일러 방식&lt;/b&gt;이 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;인터프리터 방식&lt;/b&gt;은 소스코드 전체가 아닌, &lt;b&gt;코드를 한 줄씩 읽어와서 컴퓨터가 처리할 수 있는 형태로 시물레이션 &lt;/b&gt;하여 해석하고 실행하는 방식이다. &lt;b&gt;컴파일 방식&lt;/b&gt;은 컴파일러라 불리는 번역기를 이용하여 전체 소스코드에 대한 오류를 체크하고 이를 &lt;b&gt;기계어와 유사한 중간 코드로 생성&lt;/b&gt;하는데 이 파일을 &lt;b&gt;목적파일&lt;/b&gt; 이라고 한다. 이렇게 생성된 목적파일은 이후 링커와 로더에 의해 .exe 형태의 실행파일로&amp;nbsp;생성되어&amp;nbsp;컴퓨터가 처리할 수 있게 된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위&amp;nbsp;둘 방식의 가장 큰 차이는 &lt;b&gt;목적파일을 생성하는가&lt;/b&gt;에 있다. 각각 처리방식에서 메모리 할당을 할 때 &lt;b&gt;인터프리터 방식의 언어는&amp;nbsp;주로 동적할당&lt;/b&gt;을 하고 &lt;b&gt;컴파일방식의 언어는&amp;nbsp;주로 정적할당&lt;/b&gt;을 한다. 메모리 할당을 정적으로 하면, 효율성이 좋고 동적할당을 위주로 하면 유연성이 좋으며 프로그래밍하기 쉽다는 장점이 있다. 위 두 방식 중 어떤 걸 택했느냐에 따라&amp;nbsp;각각 정적 언어, 동적 언어로 분류한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;앞에서 살펴 본 언어들을&amp;nbsp;컴파일 언어와 인터프리터 언어로 분류하면,&amp;nbsp;앞의 동적언어와 정적언어의 분류방식 그림과 같다. 하나 다른 것이 있다면 &lt;b&gt;Java 자체는 컴파일 언어&lt;/b&gt;로 분류되어 있다는 점이다. 그러나 &lt;b&gt;Java는&amp;nbsp;동적 언어의 장점을 수용&lt;/b&gt;하고 있는 언어인데, 이것은 자바 언어를 이해하는데 매우 중요한 특징을 가진다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;C#이나 Go도 비슷한 방식으로 처리&lt;/b&gt;된다. Go는 2009년에 구글이 개발하여 공식 발표한&amp;nbsp;언어인데 이 언어 또한 &lt;b&gt;컴파일 언어의 효율성과 동적 언어의 쉬운 프로그래밍을 목표로 개발&lt;/b&gt; 되었다. 문법적으로는 C와 유사하고, GarbageCollection 기능을 가지고 있다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Develop Story/Common sense</category>
      <category>C++</category>
      <category>garbagecollection</category>
      <category>Simula</category>
      <category>가비지컬렉션</category>
      <category>가비지컬렉터</category>
      <category>동적 언어</category>
      <category>언어 역사</category>
      <category>정적 언어</category>
      <category>컴퓨터</category>
      <category>컴퓨터 프로그래밍</category>
      <category>포트란</category>
      <category>프로그램 언어 역사</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/81</guid>
      <comments>https://mattlee.tistory.com/81#entry81comment</comments>
      <pubDate>Tue, 5 Sep 2017 17:46:24 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;9월 티스토리 초대장 배포: 7장&amp;gt; [마감]</title>
      <link>https://mattlee.tistory.com/80</link>
      <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;안녕하세요. 프로그래밍 관련 블로그를 운영하고 있는 데브맷입니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;새롭게 블로그 시작하시려고 마음 먹으신 분들을 위해 초대장을 나눠드리려 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;댓글에 이메일 주소와 블로그를 어떻게 운영할지 등을 짤막하게 한 줄로 남겨주세요!&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;[마감]&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;모두에게 드리지 못해 마음이 아플 따름입니다. 또 나오는 대로 바로바로 나눠드리겠습니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;응원합니다 여러분.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Tistory</category>
      <category>초대장 배포</category>
      <category>티스토리 초대장</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/80</guid>
      <comments>https://mattlee.tistory.com/80#entry80comment</comments>
      <pubDate>Sun, 3 Sep 2017 13:42:50 +0900</pubDate>
    </item>
    <item>
      <title>Error:This Gradle plugin requires Studio 3.0 minimum 오류 해결</title>
      <link>https://mattlee.tistory.com/79</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 본인은 분명 안드로이드 스튜디오 사이트에 등재되어 있는 최신 버전의 안드로이드 스튜디오를 다운 받았음에도 이와 같은 에러를 만나 매우 당황스러웠다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;오류가 발생한 건 공부차 분석해보고 싶은 오픈 소스 앱을 github에서 내려 받아 import project 하는 과정에서 생겼다. 최신 버전을 설치했음에도 더 상위 버전을 설치해야한다는 문구를 봤을 때의 당혹감.. 을 겪었다면 아래와 같이 해결해보자.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;여러 가지 해결책이 있을 수 있으나, 스택 오버 플로우에서 참고한 답안이 생각보다 잘 적용되었기에 이렇게 공유하고자 한다. 링크와 사진을 함께 보도록 하자.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio/preview/index.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://developer.android.com/studio/preview/index.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 580px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A1CF3359A0279534&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A1CF3359A0279534&quot; width=&quot;580&quot; height=&quot;374&quot; filename=&quot;안스 얼리어답터 버전.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위 링크로 접속하면 아직 안정적인 버전으로 정착하지는 않았지만, 최신 버전의 기능들이 탑재 되어 있는 Android Studio Preview 버전을 설치할 수 있다. 설치 버튼을 누르면 다운로드와 함께 다운로드 안내페이지로 이동하게 된다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 580px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994E0B3359A027DC18&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994E0B3359A027DC18&quot; width=&quot;580&quot; height=&quot;374&quot; filename=&quot;얼리어답터 설치 설명서.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;현재 안드로이드 스튜디오가 설치되어 있어도 함께 실행할 수 있기 때문에 걱정하지 않아도 된다. 둘은 별개의 프로그램으로 분류된다. Preview 버전으로 실행하면, 최신 버전이 아니여서 실행할 수 없다는 등의 에러를 만나지 않을 수 있다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Develop Story/Android Studio</category>
      <category>Android Studio Preview</category>
      <category>gradle 에러</category>
      <category>minimum</category>
      <category>plugin 에러</category>
      <category>Studio 3.0 minimum</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/79</guid>
      <comments>https://mattlee.tistory.com/79#entry79comment</comments>
      <pubDate>Fri, 25 Aug 2017 22:37:31 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;함수 포인터와 역호출 구조&amp;gt; #qsort</title>
      <link>https://mattlee.tistory.com/78</link>
      <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39); font-size: 11pt;&quot;&gt;/* 본 포스팅은 최호성 저자의 '독하게 시작하는 C프로그래밍' 교재를 참조로 작성되었음을 먼저 알려드립니다. */&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(47, 157, 39); font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;함수의 이름 또한 배열의 이름처럼 '주소 상수'에 부여한 식별자다. 따라서 함수의 이름도 포인터 변수에 저장할 수 있다. 다만 변수의 자료형이 함수 호출에 필요한 정보들을 포함하고 있어야 변수를 이용해서 함수를 호출할 수 있다. // 호출에 필요한 정보는 매개 변수, 호출 규칙, 반환 자료형 등이 있다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;그래서 'void *'에 함수의 이름을 저장할 수는 있으나 호출을 할 수는 없다. 아래의 코드는 함수 포인터를 구체적으로 다루기에 앞서 함수의 이름이 주소임을 확인하기 위한 코드다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
	// void *는 어떤 주소든 담을 수 있는 자료형이다.
	// 함수이름은 '주소' 이므로 void *에 담을 수 있다.
	void *pData = main;

	// 함수의 주소를 출력한다.
	printf(&quot;%p\n&quot;, pData);
	printf(&quot;%p\n&quot;, main);
	return 0;
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;7번 행에서 void형 포인터인 pData를 선언 및 정의하는데 있어 초깃값으로 'main'을 기술했다. pData에 들어 있는 주솟값이 main 이므로 10번 행과 11번 행은 같은 결과를 출력한다. 이러한 주소와 매개변수, 호출 규칙을 알면 일단 함수를 호출할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;변수도 함수도 사실은 다 주소로 식별을 한다. 다만 그 주소의 메모리를 저장공간으로 활용할 것인가, 아니면 그 주소의 메모리에 저장된 정보를 CPU가 인식하는 명령코드로 볼 것인가만 다를 뿐이다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 함수 포인터&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;함수 포인터 변수의 문법은 약간 복잡하다. 다차원 배열에 대한 포인터처럼 '*'가 기술되는 위치가 중간에 기술되며 반드시 괄호로 묶어야 한다. 우선 기본 형식은 아래와 같다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;반환 자료형 ( 호출 규칙 *변수 이름) (매개 변수)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;아래의 코드는 매개변수로 char *형 자료 한 개와 int형 정보 0을 반환하는 함수를 main( ) 함수에서 호출하는 코드다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

int testFunc(char *pszParam)
{
	return 0;
}

int main(void)
{
	// 괄호는 함수 호출 연산자
	testFunc(&quot;&quot;);

	// 저장하는 행위 자체는 허용이 된다.
	// 다만 자료형이 맞지 않는다.
	int nData = testFunc;

	nData(&quot;&quot;);
	return 0;
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;다소 난해하게 보이는 이 코드는 일단 컴파일 에러가 난다. &lt;b&gt;int nData = testFunc; 까지는 허용&lt;/b&gt;이 되지만 &lt;b&gt;nData(&quot;&quot;); 부분에서 오류&lt;/b&gt;가 난다. &lt;b&gt;주소 상수&lt;/b&gt;인&lt;b&gt; testFunc&lt;/b&gt;를 int형 변수에 저장하는 건 되지만 이걸로 &lt;b&gt;함수 호출까지는 되지 않는다&lt;/b&gt;는 걸 확인할 수 있다. 하지만 아래와 같이 코드를 수정하면 어떻게 될까?&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
// 함수 포인터를 사용하는 기본 형식
//int (*이름) (char*)
int testFunc(char *pszParam)
{
	return 0;
}

int main(void)
{
	// 괄호는 함수 호출 연산자
	testFunc(&quot;&quot;);

	// 저장하는 행위 자체는 허용이 된다.
	// 다만 자료형이 맞지 않는다.
	int nData = (int)testFunc;

	// 강제 형변환을 통해 함수호출을 할 수 있는 구조로
	// 만들어주면 호출이 가능하다.
	((int(*)(char*))nData)(&quot;&quot;);
	return 0;
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;정상적으로 컴파일이 되고 함수 호출까지 된다. 변수에 대한 이해도도 높일 수 있기에 좋은 코드라고 할 수 있다. &lt;b&gt;변수도 결국 메모&lt;/b&gt;리고 &lt;b&gt;어떻게 해석하는지에 따라 용도가 얼마든지 달라질 수 있다. &lt;/b&gt;비록 int 형 변수지만 함수를 호출할 수 있는 코드로 사용할 수 있다는 건 어찌보면 당연한 얘기다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;함수 호출 포인터의 문법이 이렇다는 점과 변수와 함수 이름 등은 모두 메모리에 기록된 상수이며 어떻게 해석하는지에 따라 달라진다는 점 또한 다시한 번 상기하자.&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;아래의 코드는 함수 포인터를 이용하여 함수를 호출하는 문법을 다시한 번 보여준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

// 함수 포인터를 사용하는 기본 형식
//int (*이름) (char*)
int testFunc(char *pszParam)
{
	return 0;
}

int main(void)
{
	int(__cdecl *pfTestFunc)(char *) = testFunc;
	pfTestFunc(&quot;pszParam&quot;);
	return 0;
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;다차원 배열에 대한 포인터처럼 &lt;b&gt;(호출규칙 *이름)이 괄호로 묶이는 것&lt;/b&gt; 때문에 조금 복잡해 보이는 것 뿐, &lt;b&gt;나머지는 함수 본래&lt;/b&gt;의 반환 자료형과 매개변수 자료형을 그대로 기술하면 된다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;그리고 늘상 봐오던 함수호출 연산자에 대해서도 언급을 하자면, &lt;b&gt;함수호출 연산자는 바로 괄호&lt;/b&gt;이며 &lt;b&gt;주소( 매개변수 ) 형식&lt;/b&gt;으로 사용한다. 여기서 &lt;b&gt;주소는 물론 함수 이름&lt;/b&gt;이다. 혹은 &lt;b&gt;함수 포인터 &lt;/b&gt;일 수도 있다. 바로 위의 코드는 함수 호출을 함수 포인터로 하는 것에 대한 예제 코드다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 역호출 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 함수호출 연산자나 함수 포인터가 꼭 필요한 경우가 언제인지에 언급하자면 아래의 두 경우가 있다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;동적 연결 라이브러리(DLL, Dynamic Linking Library)를 활용하는 경우&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;역호출(call back) 구조를 구현하는 경우&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;이 중 역호출에 대해 다뤄보고자 한다. 지금까지 우리가 사용해 왔던 함수 호출은 주로 직접 호출하는 능동적인 방법이었다. 그런데 이 함수라는 것이 작성자 입장에서 &quot;내가 호출하는 것이 아니라 다른 무엇에 의해 호출&quot; 될 수도 있다. 간단한 예로 아래와 같은 코드를 살펴보자.&lt;/span&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

// 함수 포인터를 사용하는 기본 형식
//int (*이름) (char*)
int testFunc(char *pszParam)
{
	return 0;
}

// 매개변수로 함수 포인터와 int형 변수를 받는 함수
void myTest(int(*pfTest)(char*), int nParam)
{

}

int main(void)
{
	myTest(testFunc, 10);
	return 0;
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 정말 단순하게 생각해보면 난 testFunc( ) 함수를 만든 제작자다. 하지만 main함수에서 testFunc( )를 직접 호출하는 것이 아니라 myTest( ) 함수를 통해 간접적으로 호출이 되고 있다. 즉, 다른 무엇에 의해 호출 되는 경우인 것이다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;역호출 구조를 좀 더 제대로 이해하기 위해서는 qsort( ) 함수에 대해 공부하는 게 도움이 된다. qsort( ) 함수에 대해 먼저 살펴보면 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-left: 2em;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;void qsort(void *base, size_t num, size_t width, int(__cdecl *compare)(const void *, const void *));&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;인자&lt;/b&gt;&lt;br /&gt;base:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;정렬 대상 배열의 기준주소&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;num:&amp;nbsp; &amp;nbsp; 배열 요소의 개수&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;width:&amp;nbsp; &amp;nbsp; 배열 요소의 바이트 단위 크기&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;compare:&amp;nbsp; &amp;nbsp; 각 요소를 비교하여 같을 경우 0, 다를 경우 양수 혹은 음수를 반환하는 함수의 주소&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;반환값: 없음&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;설명: 퀵 정렬 알고리즘을 이용하여 배열에 담긴 요소를 정리하는 함수이다. 사용자 정의 콜백 함수를 만들어 인수를 전달하는 방법으로 각 항을 비교하는 방법을 구체화 한다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;아래의 예제는 &lt;b&gt;CRL 함수인 qsort( )의 사용 에&lt;/b&gt;를 보인 것이다. qsort( ) 함수의 네 번째 매개 변수는 &lt;b&gt;const void* 둘을 매개변수로 받고 int형 자료를 반환하는 함수에 대한 포인터&lt;/b&gt;이다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 퀵 정렬은 평균 정렬 속도가 가장 빠른 것으로 알려진 정렬 알고리즘이다. CRL은 C Runtime Library의 약자이다.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

// qsort() 함수가 역호출할 함수의 선언 및 정의
// 각 항을 비교하는 함수
int myCompare(const void *left, const void *right)
{
	// void *로 매개변수를 받으면 사용할 수 없으므로
	// int * 라고 명시해준다.
	return *(int*)left - *(int*)right;
}

// 메인함수가 직접 myCompare를 호출하지 않는다.
int main(void)
{
	int aList[5] = { 20, 50, 10, 30, 40 };

	qsort(aList, 5, sizeof(int), myCmpare);

	for (int i = 0; i &amp;lt; 5; i++)
		printf(&quot;%d\t&quot;, aList[i]);
	return 0;
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;myCompare 함수&lt;/b&gt;의 경우 정렬의 대상이 int형 혹은 double형이 될 수도 있으므로 &lt;b&gt;qsort( ) 함수는 자료형을 구체화하지 않고 일반적 개념 (myCompare(void *, void *))로 정렬을 구현&lt;/b&gt;한 것이다. 따라서 일반화된(혹은 추상화된) 개념을 &lt;b&gt;구체화하는 것은 qsort( ) 함수를 사용하려는 사람의 몫&lt;/b&gt;이다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;구체화하는 방법은 &lt;b&gt;&quot;각 항을 비교하여 결과를 반환하는 함수&quot;를 만드는 것&lt;/b&gt;이다. 그리고 &lt;b&gt;void *&lt;/b&gt;에 대해 간접지정연산을 통한 인스턴스화가 불가능하므로, &lt;b&gt;myCompare의 return 문에서 const void *를 int *로 강제 형변환 한 후 간접지정 연산을 수행&lt;/b&gt;했다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// void *는 자료형을 해석하지 않겠다는 의미로 해석되기 때문에 반환을 할 수 없다. 반환이라는 건 어떤 값을 어떻게 해석해서 내보내겠다는 의미인데 해석을 안하는 void *를 가지고 반환할 수는 없는 노릇이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위의 코드는 메인 함수에서 qsort( ) 함수를 호출하고, &lt;b&gt;qsort( ) 함수가 myCompare( ) 함수를 역호출(call back)하는 구조&lt;/b&gt;를 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 640px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/993B8733599FA10C11&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F993B8733599FA10C11&quot; width=&quot;640&quot; height=&quot;360&quot; filename=&quot;콜백 call back.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위의 예제의 코드만 봐서는 myCompare( ) 함수가&lt;b&gt; 몇 번이나 역호출 되는지는 알 수 없다.&lt;/b&gt; myCompare( ) 함수는 qsort( ) 함수가 &lt;b&gt;정렬을 위해 두 항을 비교할 때마다 호출될 것&lt;/b&gt;이므로 알고리즘을 정확히 알고 있는 사람이라면 예측할 수도 있을 것이다. 그러나 그런 내용을 전혀 알지 못하면, &lt;b&gt;myCompare( ) 함수는 '언제 그리고 몇 번' 호출되는지 알 수 없다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;역호출(call back) 이란 이름이 붙은 이유도 qsort( ) 함수의 호출자는 main( ) 함수지만 피호출자인 qsort( ) 함수가 다시 myCompare( ) 함수의 호출자가 되기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;만약&lt;b&gt; main( ) 함수의 제작자가 A &lt;/b&gt;라고 한다면&lt;b&gt; myCompare( ) 함수의 제작자 역시 A&lt;/b&gt;라고 할 수도 있다. &lt;b&gt;그러나 qsort( ) 함수의 제작자&lt;/b&gt;가 누군지는 몰라도 그는 A가 아닐 것이라 생각해 볼 수는 있다. &lt;b&gt;B라고 가정&lt;/b&gt;한다면, &lt;b&gt;최초 A가 만든 main( ) 함수가 B가 만든 qsort( ) 함수를 호출&lt;/b&gt;한다. 이 때, A는 자신이 만든 &lt;b&gt;함수의 주소를 B에게 전달&lt;/b&gt;하고 &lt;b&gt;B는 자신의 코드를 수행하다가 A가&amp;nbsp;알려준 주소의 함수를 '역으로 호출(call back)' &lt;/b&gt;한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 함수 주소를 등록한다는 개념이다. 이 등록을 받은 쪽에서 주소를 아니까 call 을 해준다는 의미다. 등록을 한 대상으로부터 called 된다 라고 생각하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위 예제에서는 main( ) 함수가 &lt;b&gt;myCompare( ) 함수를 호출하는 코드가 없다.&lt;/b&gt; 그럼에도 myCompare( ) 함수는 분명히 호출된다. 즉, &lt;b&gt;피호출자 함수에 의해 역으로 호출&lt;/b&gt;된다.&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;b&gt; &quot;내가 호출하는 것이 아니라 자동으로 호출된다&quot; &lt;/b&gt;&lt;/span&gt;라는 개념은 앞으로도 대단히 중요하다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;객체지향언어에서도 대단히 중요한데, 문법적으로 함수 포인터가 등장하는 것은 아니지만 함수가 자동으로 호출된다는 가정에 기반을 둔 문법이 존재하고, 이를 명확히 이해하고 제대로 사용하려면 반드시 &quot;자동으로 호출된다&quot;라는 의미를 활용할 수 있어야 한다.&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt; // 콜백은 주로 유저(user)모드와 커널(kernel)모드의 개념에서도 쓰인다. &lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;유저가 만든 함수를 커널에 등록하면 OS가 비동기&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;적으로 이 함수를 cal&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;l back 한다. 언제 부르고 왜 부르고 몇 번 불렀는지는 모른다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;그렇다면 qsort( ) 함수를 왜 callback으로 만들었을까? 정렬하는 대상 자료형이 계속 달라질 수 있기 때문이다. 자료형에 따라 비교를 하는 방법을 다양하고 전부 다 다르다. 따라서 정렬의 대상은 사용자가 직접 정해야 한다. 전체적인 정렬의 방법(인터페이스)은 제공해주고, 직접적인 적용인 비교 logic은 비교하고 싶은 사람이 알아서 규정하게끔 콜백 구조가 만들어지는 것이다. // 인터페이스의 역할을 한다고 생각하면 콜백을 이해하기 한결 쉽다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 함수포인터 + (Look up) 배열&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;이 기법을 사용하면 switch 와 case 문을 완벽하게 대처하면서 고성능으로 코드 제작이 가능하다. 앞서 말한 함수 포인터와 조합해서 사용하면 아래와 같은 기법이 가능하다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 상당한 고급 테크닉으로 분류된다. 실제로 switch case를 쓰는 것보다 성능이 정말 많이 향상된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &lt;stdio.h&gt;

void testFunc1(int nParam)
{
	puts(&quot;testFunc1&quot;);
}
void testFunc2(int nParam)
{
	puts(&quot;testFunc2&quot;);
}
void testFunc3(int nParam)
{
	puts(&quot;testFunc3&quot;);
}

int main(void)
{

	void(*pfList[3])(int) = {	// 함수 포인터의 배열이다.
		testFunc1, testFunc2, testFunc3
	};

	// 룩업 테이블처럼 인덱스를 입력 받아서 한다고 생각해보면
	// switch case를 할 필요가 없이 신속하게 함수를
	// 호출할 수 있다. 성능에 큰 도움이 된다.
	int nInput;
	scanf_s(&quot;%d&quot;, &amp;amp;nInput);

	if(nInput &amp;gt;= 0 &amp;amp;&amp;amp; nInput &amp;lt;= 2)
		pfList[nInput](10);
	
	return 0;
}
&lt;/stdio.h&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/C</category>
      <category>call Back</category>
      <category>qsort</category>
      <category>룩업 테이블</category>
      <category>콜백</category>
      <category>퀵 정렬</category>
      <category>큐솔트</category>
      <category>함수 룩업 테이블</category>
      <category>함수 포인터</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/78</guid>
      <comments>https://mattlee.tistory.com/78#entry78comment</comments>
      <pubDate>Fri, 25 Aug 2017 15:14:34 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;함수에 대한 고급 이론&amp;gt; 함수 호출 규칙</title>
      <link>https://mattlee.tistory.com/77</link>
      <description>&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39); font-size: 11pt;&quot;&gt;/* 본 포스팅은 최호성 저자의 '독하게 시작하는 C프로그래밍' 교재를 참조로 작성되었음을 먼저 알려드립니다. */&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;함수 호출 규칙(calling convention)은 호출자 함수가 피호출자 함수를 호출하는 과정에서 매개변수를 전달하는 순서 및 매개변수가 사용한 메모리 관리방법 등에 관한 규칙이다. 대표적으로 &lt;b&gt;__cdecl, __stdcall, __fastcall&lt;/b&gt;&amp;nbsp;등 세 가지 정도가 있는데 이 세 가지가 C 언어의 표준에서 정의하는 것은 아니다. 모두 약간씩 차이가 있는데 C/C++ 컴파일러의 기본 함수 호출 규칙은 &lt;b&gt;__cdecl&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;우리가 자동변수를 선언할 때&lt;b&gt; auto를 생략해도 되는 것처럼 __cdecl도 생략할 수 있다. &lt;/b&gt;따라서 아무것도 기술하지 않으면 함수 호출 규칙은 __cdecl이다. 제대로 표시하자면 함수의 반환 자료형과 이름 사이에 아래와 같은 호출 규칙이 명시되어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

int __cdecl main(void)
{
	printf(&quot;Hello world!\n&quot;);
	return 0;
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;세 함수 호출 규약의 특징을 요약하면 아래의 표와 같다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;table class=&quot;txc-table&quot; width=&quot;814&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;border:none;border-collapse:collapse;;font-family:&quot; 맑은=&quot;&quot; 고딕&quot;,=&quot;&quot; sans-serif;font-size:13px&quot;=&quot;&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;width: 271px; height: 24px; border-width: 1px; border-style: solid; border-color: rgb(204, 204, 204); background-color: rgb(228, 247, 186);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;호출 규칙&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 271px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204); background-color: rgb(228, 247, 186);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;매개변수 스택 정리&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width: 271px; height: 24px; border-bottom: 1px solid rgb(204, 204, 204); border-right: 1px solid rgb(204, 204, 204); border-top: 1px solid rgb(204, 204, 204); background-color: rgb(228, 247, 186);&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;매개변수 메모리&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:271;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;__cdecl&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width:271;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Caller&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width:271;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Stack&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:271;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;__stdcall&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width:271;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Callee&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width:271;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Stack&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;width:271;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;border-left:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;__fastcall&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width:271;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Callee&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td style=&quot;width:271;height:24;border-bottom:1px solid #ccc;border-right:1px solid #ccc;;&quot;&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;Stack + Register&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# __cdecl&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 580px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991F793359969B4B4D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991F793359969B4B4D&quot; width=&quot;580&quot; height=&quot;392&quot; filename=&quot;호출규칙.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;프로젝트의 속성에서 '[구성 속성] -&amp;gt; [C/C++] -&amp;gt; [고급]'의 '호출 규칙' 항목을 보면 기본 설정이 __cdecl로 되어 있다. 따라서 별도로 명시하지 않았을 때 모든 함수 호출 규칙은 __cdecl인 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;__cdecl 호출 규칙은 &lt;b&gt;매개변수를 오른쪽부터 스택에 Push&lt;/b&gt;한다. 그리고 매개변수로 인해 증가한 스택을 호출자 함수가 본래 크기로 줄인다. &lt;b&gt;자동변수는 모두 스택 영역 메모리를 사용&lt;/b&gt;한다. 메모리가 자동으로 관리된다는 말은&lt;b&gt; 결국 사용되는 스택의 영역이 늘거나 줄어드는 것에 불과&lt;/b&gt;하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;힙 영역 메모리처럼 운영체제에 반환되는 형태로 관리되는 것이 아니다. 아래 코드의 &lt;b&gt;gMax( )함수&lt;/b&gt;는 int형 매개변수 세 개를 받아 그 중 최대값을 반환해주는 함수다. 따라서 &lt;b&gt;매개변수로 인해 증가하는 스택의 크기는 12바이트&lt;/b&gt;이다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 4바이트 int 변수 * 3 = 12바이트&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &amp;lt;stdio.h&amp;gt;

int __cdecl gMax(int a, int b, int c)
{
	int nMax = a;
	if (b &amp;gt; nMax)
		nMax = b;
	if (c &amp;gt; nMax)
		nMax = c;

	return nMax;
}

int __cdecl main(void)
{
	int nResult = 0;
	nResult = gMax(1, 2, 3);
	return 0;
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위의 코드를 작성하여 디스어셈블리 화면을 확인하면 아래와 같은 내용을 확인할 수 있는데, 잘 보면 gMax( )함수를 호출하는 부분에서 &lt;b&gt;오른쪽 인수 3부터 스택에 Push하는 것&lt;/b&gt;을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;       int nResult = 0;
0003171E  mov         dword ptr [nResult],0 
       nResult = gMax(1, 2, 3);
00031725  push        3 
00031727  push        2 
00031729  push        1 
0003172B  call        _gMax (03126Ch) 
00031730  add         esp,0Ch 
00031733  mov         dword ptr [nResult],eax 
       return 0;
00031736  xor         eax,eax 
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; 그리고&lt;b&gt; call 연산으로 gMax( )함수를 호출&lt;/b&gt;한 후 &lt;b&gt;이 함수가 반환하면 main( )함수 내부&lt;/b&gt;에서는 &lt;b&gt;add esp, 0Ch&lt;/b&gt;라는 연산을 수행한다. 여기서&lt;b&gt; '0Ch'는 0x0C 즉, 10진수 12를&lt;/b&gt; 의미하며, &lt;b&gt;esp&lt;/b&gt;(extended stack pointer)는 &lt;b&gt;스택 메모리에 대한 '포인터'&lt;/b&gt;이다. 포인터에 대해 ADD 연산을 수행하므로 &lt;b&gt;주소값이 증가&lt;/b&gt;한다.&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt; // 스택의 주소가 증가하는 건 스택이 감소한다는 걸 뜻한다. 상식적으로 생각할 때 이해가 안될 수 있지만 실제로 스택은 쌓일 때마다 주소가 감소한다. 먼저 한계 선을 긋고 그 안에서 왔다갔다 하는 개념이기 때문에 이렇게 설계가 되었다고 생각하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위의 코드에서는 12바이트(4바이트 int형 변수 3개)만큼 증가한다. &lt;b&gt;주소가 증가했다는 건 스택의 감소&lt;/b&gt;를 의미한다. 즉, main( )함수에 들어가는 &lt;b&gt;이 한줄의 코드로 스택은 gMax( )함수호출 전 상태로 복원되는 것&lt;/b&gt;이다. 이러한 점 때문에 &lt;b&gt;자동변수 메모리는 자동으로 관리된다&lt;/b&gt;는 말을 할 수 있는 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# __stdcall&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;__stdcall 호출 규칙 또한 __cdecl 호출 규칙처럼 &lt;b&gt;매개변수를 오른쪽부터 스택에 Push &lt;/b&gt;한다. 그러나 매개변수로 인해 증가한 스택을 호출자 함수가 정리하는 것이 아니라 &lt;b&gt;피호출자 함수가 정리&lt;/b&gt;한다.&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt; // 피호출자 함수를 어렵게 생각할 것 없이 불려지는 함수라고 생각하면 된다. A called by B 라는 문장이 있다면 A가 피호출자 함수가 된다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;이 역시도 어셈블리를 살펴봄으로써 확인할 수 있는데, 아래의 코드의 어셈블리는 좀 복잡한 관계로 호출자 함수의 어셈블리에서 스택을 정리하는 코드가 사라졌다는 정도만 확인하려 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &amp;lt;stdio.h&amp;amp;g;

int __stdcall gMax(int a, int b, int c)
{
	int nMax = a;
	if (b &amp;gt; nMax) nMax = b;
	if (c &amp;gt; nMax) nMax = c;
	return nMax;
}

int __cdecl main(void)
{
	int nResult = 0;
	nResult = gMax(1, 2, 3);
	return 0;
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;main( ) 함수&lt;/b&gt;는 &lt;b&gt;__cdecl 호출 규칙&lt;/b&gt;을 사용하지만, &lt;b&gt;gMax( ) 함수는 __stdcall 호출 규칙을 사용&lt;/b&gt;하도록 명시했다. 따라서 main( )함수가 gMax( )를 호출하면서 &lt;b&gt;증가한 12바이트의 스택 메모리는 피호출자 함수인 gMax( )에 의해 정리될 것&lt;/b&gt;이다. 그러므로 앞서 살펴봤던 &lt;b&gt;add esp, 0Ch 는 main( ) 함수의 어셈블리에 존재하지 않을 것&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;	int nResult = 0;
00F7171E  mov         dword ptr [nResult],0  
	nResult = gMax(1, 2, 3);
00F71725  push        3  
00F71727  push        2  
00F71729  push        1  
00F7172B  call        _gMax@12 (0F71073h)  
00F71730  mov         dword ptr [nResult],eax  
	return 0;
00F71733  xor         eax,eax  
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt; gMax( ) 함수를 호출한 이후로 mov dword ptr [nResult], eax 라는 연산이 수행되었는데 이는 gMax( ) 함수가 반환한 값을 nResult에 대입하는 C 코드에 대한 어셈블리 코드다. call 연산과 mov 연산 사이에 스택을 정리하는 코드가 더는 보이지 않는다. gMax( ) 함수 내부에서 스택을 정리하기 때문이다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# __fastcall&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp; __fastcall은 __stdcall 처럼 매개변수는 오른쪽부터 스택에 Push하고 피호출자 함수가 스택을 정리한다. 단, 매개변수가 여러 개면 가장 나중에 Push 되어야 할 왼쪽 첫 번째, 두 번째 매개변수는 스택 대신&lt;b&gt; CPU의 레지스터(EDX, ECX)를 이용해 전달&lt;/b&gt;한다. 따라서 매개변수가 메모리에 복사되는 횟수를 줄이고, 이 효과로 연산속도가 일부 향상될 수 있다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 레지스터에 대해선 OS 2일차 게시물을 살펴보도록 하자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;#include &lt;stdio.h&gt;

int __fastcall gMax(int a, int b, int c)
{
	int nMax = a;
	if (b &amp;gt; nMax) nMax = b;
	if (c &amp;gt; nMax) nMax = c;
	return nMax;
}

int __cdecl main(void)
{
	int nResult = 0;
	nResult = gMax(1, 2, 3);
	return 0;
}
&lt;/stdio.h&gt;&lt;/pre&gt;

&lt;pre class=&quot;brush: cpp;&quot;&gt;	int nResult = 0;
00B6171E  mov         dword ptr [nResult],0  
	nResult = gMax(1, 2, 3);
00B61725  push        3  
00B61727  mov         edx,2  
00B6172C  mov         ecx,1  
00B61731  call        @gMax@12 (0B6134Dh)  
00B61736  mov         dword ptr [nResult],eax  
	return 0;
00B61739  xor         eax,eax  
}
&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위 예제의 디스어셈블리 (아래 코드)를 보면 왼쪽 첫 번째, 두 번째 인수인 1과 2는 &lt;b&gt;각각 ECX, EDX 레지스터로 전달&lt;/b&gt;되고 오른쪽 첫 번째인 3은 스택에 Push 되었다. 그리고 __stdcall과 마찬가지로 호출자 함수에서 스택을 정리하는 코드도 보이지 않는다.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* C++에는 이 세 가지 외에 '__thiscall'이란 함수 호출 규칙이 하나 더 있다. 이 호출 규칙은 객체의 멤버함수(method)를 호출하는 것에 관련된 호출 규칙이다. 존재한다는 사실만 일단 알아두자. */&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font color=&quot;#2f9d27&quot;&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;/* 또한 우리가 이렇게 일일이 호출 규칙을 정해줄 일은 거의 없다고 봐도 된다. 컴파일러가 알아서 최적화를 시켜주기 때문이다. */&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;</description>
      <category>Develop Story/C</category>
      <category>calling convention</category>
      <category>cdecl</category>
      <category>fastcall</category>
      <category>stdcall</category>
      <category>__stdcall</category>
      <category>레지스터</category>
      <category>스택</category>
      <category>함수호출규칙</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/77</guid>
      <comments>https://mattlee.tistory.com/77#entry77comment</comments>
      <pubDate>Fri, 25 Aug 2017 09:57:19 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;셸 정렬(shell sort)&amp;gt; 기본 개념 및 알고리즘</title>
      <link>https://mattlee.tistory.com/76</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 셸 정렬 개념 및 원리&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;셸 정렬(shell sort)&lt;/b&gt;은 Donald L. Shell 이 제안한 방법으로 &lt;b&gt;삽입 정렬이 어느 정도 정렬 되어 있는 배열에 대해서는 대단히 빠르다는 점을 이용&lt;/b&gt;해 만든 방법이다. 셸 정렬은 삽입 정렬의 시간 복잡도 $O(n^2)$보다 빠르다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;삽입 정렬의 문제점은 요소들일 삽입될 때, 이웃한 위치로 한 칸씩만 이동한다는 점이다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 제 블로그에 삽입 정렬로&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;검색하시면 관련 설명과 알고리즘을 확인해보실 수 있습니다. 삽입 정렬은 for 루프를 이용해 인접한 위치부터 한 칸씩 이동하며 삽입할 위치를 탐색하므로 만약 삽입할 원소가 들어갈 자리가 멀리 떨어져 있다면 한 칸씩 이동하는 설계 때문에 불필요하게 많은 반복과 비교를 해야&amp;nbsp;한다는 단점이 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;셸 정렬에서는 &lt;b&gt;요소들이 멀리 떨어진 위치로 이동할 수 있다는 장점&lt;/b&gt;이 있다. 이런 것이 가능한 이유는 &lt;b&gt;셸 정렬이 전체의 배열(리스트)을 한 번에 정렬하지 않는다는 점 때문&lt;/b&gt;이다. 대신 먼저 정렬해야 할 리스트를 일정한 기준에 따라 분류하여 연속적이지 않은 &lt;b&gt;여러 개의 부분 리스트&lt;/b&gt;를 만들고,&lt;b&gt; 각 부분 리스트를 삽입 정렬을 이용하여 정렬&lt;/b&gt;한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;실제로 여러 개의 부분 리스트가 생기고 이것들을 병합하는 것이 아니라, &lt;b&gt;단순히 gap 값으로 간격을 주어 부분 리스트가 만들어진 것처럼 구현&lt;/b&gt;한다. 하나의&amp;nbsp;단계에서 모든 부분 리스트가 정렬이 되면 셸 정렬은 다시 전체 리스트를&amp;nbsp;더 적은 개수의 부분 리스트로 만든 후에 알고리즘을 되풀이한다. 이러한&amp;nbsp;과정은 &lt;b&gt;부분 리스트의 개수가 1이 될 때까지 되풀이&lt;/b&gt;된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;부분 리스트를 구성할 때는 주어진 리스트의 각 $k$번째 요소를 추출하여 만든다. 이 k를 우리는 간격(gap)이라 부른다. 셸 정렬에서는 각 단계별로 gap을 줄여가면서 수행 과정이 반복되므로 하나의 부분 리스트에 속하는 레코드들의 개수는 증가된다. gap이 1이 될 때까지 반복 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 셸 정렬 예시&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;예를 들어 &lt;b&gt;원소가 (11, 9, 7, 21, 5, 4, 23, 2, 1, 14, 16)로 구성되어 있는 크기 11의 배열&lt;/b&gt;이 있다고 했을 때 셸 정렬 적용하는 과정을 아래의 표와 함께 살펴보자. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 직접 표를 보며 손으로 써 보며 따라가는 것이 좋은 공부법이다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 640px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9930E133599ECFA105&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9930E133599ECFA105&quot; width=&quot;640&quot; height=&quot;427&quot; filename=&quot;셸 정렬 shell sort.PNG&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;첫째로 먼저 gap을 설정을 해야하는데 &lt;b&gt;gap은 보통 배열(리스트)의 크기를 2로 나눠 사용&lt;/b&gt;한다. gap은 홀수로 다루는 것이 성능에 더 좋은 영향을 끼친다는 연구 결과를 토대로 gap이 짝수라면 1을 더해서&amp;nbsp;짝수로 만들어준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;&lt;b&gt;배열의 크기는 11이므로 첫 gap 값은 5로 설정&lt;/b&gt;된다. 입력 배열의 각 5 번째 요소를 추출하여 부분 배열(리스트)을 만든다는 생각으로 표를 살펴본다.&lt;b&gt; (10, 3, 16) &lt;/b&gt;으로 구성된 부분 배열1,&lt;b&gt; (8, 22)&lt;/b&gt; 로 구성된 부분 배열2, ... ,&lt;b&gt; (4, 15) &lt;/b&gt;로 구성된 부분 배열 5 이렇게 총 5개의 부분배열이 추출된다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 각 인덱스에 5를 더한 인덱스에 해당하는 값들로 구성되어 있음을 알 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;추출된 부분 배열을 삽입 정렬 알고리즘으로 정렬하면 그 아래에 있는 정렬 후 부분리스트가 등장하게 된다. 그리고 이 &lt;b&gt;정렬 된 부분리스트 들을 합치면 정렬 후 전체배열 항목이 등장&lt;/b&gt;한다. 아직 완전히는 아니지만 그래도 어느 정도 정렬이 되었음을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;위에서 언급했다시피 실제로 부분 리스트들을 여러 개 만들어서 하는 것이 아니라 &lt;b&gt;단지 gap 값만 변화시켜 가며 삽입 정렬을 시행하는 것 뿐이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;셸 정렬의 첫 번째 단계가 끝나면 비슷한 방식으로 &lt;b&gt;다시 부분리스트를 구성&lt;/b&gt;하는데 이 때도 &lt;b&gt;기존의 gap 값에 2를 나눈 것&lt;/b&gt;을 간격으로 사용한다. 마찬가지로&lt;b&gt; 짝수일 경우 홀수값으로 gap 값을 설정한 후 진행&lt;/b&gt;한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 1을 더하는 것으로 홀수를 만들어준다. 이렇게 하는 것이 성능에 더 도움이 된다고 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 셸 정렬의 구현 및 알고리즘&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;외부 for문은 &lt;b&gt;gap 값을 절반씩 줄이는 기능&lt;/b&gt;을 수행하면서 각 부분 리스트에 대하여 일정한 간격으로 떨어져 있는 요소들을 삽입 정렬하는&lt;b&gt; gap_insertion_sort&lt;/b&gt; 를 호출하였다. 만약 &lt;b&gt;gap 값이 짝수라면 1을 더해줌&lt;/b&gt;으로써 홀수로 만들어주는 작업도 추가했다.&amp;nbsp;&lt;b&gt;gap_insertion_sort 함수는 기존의 삽입 정렬 알고리즘과 동일&lt;/b&gt;하다. 단지 숫자만 몇 개 바뀌었을 뿐이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: cpp;&quot;&gt;/*************************************************
 ** 셸 정렬과 삽입 정렬 (shell sort &amp;amp; insertion sort)
*************************************************/

int gap_insertion_sort(int list[], int first, int last, int gap);

// 셸 정렬 알고리즘
int shell_sort(int list[], int n)	// n = size
{
	// gap과 내부 반복을 위한 j를 변수로 선언
	int gap, j;

	// 초기 gap 값은 배열의 크기 n을 2로 나눈 값을 사용하며
	// 각 단계 별로 2를 나눠간다.
	for (gap = n/2; gap &amp;gt; 0; gap /= 2)
	{
		// 짝수일 경우 1을 더해주는 것이 성능에 더 도움이 된다.
		if (gap % 2 == 0)
			gap++;

		// j는 각 부분리스트의 시작인덱스 값이다.
		// j가 gap 이전까지만 가는 건 시작 인덱스 값과 gap 값만 알면
		// 배열의 끝까지 갈 수 있기 때문으로 실제 그 과정을
		// 표를 보고 그림을 그려가며 살펴보면 쉽게 알 수 있다.
		for (j = 0; j &amp;lt; gap; j++)
			gap_insertion_sort(list, j, n - 1, gap);
	}
}

// 시작 인덱스 first 부터 시작하는 부분리스트를 구성해 삽입 정렬을 시행한다.
int gap_insertion_sort(int list[], int first, int last, int gap)
{
	int i, j, key;

	// 삽입 정렬에서도 첫 번째 원소는 정렬을 할 필요가 없으므로
	// 그 다음 인덱스 값을 key값으로 설정해줬기 때문에 초기값은
	// first + gap이다.
	for (i = first + gap; i &amp;lt;= last; i += gap)
	{
		// 각 반복별로 인덱스 i값에 gap을 더해줌으로써 부분 리스트 삽입 정렬을 구현
		key = list[i];

		// 키 값 이전의 배열의 값들을 조사하면서 key값이 들어갈 위치를 찾는다.
		for (j = i - gap; j &amp;gt;= first &amp;amp;&amp;amp; list[j] &amp;gt; key; j -= gap)
		{
			// 마찬가지로 각 반복별로 1을 감소시키는 것이 아닌 gap을 감소시킴으로써
			// 부분리스트의 삽입 정렬을 구현한다.
			list[j + gap] = list[j];
		}
		list[j + gap] = key;
	}
}
 

/*************************************************
 ** End Line
*************************************************/
&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 셸 정렬의 시간 복잡도&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;삽입 정렬에 비해 &lt;b&gt;셸 정렬은 아래와 같은 장점&lt;/b&gt;이 있다.&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;연속적이지 않은 부분 리스트에서 자료의 교환을 진행하여 &lt;b&gt;더 큰 거리를 이동&lt;/b&gt;한다. 기존의 삽입 정렬에서는 한 칸씩 이동하며 비교를 하여 key 값의 자리를 찾았기 때문에 먼 거리를 이동할 경우 그만큼 반복 비교 연산이 많이 일어나는 단점이 있었다.&lt;br /&gt;&amp;nbsp;더 큰 거리를 이동함으로써 &lt;b&gt;교환되는 요소들이 삽입 정렬보다는 최종 위치에 더 가까이 있을 가능성이 더 높아진다.&lt;/b&gt; 최종 자리를 더 빨리 찾아감으로써 &lt;b&gt;연산의 횟수를 줄이는 데 기여할 수 있다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;삽입 정렬은 &lt;b&gt;어느 정도 정렬이 된 배열에서 더 빠르게 작동&lt;/b&gt;한다는 것을 우리는 알고 있다. 이 점을 토대로 우리는 한 번에 정렬하는 것이 아니라 &lt;b&gt;부분 리스트를 구성해 조금씩 정렬된 상태를 만들어가는 것&lt;/b&gt;이므로 삽입 정렬에 비해&lt;b&gt; 속도가 점점 더 빠르게 &lt;/b&gt;수행된다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;실험적인 연구를 통하여 증명된 셸 정렬의 시간 복잡도는 대략 최악의 경우에는 $O(n^2)$이지만 평균적인 경우에는 $O(n^{1.5})$로 나타난다.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/Data Structure &amp;amp; Algorithm</category>
      <category>Gap</category>
      <category>Insertion Sort</category>
      <category>Shell Sort</category>
      <category>부분 리스트</category>
      <category>삽입 정렬</category>
      <category>셸 정렬</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/76</guid>
      <comments>https://mattlee.tistory.com/76#entry76comment</comments>
      <pubDate>Thu, 24 Aug 2017 22:54:44 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;페이스북 개발자와의 만남&amp;gt;</title>
      <link>https://mattlee.tistory.com/75</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 짧은 소감&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;대학교&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;친구가 알고 있는 페이스북 개발자분께 대학생들을 위한&amp;nbsp;세미나 요청을 했는데, 흔쾌히 수락해주셨다며 세미나를 주최했다. 당연 나는 해외 취업 뿐만 아니라 업계현황 등이 궁금했기에 가장 먼저 참여하겠다는 의사를 밝혔다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;그리고 오늘 다니고 있는&amp;nbsp;대학교에서 열린 페이스북 개발자와 함께하는 세미나에 참여했다. 그 분이 말씀해주신 것들을 토대로 개발자를 꿈꾸는 분들에게 도움이 됐으면 좋겠다는 생각에 이렇게 바로&amp;nbsp;포스팅을 작성하게 됐다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 개발과 관련 있는 혹은 없는 것들에 관한 여러 가지 조언&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;1. 프로그래밍 언어는 별로 중요하지 않다.&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;실제 회사 업무에서는 자기가 쓰는 언어가 아니었을지라도 한 달 안에 알아서 숙지해야할 경우가 얼마든지 생길 수 있다. 따라서 언어를 얼마나 많이 아느냐가 아닌 언어를 얼마나 빠르게 습득할 수 있느냐가 더 중요한 덕목이라고 할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;따라서 언어의 문법 공부 등에 힘을 쓰기 보다는 실제 개발 혹은 사고력에 도움이 되는 알고리즘 공부 등을 하는 것이 더 도움이 된다고 생각한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;/* 개발자분의 경우 페이스북에 입사하자마자 한 번도 해보지 않은 파이썬을 다루기 시작했다고 합니다. 언어를 얼마나 많이 아는 것이 아니라 언어의 특징을 얼마나 빨리 캐치하고 사용할 수 있는지, 즉 기본기가 중요하다고 하셨습니다. */&lt;/span&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;2. 실무적인 경험을 많이 쌓아라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;국내 뿐만 아니라 해외에서도 &lt;b&gt;실무경험은 굉장히 중요&lt;/b&gt;하다. 인턴을 가급적이면 꼭 하라고 추천해주고 싶다. 어떤 IT 직종을 가더라도 인턴 경력이 제일 중요하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;/* 개발자분 본인도 아마존 인턴부터 시작하여 아마존, 마이크로소프트, 지금의 페이스북으로 오게 되었다고 합니다. */'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;3. 자격증을 공부할 거라면 AWS Solution Architect 자격증을 알아봐라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;요즘 입사시험의 구성은 코딩 60% + 디자인 40%가 추세라고 한다. 여기서 말하는 디자인이란 &lt;b&gt;'Objected Oriented Design'&lt;/b&gt; 즉, &lt;b&gt;객체지향적 설계&lt;/b&gt;를 의미한다. 예를 들면 &lt;b&gt;facebook 메신저를 설계해봐라&lt;/b&gt;, &lt;b&gt;검색포탈의 자동완성기능은 어떻게 설계할래?&amp;nbsp;&lt;/b&gt;가 면접질문인 것이다. 어떤 요소(객체)들이 필요하고 그것들을 어떻게 연결해서 동작하게 할 것인지 등의 구조적인 사고가 필요하다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;&lt;b&gt;AWS Solution Architect&lt;/b&gt; 자격증의 경우 객체지향에 대한 개념과 이해도를 높일 수 있다는 측면에서 추천할만 하다. 정보처리기사 보다 이 자격증을 공부하는 걸 더 추천한다. 요즘 제일 핫한 자격증이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;4. 구글의 개발자가 한국의 개발자보다 더 실력이 뛰어난 것은 결코 아니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;실제로 구글이나 페이스북에 일하게 된 사람의 대부분은 누군가의 추천으로 면접단계에서 발탁이 된 사례가 많다고 한다. 서류전형부터 시작해서 자신의 포트폴리오로 검증 받고 올라온 사람이 많지 않다는 것이다. 연봉이 1억 5천만원 이라고 해서 한국개발자보다 월등히 뛰어난 것이 결코 아니다. 그저 어쩌다 보니 그런 자리에 가 있는 것이다 라고 생각하면 된다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;즉 구글 같은 기업에는 7살부터 코딩한 사람만 들어갈 수 있겠지? 라는 생각은 하지 않아도 된다. 자신이 원하는&amp;nbsp;기업에서 꼭 일해보고 싶다면 입사지원서를 넣는 것보다 원하는 회사에 지인을 만들어 추천을 받아 면접단계까지 바로 가는 것이 더 확률이 높다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;5. 개발자로서 안정을 꿈꾸지 마라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;당장 50년 뒤에 네이버나 카카오가 건재할지 생각해봐라. 아무도 예측할 수 없다. 10년 뒤만 잡아도 모른다. 다니고 있는 회사가 하루 사이에 없어질 수 있다. 개발자 자체가 안정적인 직장은 아니기에, 차라리 대박 하나를 노리는 자세가 더 낫다. 개발자로서의 실력을 키우는 건 물론이고 자신만의 길을 개척하는 데도 (창업이든 뭐든) 신경을 쓰는 게 좋다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;6. IT 개발자로서 취업을 생각하고 있다면 개발로 먹고 사는 회사를 가라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;현대 백화점, 현대 홈쇼핑 등 개발이 주가 아닌 곳에서 개발을 하게 되면 어떤 일이 발생할까? 개발자가 대우를 받기 어렵다는 걸 금방 눈치챌 것이다. 배달의 민족, 네이버, 카카오 등 개발이 주가 되고 밥줄이 되는 회사를 가야 개발자가 대우를 받지, 개발 따위 외주로 맡겨버리면 되지 뭐 라는 회사엔 들어가면 제대로 된 대우를 받기 힘들다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;7. 개발자 연봉&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;보통 실리콘 밸리에서 5년차 개발자들 연봉은 1억 3천만원에서 1억 5천만원 정도 한다. 단순히 액수만 들으면 와~ 하겠지만, 세금이 40%라는 점과 집세 등 물가가 장난 아니게 비싸다는 점 등을 고려하면 실제 수령액은 절반도 안되는 경우가 많다. 물론 그럼에도 많은 거겠지만..&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;8. 저녁이 있는 삶을 원하기 전에 저녁시간에 뭘 할지를 생각하라&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;실제 개발자들을 보면 알겠지만, 여기선 여가시간이 있어도 남아서 일을하는 사람들이 있다. 기껏 집에 있어봐야 티비 보고 잠드는 게 고작이기 때문에. 따라서 저녁이 있는 삶을 막연히 바라기 보단 뭐가 하고 싶은지를 생각하는 게 먼저인 것 같다. 마찬가지로 30세 전까지 100억 만들기 등의 목표를 세우는 것보다 100억이 있으면, 돈이 있으면 무엇을 할까를 고민하는 것이 우선이 되야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;9. 마치며&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;해외 취업을 하고 싶다고 하기 전에 왜 하고 싶은지를 명확히 생각해봐야 한다. 해외에 사는 건 높은 연봉, 좋은 문화 등과 같이 장점만 있는 것이 결코 아니다. 그만한 외로움도 동반되기 때문이다. 따라서 본인이 정말 뭘 원하는지, 어디에 더 가치를 두는지 등을 생각해보고 결정했으면 좋겠다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Essay &amp;amp; Memo/Daily</category>
      <category>개발자 연봉</category>
      <category>개발자 취업</category>
      <category>실리콘 밸리 연봉</category>
      <category>실리콘밸리</category>
      <category>페이스북 개발자</category>
      <category>페이스북 면접</category>
      <category>페이스북 입사시험</category>
      <category>해외 개발자</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/75</guid>
      <comments>https://mattlee.tistory.com/75#entry75comment</comments>
      <pubDate>Mon, 21 Aug 2017 19:47:24 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;안드로이드 뷰, 뷰 그룹, 레이아웃&amp;gt; 개념 정리</title>
      <link>https://mattlee.tistory.com/74</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;/* 본 게시물은 '핵심만 골라 배우는 안드로이드 스튜디오 &amp;amp; 프로그래밍(Android Studio 2 Development Essentials) | 닐 스미스 지음' 의 내용을 토대로&amp;nbsp;작성되었습니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 11pt; color: rgb(47, 157, 39);&quot;&gt;*/&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 서로 다른 안드로이드를 장치를 위한 디자인&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;애플리케이션의 사용자 인터페이스는 &lt;b&gt;가능한 한 많은 종류의 화면 크기에서 제대로 보일 수 있도록&lt;/b&gt; 신중하게 디자인되어야 한다. 이때 가장 중요한 것은 &lt;b&gt;서로 다른 장치에서 레이아웃의 크기 조정이 올바르게&lt;/b&gt; 될 수 있게 하는 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;안드로이드 기반의 스마트폰과 태블릿은 사용자가 &lt;b&gt;세로(portrait)와 가로(landscape) 방향 모두를 사용할 수 있다&lt;/b&gt;는 것이다. 따라서 디자인이 잘된 사용자 인터페이스라면 모든 방향에서 그런 변경에 적응할 수 있어야 하고, 사용 가능한 화면 공간을 잘 활용하기 위한 레이아웃을 조정할 수 있어야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 뷰와 뷰 그룹&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;안드로이드 사용자 인터페이스의 모든 요소는 &lt;b&gt;View 클래스(android.view.View)의 서브 클래스&lt;/b&gt;다. 안드로이드 &lt;b&gt;SDK&lt;/b&gt;에서는 사용자 인터페이스를 구성하는 데 사용할 수 있는 여러 뷰 클래스를 제공한다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// Button, CheckBox, ProgressBar, TextView 클래스 등&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;그런 뷰들은 &lt;b&gt;위젯(widget) 또는 컴포넌트(component)&lt;/b&gt; 라고도 한다. &lt;b&gt;SDK&lt;/b&gt;에 제공되지 않는 위젯이 필요할 때는 &lt;b&gt;기존 뷰 클래스의 서브 클래스를 만들거나 또는 View 클래스로부터 상속받는 아예 새로운 컴포넌트를 생성하여 새로운 뷰를 만들 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;또한 뷰는 &lt;b&gt;여러 개의 다른 뷰로 구성될 수 있으며 복합 뷰(composite view)&lt;/b&gt;라고도 한다. 이러한 뷰들은 &lt;b&gt;안드로이드 ViewGroup 클래스(android.view.ViewGroup)로부터 상속받는다.&lt;/b&gt; &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// ViewGroupd 클래스 자신은 View의 서브 클래스다.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;예를 들면 &lt;b&gt;RadioGroup&lt;/b&gt;이 있다. 이것은 &lt;b&gt;여러 개의 RadioButton 객체들을 포함&lt;/b&gt;하여 &lt;b&gt;항상 하나의 버튼만이 선택될 수 있게&lt;/b&gt; 한 것이다. 구조적인 관점에서 &lt;b&gt;복합 뷰는 다른 뷰(자식 뷰(child view))들을 포함할 수 있는 하나의 부모 뷰(parent view)&lt;/b&gt;로 구성된다.&lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt; // RadioGroup이 RadioButton 객체들을 포함하듯이.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;그리고 &lt;b&gt;그 부모 뷰&lt;/b&gt;는 &lt;b&gt;ViewGroup 클래스로부터 상속&lt;/b&gt;받으며, &lt;b&gt;컨테이너 뷰(container view) 또는 루트 요소(root element)라고도 한다. &lt;/b&gt;또 다른 ViewGroup 기반 컨테이너 뷰로 레이아웃 매니저(layout manager)가 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 안드로이드 레이아웃 매니저&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;안드로이드 SDK에서는 레이아웃(layout)이라고 하는 뷰들도 제공한다. 레이아웃은 컨테이너 뷰이므로 ViewGroup의 서브 클래스이며, 자식 뷰들은 화면에 위치시키는 방법을 제어하는 목적으로 설계되었다. 안드로이드 SDK에는 아래의 레이아웃 뷰들이 포함되어 있으며, 이것들은 안드로이드 사용자 인터페이스 디자인 내부에서 사용될 수 있다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;LinearLayout &lt;/b&gt;- 선택된 방향(수직 또는 수평)에 따라 &lt;b&gt;하나의 행이나 열에 자식 뷰를 배치&lt;/b&gt;한다. 각 자식 뷰에는 &lt;b&gt;가중치&lt;/b&gt;(weight value)를 설정할 수 있다. 이것은 해당 자식 뷰가 다른 자식 뷰에 비해 &lt;b&gt;얼마나 많은 레이아웃 공간을 차지할 것인지&lt;/b&gt;를 결정하는 값이다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;TableLayout &lt;/b&gt;- 자식 뷰들을 &lt;b&gt;격자 형태의 행과 열로 배치&lt;/b&gt;한다. 하나의 테이블에 있는 &lt;b&gt;각 행은 TableRow 객체&lt;/b&gt;로 나타내며, &lt;b&gt;각 셀의 뷰 객체를 포함&lt;/b&gt;한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;FrameLayout &lt;/b&gt;- 일반적으로 &lt;b&gt;하나의 뷰를 보여주기 위해 화면의 영역을 할당&lt;/b&gt;하는 것이 FrameLayout의 목적이다. 여러 개의 자식 뷰들이 &lt;b&gt;추가될 때&lt;/b&gt;는 기본적으로 &lt;b&gt;레이아웃 영역의 왼쪽 위 모서리를 기준으로 다른 뷰 위에 겹쳐서&lt;/b&gt; 나타난다.&lt;br /&gt;&amp;nbsp;따라서 각 자식 뷰들의 위치를 달리하고자 할 때는 각 자식 뷰에 &lt;b&gt;그래비티&lt;/b&gt;(gravity) 값을 설정하면 된다. 예를 들어, 어떤 자식 뷰에 &lt;b&gt;center_vertical 그래비티 값을 설정&lt;/b&gt;하면 &lt;b&gt;그 자식 뷰는 FrameLayout 뷰 영역의 수직 방향 중앙&lt;/b&gt;에 위치하게 된다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;RelativeLayout &lt;/b&gt;- &lt;b&gt;가장 강력하고 유연한 레이아웃 매니저&lt;/b&gt;일 것이다. 이 레이아웃은 자식 뷰가 다른 자식 뷰와 자신을 포함하는 레이아웃 뷰 모두에 관련해서 자신에 &lt;b&gt;지정된 마진(margin) 등에 따라 상대적으로 배치될 수 있게 해준다.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;예를 들어 자식 뷰 A는 자신을 포함하는 RelativeLayout 뷰의 수직과 수평 중앙에 위치하게 구성할 수 있다. 반면에 자식 뷰 B도 레이아웃 뷰 내부에 수평적으로 중앙에 있지만, 자식 뷰 A의 맨 위보다 30픽셀 높게 위치시킬 수 있다. 자식 뷰 A의 위치와 관련해서 상대적으로 자식 뷰 B의 수직적인 위치를 설정할 수 있기 때문이다.&lt;br /&gt;&amp;nbsp;&lt;b&gt;다양한 화면 크기와 방향에서 동작해야 하는 사용자 인터페이스를 디자인할 때 RelativeLayout 매니저가 사용될 수 있다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;AbsoluteLayout &lt;/b&gt;- 자식 뷰가 자신을 포함하는 레이아웃 뷰의 &lt;b&gt;특정 XY 좌표에 위치할 수 있게 해준다. &lt;/b&gt;이 레이아웃은 사용하지 않는 편이 낫다. 화면 크기나 방향의 변화에 대응하는 &lt;b&gt;유연성이 부족&lt;/b&gt;하기 때문이다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 상대적으로 위치를 설정한 것과는 달리 딱 그 좌표에 위치하게끔 하는 기법으로, 레이아웃의 변화에 따라서 알아서 변화하거나 하는 등의 기능은 기대할 수 없다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;GridLayout &lt;/b&gt;- GridLayout은 비교적 새로운 레이아웃 매니저로서 안드로이드 4.0의 일부로 소개되었다. GridLayout 인스턴스는 &lt;b&gt;행과 열이 교차되는 셀을 포함하는 격자(grid)를 구성&lt;/b&gt;하며,&lt;b&gt; 보이지 않는 라인들로 분할&lt;/b&gt;된다. 그다음에 &lt;b&gt;자식 뷰들이 셀에 위치&lt;/b&gt;한다.&lt;br /&gt;&amp;nbsp;자식 뷰들은 &lt;b&gt;수평과 수직 모두 여러 개의 셀로 구성될 수 있다. &lt;/b&gt;GridLayout의 컴포넌트들 간격은 &lt;b&gt;Space 뷰&lt;/b&gt;라는 특별한 타입의 뷰를 인접 셀에 두어서 구현하거나 &lt;b&gt;마진 매개변수를 설정&lt;/b&gt;하여 구현할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;CoordinatorLayout &lt;/b&gt;- &lt;b&gt;안드로이드 5.0&lt;/b&gt;의 안드로이드 디자인 지원 라이브러리의 일부로 소개되었다. CoordinatorLayout은 애플리케이션 &lt;b&gt;화면 위에 있는 앱 바(app bar)의 모습과 기능을 다른 뷰 요소와 함께 사용하기 위해 특별히 설계&lt;/b&gt;되었다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;안드로이드 스튜디오에서 새로운 프로젝트를 생성할 때 &lt;b&gt;Basic Activity 템플릿을 선택하면 CoordinatorLayout 인스턴스를 사용해서 레이아웃의 부모 뷰가 구현&lt;/b&gt;된다.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&amp;nbsp;안드로이드 애플리케이션의 사용자 인터페이스에서 레이아웃을 사용할 때 주의해야할 점은 &lt;b&gt;레이아웃이 다른 레이아웃 내부에 중첩될 수 있어서&lt;/b&gt; 어떤 복잡한 수준의 사용자 인터페이스 디자인도 생성할 수 있다는 점이다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 뷰 계층 구조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;hr&gt;&lt;p&gt;&amp;nbsp;사용자 인터페이스의 &lt;b&gt;각 뷰는 화면의 직사각형 영역&lt;/b&gt;을 나타낸다. 뷰는 그 직사각형 안에 &lt;b&gt;그려지는 것에 대한 책임&lt;/b&gt;이 있으며, 화면의 뷰 영역에서 발생하는 &lt;b&gt;이벤트(터치 등)에 응답해야할 책임&lt;/b&gt;도 있다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;b&gt;사용자 인터페이스 화면은 뷰 계층 구조로 구성&lt;/b&gt;된다. 그리고 뷰 계층 구조는 &lt;b&gt;계층 구조 트리(tree)의 맨 위에 위치한 루트(root) 뷰와 그 밑의 가지에 위치한 자식 뷰로 되어 있다.&lt;/b&gt; 컨테이너 뷰의 자식 뷰는 자신의 부모 뷰 위에 포개져서 화면에 나타나되, &lt;b&gt;부모 뷰의 화면 영역 경계 안에만&lt;/b&gt;으로 그 범위가 제한된다. 아래의 사용자 인터페이스를 살펴보면서 이해를 해보자.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 437px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E9FB3359996EB007&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E9FB3359996EB007&quot; width=&quot;437&quot; height=&quot;475&quot; filename=&quot;사용자 인터페이스 예시.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&amp;nbsp;이 사용자 인터페이스에서는 &lt;b&gt;버튼과 체크 상자 뷰가 위치하는 방법을 제어하는 레이아웃 뷰를 포함&lt;/b&gt;한다. 아래의 그림은 위와 동일한 사용자 인터페이스를 다른 관점으로 보여준다. 즉, &lt;b&gt;자식 뷰들과 관련된 레이아웃 뷰들을 나타내고 있다.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D86933599970C61B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D86933599970C61B&quot; width=&quot;400&quot; height=&quot;447&quot; filename=&quot;RelativeLayout.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&amp;nbsp;사용자 인터페이스 화면은&lt;b&gt; 맨 위에 루트 뷰를 갖는 뷰 계층 구조의 형태&lt;/b&gt;로 구성된다. 따라서 위의 그림은 &lt;b&gt;아래와 같이 뷰 트리 형태&lt;/b&gt;로도 나타낼 수 있다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 850px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C77E335999724037&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C77E335999724037&quot; width=&quot;850&quot; height=&quot;325&quot; filename=&quot;뷰 계층 구조.PNG&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;사용자 인터페이스를 구성하는 &lt;b&gt;다양한 뷰들 간의 관계를 가장 분명하게 보여주는 것이 위와 같은 뷰 계층 구조 다이어그램&lt;/b&gt;(diagram)이다. 사용자 인터페이스가 화면에 보일 때 &lt;b&gt;안드로이드 런타임은 뷰 계층 구조를 순회&lt;/b&gt;한다. 이때 &lt;b&gt;루트 뷰에서 시작&lt;/b&gt;해서 트리의 아래로 내려가면서 각 뷰를 나타낸다.&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;# 요약&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 14.6667px;&quot;&gt;&lt;hr&gt;&lt;p&gt; 안드로이드 애플리케이션의 &lt;b&gt;사용자 인터페이스 화면에 있는 각 요소는 뷰&lt;/b&gt;이며, 모든 뷰는 &lt;b&gt;android.view.View 클래스의 서브 클래스&lt;/b&gt;다. &lt;b&gt;각 뷰는 장치 화면의 직사각형 영역&lt;/b&gt;을 나타내며, 그 직사각형 안에 나타나는 것에 대한 책임이 있고 또한 뷰의 경계 안에서 발생하는 이벤트(터치 등)를 처리하는 책임도 있다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;여러 뷰를 결합시켜 하나의 복합 뷰(composite view)를 만들 수 있다. 복합 뷰 안에 있는 것들은 &lt;b&gt;컨테이너 뷰(container view)의 자식들&lt;/b&gt;이다. 그리고 &lt;b&gt;컨테이너 뷰는 android.view.ViewGroup 클래스의 서브 클래스&lt;/b&gt;다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// ViewGroup 자신은 android.view.View의 서브클래스다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;사용자 인터페이스는 &lt;b&gt;뷰 계층 구조의 형태로 생성된 뷰들로 구성&lt;/b&gt;된다. 안드로이드 SDK에는 사용자 인터페이스를 만드는 데 사용될 수 있는, 미리 생성된 뷰들이 많이 있다. &lt;span style=&quot;color: rgb(47, 157, 39);&quot;&gt;// 텍스트 필드나 버튼과 같은 기본적인 컴포넌트들, 그리고 자식 뷰들의 위치를 제어하는 데 사용될 수 있는 다양한 종류의 레이아웃 매니저 등&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;만약 미리 제공되는 것들만으로 부족하다면 &lt;b&gt;커스텀 뷰&lt;/b&gt;를 만들 수도 있다. &lt;b&gt;기존 뷰에서 상속 및 결합&lt;/b&gt;시켜 만들거나 &lt;b&gt;android.view.View 클래스로부터 상속받는 완전히 새로운 뷰 클래스를 생성&lt;/b&gt;하면 된다.&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Develop Story/Android Studio</category>
      <category>AbsoluteLayout</category>
      <category>composite view</category>
      <category>CoordinatorLayout</category>
      <category>FrameLayout</category>
      <category>GridLayout</category>
      <category>LinearLayout</category>
      <category>RelativeLayout</category>
      <category>TableLayout</category>
      <category>View 클래스</category>
      <category>ViewGroup</category>
      <category>레이아웃 매니저</category>
      <category>복합 뷰</category>
      <category>안드로이드 레이아웃</category>
      <category>위젯</category>
      <category>컴포넌트</category>
      <author>wisecow</author>
      <guid isPermaLink="true">https://mattlee.tistory.com/74</guid>
      <comments>https://mattlee.tistory.com/74#entry74comment</comments>
      <pubDate>Sun, 20 Aug 2017 20:37:21 +0900</pubDate>
    </item>
  </channel>
</rss>