<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>최익필의 이름없는 블로그</title>
    <link>https://ikpil.tistory.com/</link>
    <description>기록, 그리고 생각</description>
    <language>ko</language>
    <pubDate>Wed, 6 May 2026 18:14:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>최익필</managingEditor>
    <image>
      <title>최익필의 이름없는 블로그</title>
      <url>https://t1.daumcdn.net/cfile/tistory/2648634254CFA1CD33</url>
      <link>https://ikpil.tistory.com</link>
    </image>
    <item>
      <title>자바 8 인 액션</title>
      <link>https://ikpil.tistory.com/1352</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20200331_002613581.jpg&quot; data-origin-width=&quot;2444&quot; data-origin-height=&quot;3182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rBVPO/btqC3p30K0y/Y5AzBizh1jWGgd8SDMuRp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rBVPO/btqC3p30K0y/Y5AzBizh1jWGgd8SDMuRp0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rBVPO/btqC3p30K0y/Y5AzBizh1jWGgd8SDMuRp0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrBVPO%2FbtqC3p30K0y%2FY5AzBizh1jWGgd8SDMuRp0%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20200331_002613581.jpg&quot; data-origin-width=&quot;2444&quot; data-origin-height=&quot;3182&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이번에 새로 입사한 회사에서 자바를 사용하게 되어, 다음 책들을 먼저 보았습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 뇌를 자극하는 자바 프로그래밍&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 자바의 정석&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;- 자바의 신&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다 본 뒤 이펙티브 자바 3판을 보는데, 모르는 것이 많아 일단 접었습니다.&lt;/p&gt;
&lt;p&gt;그리고 &quot;자바 8 인 액션&quot; 책을 보았습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;감히 제가 평가할 수 있을지 모르겠으나, 명서인지 아닌지 갈릴 수 있으나 최소 양서임은 분명합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이미 다른 언어로 프로그래밍을 해 왔던 터라 개념들은 알고 있었으나, 자바의 관점에서는 몰라 헤매고 있었기 때문에, 이 책이 얼마나 귀중한지 느꼈던 것 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 책은 다음을 설명합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;- 자바에서의 람다&lt;/p&gt;
&lt;p&gt;- 스트림&lt;/p&gt;
&lt;p&gt;- 병렬 스트림&lt;/p&gt;
&lt;p&gt;- 리팩토링, 테스팅, 디버깅&lt;/p&gt;
&lt;p&gt;- 인터페이스의 디폴트 메서드&lt;/p&gt;
&lt;p&gt;- Optional&amp;lt;T&amp;gt;&lt;/p&gt;
&lt;p&gt;- CompletableFuture&lt;/p&gt;
&lt;p&gt;- LocalDate, LocalTime, Instant, Duration, Period&lt;/p&gt;
&lt;p&gt;- 함수형 프로그래밍 기법, OOP, 자바8과 스칼라비교 &amp;lt;-- 어려움&lt;/p&gt;
&lt;p&gt;- 자바의 미래 &amp;lt;-- 어려움&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;후반부에 갈수록 매우 어려워지는데 다시 한번 봐야겠습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>책 정리/독후감</category>
      <category>자바 8 인 액션</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1352</guid>
      <comments>https://ikpil.tistory.com/1352#entry1352comment</comments>
      <pubDate>Tue, 31 Mar 2020 00:39:35 +0900</pubDate>
    </item>
    <item>
      <title>가장 빨리 만나는 스프링부트</title>
      <link>https://ikpil.tistory.com/1351</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20200330_235734820.jpg&quot; data-origin-width=&quot;5312&quot; data-origin-height=&quot;2988&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vubKG/btqC6QeJPhU/CEWS8LkmlXmkv1dkLDBzXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vubKG/btqC6QeJPhU/CEWS8LkmlXmkv1dkLDBzXK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vubKG/btqC6QeJPhU/CEWS8LkmlXmkv1dkLDBzXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvubKG%2FbtqC6QeJPhU%2FCEWS8LkmlXmkv1dkLDBzXK%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20200330_235734820.jpg&quot; data-origin-width=&quot;5312&quot; data-origin-height=&quot;2988&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스프링도 모르고, 스프링부트도 모르는 저 같은 사람에게 딱 맞는 책입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;깊이가 없고, 대충 따라할 수 있게 서술된 책이기 때문입니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;책의 내용은 대체로 DI, JPA, Bean, Log, Thymeleaf, Flyway, Spring Security, Unit Test 를 아주 짧게 설명합니다.&lt;br /&gt;그리고 바로 실습을 합니다. 보는데 한 3 ~ 5 시간이면 다 볼 수 있을 것 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 책을 보고 다른 책을 더 봐야겠습니다.&lt;/p&gt;</description>
      <category>책 정리/독후감</category>
      <category>스프링부트</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1351</guid>
      <comments>https://ikpil.tistory.com/1351#entry1351comment</comments>
      <pubDate>Tue, 31 Mar 2020 00:13:58 +0900</pubDate>
    </item>
    <item>
      <title>아널드 베넷의 하루 24시간 어떻게 살 것인가</title>
      <link>https://ikpil.tistory.com/1350</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;HowtoLiveon24HoursaDay.jpg&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;1031&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVRK0F/btqBS7cG8e3/c6NfYC1dDO27F5XmUDlCk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVRK0F/btqBS7cG8e3/c6NfYC1dDO27F5XmUDlCk0/img.jpg&quot; data-alt=&quot;하루 24시간 어떻게 살 것인가?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVRK0F/btqBS7cG8e3/c6NfYC1dDO27F5XmUDlCk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVRK0F%2FbtqBS7cG8e3%2Fc6NfYC1dDO27F5XmUDlCk0%2Fimg.jpg&quot; data-filename=&quot;HowtoLiveon24HoursaDay.jpg&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;1031&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하루 24시간 어떻게 살 것인가?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;책에 대해서&lt;/h3&gt;
&lt;p&gt;이 책은 다음과 같은 말로 시작 되고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&quot;특별한 사람이 아닌 한, 자신의 일에 대해서 그다지 정열을 불태우지 않는 것이 보통이다. 고작해야 '싫지는 않다'고 하는 정도다. 좀처럼 일에 뛰어들려 하지 않고, 시작할 때는 마지못해 하는 태도를 보인다. 그리고는 퇴근 시간이 될 때를 이제나저제나하고 목을 길게 뽑고 기다린다. 업무에 전력투구하는 일은 거의 없다.&quot;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 책은 조금이라도 지적 호기심이 있고, 하루하루 무엇인가 채워나가고 싶어하지만, 좀 처럼 잘 되지 않는 우리같은 살마들을 위해서 쓰여진 책입니다. 아놀드 베넷의 책인데, 저자가 누군지는 잘 모릅니다. 100년 전쯤 영국에서 최초 출판 되었고, 25년 전쯤 처음으로 우리나라에 번역된 책입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 책을 제가 분류 하자면, 자기 계발서 인듯 하면서, 생활 철학인듯 하기도 한, 수필(에세이)입니다. 책의 내용은&lt;/p&gt;
&lt;p&gt;생각을 조금 덜 하면서 읽어도 될 정도로 편하게 쓰여진 책입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인적인 생각/배운것 들&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;저녁 시간 쪼개기 보다 아침 시간 쪼개기&lt;/h4&gt;
&lt;p&gt;다들 알다 시피 시간은 미리 땡겨 쓸수 없으며, 저장 할 수도 없는 속성이 있습니다. 생각의 차이는 있겠지만, 누구에게나 하루가 24시간인건 이견이 없을 것입니다. 그래서 누구나 시간을 잘 활용해야 한다는 것을 알 것입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;대개의 사람들에게 시간을 잘 활용하는건 매우 불편하고 불쾌할 정도의 노력을 필요로 합니다. 야근이라도 하면, 엄두를 내기 힘들정도여서 개인적으로 아침 시간 쪼개기가 그나마 할만 합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사고 훈련&lt;/h4&gt;
&lt;p&gt;사고 훈련하는 방법에 대해서 설명 되는 부분이 있는데, 이 부분은 공감이 갔습니다. 방법은 생각하고 싶은 것은 특정한 시간 동안 반복하며 생각하는 방법입니다. 처음에는 가볍게 시작하는게 좋은데, 예를 들어 책의 한 구절이나 어제 있었던 일들등을 되새겨 보는 것이 좋습니다. 익숙해 지면 확장할 수 있 것 같지만, 사실 확장은 잘 안됩니다. ; )&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;에너지, 호기심, 안목, 편해지는 것들&lt;/h4&gt;
&lt;p&gt;사람마다 에너지를 채우는 방법들이 다르기 때문에, 자신의 에너지를 채우는 방법 한두가지는 알아두면 좋을것 같습니다. 이러한 에너지로 호기심있게 사물을 관찰하고, 인과관계를 깨닫게 될 때, 안목이 생길 수 있을 것 입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;무한이 있지는 않지만, 실패해도 내일 24시간 빳빳한 시간이 채워지므로, 다시 시작할 수도 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;:wq!&lt;/p&gt;</description>
      <category>책 정리/독후감</category>
      <category>시간 관리론</category>
      <category>아놀드 베넷</category>
      <category>하루24시간</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1350</guid>
      <comments>https://ikpil.tistory.com/1350#entry1350comment</comments>
      <pubDate>Wed, 12 Feb 2020 07:25:43 +0900</pubDate>
    </item>
    <item>
      <title>스프링 부트 코딩 공작소</title>
      <link>https://ikpil.tistory.com/1349</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;100%&quot; data-origin-width=&quot;5312&quot; data-origin-height=&quot;2988&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7obdR/btqA3dEAs7N/vEZ2TfjOFKcFlJUoHyBX2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7obdR/btqA3dEAs7N/vEZ2TfjOFKcFlJUoHyBX2k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7obdR/btqA3dEAs7N/vEZ2TfjOFKcFlJUoHyBX2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7obdR%2FbtqA3dEAs7N%2FvEZ2TfjOFKcFlJUoHyBX2k%2Fimg.jpg&quot; width=&quot;100%&quot; data-origin-width=&quot;5312&quot; data-origin-height=&quot;2988&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3&gt;이 책은&lt;/h3&gt;
&lt;p&gt;스프링 부트로 제작된 코드를 관리하게 돼서 보게 되었습니다. 스프링을 기본으로 알고 있다는 전제로 쓰인 책입니다. 책 후반부에 가면 여러 클라우드에 배포하는 방법과 부록들이 있습니다. 이 부분은 낭비라고 생각되었지만, 스프링 부트 시작과 유닛 테스트, 구성, 액추에이터 부분은 확실히 잘 설명한 책 같습니다.&lt;/p&gt;
&lt;h4&gt;유닛 테스트&lt;/h4&gt;
&lt;p&gt;테스트 코드를 작성할 때, 실제로 운용 중인 서버에서 테스트를 실행하는 방법이 제일 확실하지만 매 테스트마다 서버가 로드되는 시간이 있어 불편합니다. 이 부분에 대해서 스프링 부트에서는 어떻게 해결하고 있는지 설명하고 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;엑추에이터에 대해서&lt;/h4&gt;
&lt;p&gt;개발 및 배포 단계에서 운용 중인 앱의 상태 확인이 필요하다고 느꼈는데, 이 부분에 영감을 얻을 수 있었습니다. 여러 환경에서 운용되는 앱의 상태를 확인한다면, 개발 시간 낭비를 줄일 수 있다는 느낌도 들었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;:wq!&lt;/p&gt;</description>
      <category>책 정리/독후감</category>
      <category>스프링 부트 코딩 공작소</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1349</guid>
      <comments>https://ikpil.tistory.com/1349#entry1349comment</comments>
      <pubDate>Sun, 12 Jan 2020 15:32:04 +0900</pubDate>
    </item>
    <item>
      <title>데드락 디텍터(deadlock detector) : 순환대기(Circular wait) 제거</title>
      <link>https://ikpil.tistory.com/1348</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;말머리&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;코드 변경이 될 수 있으므로 되도록 링크로 가져 가시길 바라지만, 꼭 그렇게 하지 않으셔도 됩니다. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;6년 전쯤 저의 코드에서 데드락이 발생 된 적이 있었습니다. 그때 락을 위에서 아래로 내려가게 걸면, 데드락에 빠지지 않는다고 알려 주신 분이 있었고, 저는 아이디어를 좀 더 보태서 코드로 데드락 디텍터(deadlock-detector)를 만든 것입니다. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;모쪼록 모두 도움 되었으면 좋겠습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;서론&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;데드락-디텍터(deadlock-detector)란 말 그대로 &quot;데드락 탐지기&quot; 입니다. 데드락이란 제가 정의 하기에 락 자원 획득 시도가 무제한 대기하는 상태를 뜻하는 합니다. &lt;/span&gt;&lt;span style=&quot;font-size:12pt;&quot;&gt;데드락 디텍터(deadlock-detector)&lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;는 이러한 상태를 탐지하는 장치입니다. 데드락이 생기는 이유를 알면, 데드락 회피할 수 있으므로, 데드락 발생 이유를 알아봐야 합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1971년에 E. G. 코프만 교수가 다음 4가지 모두 만족할 때, 발생한다고 정리 하였습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. 상호배제(Mutual exclusion) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 임계영역을 뜻하는데, 프로세스 또는 쓰레드의 루틴이 동시에 들어갈 수 없는 영역을 뜻합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 프로그래밍 할 때, lock { ... } unlock 에서 { } 안쪽 영역을 뜻합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. 점유대기(Hold and wait)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 이미 임계영역 안에서 다른 임계영역 획득을 대기하는 일을 뜻합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- lock1 { ... lock2 { ... } unlock2&amp;nbsp; ... } unlock2 에서 lock2 를 시도 후 대기하는 상태를 뜻합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. 비섬점(No preemption)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 다른 프로세스 혹은 쓰레드가 획득한 락 자원이 반환될 때까지 획득할 수 없는 것을 뜻합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4. 순환대기 (Circular wait)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 락 자원 획득이 T1(A -&amp;gt; B), T2(B -&amp;gt; C), T3(C -&amp;gt; D), T4(D -&amp;gt; A) 로 되어 있고, 서로가 물려 있는 상태를 뜻합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;이 4개 중에 한개만 발생하지 않게 하면, 데드락에 걸리지 않습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;1. 상호배제 제거 방법 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 싱글 쓰레드이거나 공유 데이터가 없도록 하면, 상호배제 영역이 제거 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;2. 점유대기 제거 방법&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 쉽게 생각해 lock 걸고 lock 거는 코드를 없앱니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;3. 비선점 제거 방법&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 이미 걸려 있는 락을 임의로 해제시킵니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;4. 순환대기 제거 방법&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 락에 방향성을 넣어, 단방향으로 락을 걸도록 처리 합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;현재 저의 경험을 기준으로 보면 3번은 본적이 없고, 1, 2, 4 으로 해결해 왔던 거 같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;저는 특히 4번으로 데드락 제거를 해왔고, 그 노력으로 &lt;/span&gt;&lt;span style=&quot;font-size:12pt;&quot;&gt;데드락 디텍터(deadlock-detector)&lt;/span&gt;를 만들게 되었습니다. &lt;span style=&quot;font-size: 12pt;&quot;&gt;이 &lt;/span&gt;&lt;span style=&quot;font-size:12pt;&quot;&gt;데드락 디텍터(deadlock-detector)&lt;/span&gt;는 순환대기(&lt;span style=&quot;font-size:12pt;&quot;&gt;Circular wait) 제거를 통해 데드락을 방지/탐지 하며 &lt;/span&gt;응용하면, 점유대기(&lt;span style=&quot;font-size:12pt;&quot;&gt;Hold and wait)를 없앨 수 있습니다.&amp;nbsp; 방법은 모든 락의 순번을 같게 하면, 락 중 락을 찾을 수 있게 됩니다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size:12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&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;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;본론&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;순환대기 상태를 없애기 위해선 락이 서로 순환되지 않게 만들면 됩니다. 이 뜻은 락 자원 획득을 양방향이 아닌 단방양으로 하겠다는 뜻하고 같습니다. &lt;/span&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;위의 예에서 D -&amp;gt; A 로 락 거는 상태를 탐지 할 수 있으면 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;먼저 준비해야 할것은 &quot;쓰레드 로컬 스토리지 싱글턴&quot;, &quot;정렬된 락 자원&quot;, &quot;정렬된 락 자원의 락 가더&quot;가 필요 합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;쓰레드 로컬 스토리지 싱글턴&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 구현은 자유롭습니다. 조건은 해당 쓰레드에서만 접근 방법을 제공하면 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 각 쓰레드마다 락 거는 순번을 체크하는 객체에 접근하기 위해 사용합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;정렬된 락 자원&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 각 락 자원이 정렬 되어 있어, 단방향으로 가고 있는지 체크하기 위한 std::mutex + int order 입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 순번을 기록하기 위해선 변수 1개가 필요하므로 int order 를 선언하여 사용하고 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;정렬된 락 자원의 락 가더&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 정렬된 락 자원을 획득할 때, 쓰레드 로컬 스토리지 싱글턴과 정렬된 락 자원을 연결하기 위해 사용합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- 또한 생성/소멸 관용구로 편한 방법 획득/해제를 위해 사용합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;full - &lt;a href=&quot;https://github.com/ikpil/deadlock-detector&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/ikpil/deadlock-detector&lt;/a&gt;&lt;/p&gt;&lt;p&gt;sample&lt;/p&gt;&lt;p&gt;&lt;textarea class=&quot;brush : cpp&quot; style=&quot;margin: 0px; width: 667px; height: 692px;&quot;&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &quot;dldetector.hpp&quot;

class scope_log_log final
{
public:
	scope_log_log(const scope_log_log&amp;amp;) = delete;
	scope_log_log&amp;amp; operator=(const scope_log_log&amp;amp;) = delete;

public:
	~scope_log_log()
	{
		std::cout &amp;lt;&amp;lt; &quot;unlock : &quot; &amp;lt;&amp;lt; log_ &amp;lt;&amp;lt; std::endl;
	}
	scope_log_log(const std::string&amp;amp; log) : log_(log)
	{
		std::cout &amp;lt;&amp;lt; &quot;lock   : &quot; &amp;lt;&amp;lt; log_ &amp;lt;&amp;lt; std::endl;
	}

private:
	std::string log_;
};

ordered_mutex a(1000);
ordered_mutex b(100);
ordered_mutex c(10);
ordered_mutex d(1);

void test_case_1()
{
	std::cout &amp;lt;&amp;lt; &quot;test case 1&quot; &amp;lt;&amp;lt; std::endl;
	std::cout &amp;lt;&amp;lt; std::endl;

	ORDERED_LOCK_GUARDING(a)
	{
		scope_log_log scope_a(&quot;a&quot;);
	}
	std::cout &amp;lt;&amp;lt; std::endl;
	ORDERED_LOCK_GUARDING(b)
	{
		scope_log_log scope_b(&quot;b&quot;);
	}
	std::cout &amp;lt;&amp;lt; std::endl;
	ORDERED_LOCK_GUARDING(c)
	{
		scope_log_log scope_c(&quot;c&quot;);
	}
	std::cout &amp;lt;&amp;lt; std::endl;
	ORDERED_LOCK_GUARDING(d)
	{
		scope_log_log scope_d(&quot;d&quot;);
	}
}

void test_case_2()
{
	std::cout &amp;lt;&amp;lt; &quot;test case 2&quot; &amp;lt;&amp;lt; std::endl;

	std::cout &amp;lt;&amp;lt; std::endl;
	// a -&amp;gt; b
	ORDERED_LOCK_GUARDING(a)
	{
		scope_log_log scope_a(&quot;a&quot;);

		ORDERED_LOCK_GUARDING(b)
		{
			scope_log_log scope_b(&quot;b&quot;);
		}
	}

	std::cout &amp;lt;&amp;lt; std::endl;
	// c -&amp;gt; d
	ORDERED_LOCK_GUARDING(c)
	{
		scope_log_log scope_c(&quot;c&quot;);

		ORDERED_LOCK_GUARDING(d)
		{
			scope_log_log scope_d(&quot;d&quot;);
		}
	}

	std::cout &amp;lt;&amp;lt; std::endl;
	// a -&amp;gt; d
	ORDERED_LOCK_GUARDING(a)
	{
		scope_log_log scope_a(&quot;a&quot;);

		ORDERED_LOCK_GUARDING(d)
		{
			scope_log_log scope_d(&quot;d&quot;);
		}
	}
}

void test_case_3_error()
{
	std::cout &amp;lt;&amp;lt; &quot;test case 3&quot; &amp;lt;&amp;lt; std::endl;

	// a -&amp;gt; b -&amp;gt; d -&amp;gt; c(error)
	ORDERED_LOCK_GUARDING(a)
	{
		scope_log_log scope_a(&quot;a&quot;);

		ORDERED_LOCK_GUARDING(b)
		{
			scope_log_log scope_b(&quot;b&quot;);

			ORDERED_LOCK_GUARDING(d)
			{
				scope_log_log scope_d(&quot;d&quot;);

				// deadlock - circular wait error
				ORDERED_LOCK_GUARDING(c)
				{
					scope_log_log scope_c(&quot;c&quot;);
				}
			}
		}
	}

	// b -&amp;gt; a(error)
	ORDERED_LOCK_GUARDING(b)
	{
		scope_log_log scope_b(&quot;b&quot;);

		// deadlock - circular wait error
		ORDERED_LOCK_GUARDING(a)
		{
			scope_log_log scope_a(&quot;a&quot;);
		}
	}

	std::cout &amp;lt;&amp;lt; std::endl;
}

int main(char argc, char *argv[])
{
	test_case_1();

	std::cout &amp;lt;&amp;lt; std::endl;

	test_case_2();

	std::cout &amp;lt;&amp;lt; std::endl;

	test_case_3_error();

	tls_template&amp;lt;deadlock_detector&amp;lt;ordered_mutex&amp;gt;&amp;gt;::all_tls_release();

	return 0;
}
&lt;/textarea&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: 24pt;&quot;&gt;결론&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 코드 자체는 별거 없습니다. 개념을 이용하는 부분이 조금 어려울 수 있습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 모르면 알기 어렵지만, 알고나면 참 쉬운 개념입니다. 각자 나름데로 짜보는것도 재미있을 것 같습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 기본 개념만 이해 되면, 어떤 언어에서도 사용 가능하게 바꿀 수 있습니다. 꼭 서론/본론을 이해하세요.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 쓰레드 로컬 스토리지 싱글턴(TLS Singleton)만 분리해서 따로 프로그래밍 해야 될것 같습니다.&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;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;참조 문헌&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;- &lt;a href=&quot;https://ko.wikipedia.org/wiki/%EA%B5%90%EC%B0%A9_%EC%83%81%ED%83%9C&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://ko.wikipedia.org/wiki/%EA%B5%90%EC%B0%A9_%EC%83%81%ED%83%9C&lt;/a&gt;&lt;/span&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: 24pt;&quot;&gt;여담&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 대학 강의도 들어야 하는데, 피곤하네요. 내일로 미루면 후회 하겠죠? : )&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;&amp;nbsp;- 예전부터 그랬지만 조사를 이상하게 쓰는 버릇이 있네요. 혹시 이상한 조사 있으면 알려 주세요.&lt;/span&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: 12pt;&quot;&gt;:wq!&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>연구실/소스공유</category>
      <category>Circular wait</category>
      <category>DeadLock</category>
      <category>deadlock-detector</category>
      <category>detector</category>
      <category>multi-thread</category>
      <category>mutex</category>
      <category>데드락</category>
      <category>데드락 디텍터</category>
      <category>데드락 탐지기</category>
      <category>순환대기</category>
      <category>탐지기</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1348</guid>
      <comments>https://ikpil.tistory.com/1348#entry1348comment</comments>
      <pubDate>Mon, 17 Oct 2016 23:25:06 +0900</pubDate>
    </item>
    <item>
      <title>넥서스7 1세대, 롤리팝 업데이트 후 느려짐 현상 수정(버벅임)</title>
      <link>https://ikpil.tistory.com/1347</link>
      <description>&lt;p&gt;넥서스7 1세대를 2013년경에 구입하여 쓰고 있었습니다. 새로운 버전이 나오면, 항상 최신으로 올려서 쓰고 있었는데, 요즘 이상하게 너무 느려져서 이상하다고 생각했습니다. 그래서 검색했습니다. 다음과 같은 방법이 있었고, 실제 효과가 있었습니다.&lt;/p&gt;&lt;p&gt;모두들 효과가 있었으면 좋겠습니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;첫째, 넥서스7 캐시 파티션 초기화&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;넥서스7 전원을 끈다.&lt;/li&gt;&lt;li&gt;전원 + 볼륨아래 버튼을 누르고, 부트로더로 진입한다.&lt;/li&gt;&lt;li&gt;부트로더에서 리커버리 모드로 이동한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;명령어가 없습니다 라고 뜨면, 전원 버튼을 누른 뒤&amp;nbsp;&lt;b&gt;볼룸 위 버튼을 한번&lt;/b&gt; 누른다.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;wipe cache partition 을 선택 실행한다.&lt;/li&gt;&lt;li&gt;5번이 다 끝나면 &quot;reboot system now&quot; 을 실행한다.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;둘째, 넥서스7 기능 끄기(실제 효과 있는 부분)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;자동회전 기능을 끈다(저의 경우 바로 효과 봤습니다.)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;설정 -&amp;gt; 언어 및 키보드 -&amp;gt; 현재 사용하는 모든 키보드들을 다음과 같이 적용 한다.&lt;br /&gt;* 테마 : 홀로 시리즈 테마로 선택&lt;br /&gt;* 제스처 타이핑 사용 : 끔&lt;br /&gt;* 제스처 흔적 표시 : 끔&lt;br /&gt;* 동적 플로팅 미리보기 : 끔&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;:wq&lt;/p&gt;</description>
      <category>연구실/파편화된 기록들</category>
      <category>Lollipop</category>
      <category>nexus7</category>
      <category>넥서스7</category>
      <category>느려짐</category>
      <category>롤리팝</category>
      <category>버벅</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1347</guid>
      <comments>https://ikpil.tistory.com/1347#entry1347comment</comments>
      <pubDate>Wed, 16 Sep 2015 02:57:46 +0900</pubDate>
    </item>
    <item>
      <title>유니티3D에 자바 라이브러리 Jar 연동하기 (How to link Jar in Unity3D)</title>
      <link>https://ikpil.tistory.com/1346</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;포스팅 목적&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;기록&lt;/li&gt;&lt;li&gt;정보 공유&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;포스팅을 남기게 된 계기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;유니티3D(Unity3D)에서 개발하다 보면, 자바 라이브러리만(네트워크 라이브러리 등)&amp;nbsp;따로&amp;nbsp;사용해야 할 때가 있습니다. 하지만 처음부터 사용해야 할 라이브러리를 연결 테스트 하다 보면, 빌드하는데 많은 노력이 필요할 수 있습니다. 그래서 라이브러리 연결만 테스트 하기 위한 샘플이 필요하게 되었습니다.&lt;/p&gt;
&lt;p&gt;해당 샘플을 만들다 보니, 간단히 정리할 수 있을거 같아, 포스팅을 남기게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;유니티3D(Unity3D)에 자바 라이브러리 Jar 를 연결하는 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;먼저 유니티3D(Unity3D)를 안드로이드 빌드 되는지 확인한다.(검색을 통해 찾아 보세요.)&lt;/li&gt;&lt;li&gt;자바 라이브러리 Jar 파일을 만든다.(검색을 통해 찾아 보세요.)&lt;br /&gt;

&lt;textarea class=&quot;brush: java&quot; style=&quot;margin: 0px; width: 420px; height: 181px;&quot;&gt;package com.test.include.jar;

public class IncludeJar 
{
	public static int testSum(int a, int b)
	{
		return a + b;
	}
}

&lt;/textarea&gt;

&lt;/li&gt;&lt;li&gt;만든 Jar 파일을 Plugins/Android/YOUR_JAR_NAME.jar 로 위치 시킨다.&lt;br /&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 428px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/216D724D5523FF7415&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F216D724D5523FF7415&quot; width=&quot;428&quot; height=&quot;467&quot; filename=&quot;plugins.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;유니티3D(Unity3D) C# 코드로&amp;nbsp;Impl 패턴을 사용하여&amp;nbsp;크로스 플랫폼에서 컴파일 되게 만든다.&lt;br /&gt;


&lt;textarea class=&quot;brush : csharp&quot; style=&quot;margin: 0px; width: 594px; height: 716px;&quot;&gt;public class OutsideLibrary : MonoBehaviour 
{
    private OutsideLibraryImpl _impl;

    private void Awake()
    {
        CreateImpl();
    }

    private void CreateImpl()
    {
#if !UNITY_EDITOR &amp;amp;&amp;amp; UNITY_IOS
        _impl = new OutsideLibraryIOS();
#elif !UNITY_EDITOR &amp;amp;&amp;amp; UNITY_ANDROID
        _impl = new OutsideLibraryAndroid();
#else
        _impl = new OutsideLibraryImpl();
#endif
    }

    public int Sum(int a, int b)
    {
        return _impl.Sum(a, b);
    }

}


public class OutsideLibraryImpl
{
    public virtual int Sum(int a, int b)
    {
        Debug.Log(&quot;Untiy3d editor can not do anything.&quot;);
        return 0;
    }
}

public class OutsideLibraryAndroid : OutsideLibraryImpl
{
    public override int Sum(int a, int b)
    {
        using (AndroidJavaClass ajc = new AndroidJavaClass(&quot;com.test.include.jar.IncludeJar&quot;))
        {
            return ajc.CallStatic&amp;lt;int&amp;gt;(&quot;testSum&quot;, a, b);
        }
    }
}


public class OutsideLibraryIOS : OutsideLibraryImpl
{

}


&lt;/textarea&gt;&lt;/li&gt;&lt;li style=&quot;clear: none; float: none;&quot;&gt;테스트&lt;br /&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 800px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/225157405523FD4F12&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F225157405523FD4F12&quot; width=&quot;800&quot; height=&quot;1280&quot; filename=&quot;Screenshot_2015-04-08-00-44-57.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&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;github 사용해서 파일 공유가 필요한 시기인거 같네요.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;:wq!&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>연구실/파편화된 기록들</category>
      <category>How to Inlcude Jar in Unity3d</category>
      <category>jar</category>
      <category>Java Library</category>
      <category>연동</category>
      <category>유니티3D</category>
      <category>유니티3D Jar 연동하기</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1346</guid>
      <comments>https://ikpil.tistory.com/1346#entry1346comment</comments>
      <pubDate>Wed, 8 Apr 2015 01:19:42 +0900</pubDate>
    </item>
    <item>
      <title>유니티3D를 위한 인 게임 디버그 콘솔 넣기 (In-game debug console for Unity3D)</title>
      <link>https://ikpil.tistory.com/1345</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;포스팅 목적&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;기록&lt;/li&gt;&lt;li&gt;정보 공유&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;인 게임 콘솔(Console)에 대하여&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;유니티3D(Unity3D)에서 개발하다 보면, 유니티3D(Unity3D) 에디터가 아닌 플랫폼(모바일 디바이스, 설치한 PC 등)에서 로그를 봐야 할 때가 있습니다. 이때 로그를 보려면, 인터넷에 연결시켜 로그를 보내거나 해당 PC에 가서 로그 파일을 열어봐야 합니다. 이러한 절차는&amp;nbsp;간단히&amp;nbsp;로그만 확인하려 해도, 매우 귀찮은 작업이 되어, 개발 의욕을 떨어뜨릴 수 있습니다.&lt;/p&gt;&lt;p&gt;그래서 유니티3D(Unity3D) 에디터가 아닌 플랫폼에서 게임 플레이 도중 로그를 확인하는 간편한 방법이 있어야 합니다.&amp;nbsp;그 방법 중 제가 제일 좋아 하는 방법이 게임씬에 콘솔(Console)이 같이 보이게 하는 방법입니다. 하지만 유니티3D(Unity3D) 에서 콘솔(Console)을 직접 구현하기란 여간 귀찮은 작업이 아닙니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;만약 누군가 이러한 작업을 해 놓았고, 오픈소스로 공개해 준다면, 얼마나 좋을까요?&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;유니티3D(Unity3D) 인 게임&lt;/span&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&amp;nbsp;콘솔(Console)을 띄우는 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;?&lt;a href=&quot;https://github.com/mminer/consolation&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/mminer/consolation&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/mminer/consolation&lt;/a&gt;? 에 방문한다.&lt;/li&gt;&lt;li&gt;consolation-master.zip 을 다운로드 받는다. (Download ZIP 버튼을 누르면 됩니다.)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;압축을 해제하고 Console.cs 파일과 라이센스(MIT) 문서를&amp;nbsp;유니티에 포함시킨다.&lt;/li&gt;&lt;li&gt;활성화 되는 게임 오브텍트에 해당 스크립트를 붙인다.(보통 카메라가 만만합니다.)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;백쿼트(back qutoe : `) 키를 눌러 콘솔(Console)을 활성/비활성 하면서 테스트 한다.&lt;/li&gt;&lt;li&gt;키보드 인터페이스가 없을 경우, UI 의 버튼 등으로 확인할 수 있게 한다.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;관련 스크린샷&lt;/span&gt;&lt;/b&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: 880px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2316C44A551D5BF81F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2316C44A551D5BF81F&quot; width=&quot;880&quot; height=&quot;475&quot; filename=&quot;console.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;마치며&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;오픈소스로 공개해 준 matthew miner(mminer)님에게 감사합니다.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;:wq!&lt;/p&gt;</description>
      <category>연구실/파편화된 기록들</category>
      <category>console</category>
      <category>debug</category>
      <category>debug console</category>
      <category>in-game</category>
      <category>unity</category>
      <category>Unity3D</category>
      <category>디버그 콘솔</category>
      <category>인-게임</category>
      <category>콘솔</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1345</guid>
      <comments>https://ikpil.tistory.com/1345#entry1345comment</comments>
      <pubDate>Fri, 3 Apr 2015 00:19:18 +0900</pubDate>
    </item>
    <item>
      <title>유니티 암호화 2편, 외부 DLL 암호화</title>
      <link>https://ikpil.tistory.com/1344</link>
      <description>&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;포스팅 목적&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;기록&lt;/li&gt;&lt;li&gt;피드백을 받기 위해&lt;/li&gt;&lt;li&gt;공유&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;개발 이유&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;유니티로 컴파일 하여 배포한&amp;nbsp;APK 를 루팅한 기기(스마트폰 등)에서 APK 를 뽑아와 해체하면, 손쉽게 외부 DLL 에 접근이 가능합니다. 이렇게 접근 한 뒤 후킹 가능한 DLL 로&amp;nbsp;바꿔치기 하여, 다시 APK 로 묶으면, 손쉽게 해킹이 가능합니다. 또한 ILSpy 로 코드를 디스어샘블하여 볼 수 있습니다.&lt;/p&gt;&lt;p&gt;그래서 외부 컴파일된 DLL 을 암호화 하여, 동적 로드 하여, 사용한다면, 조금이라도 해커를 귀찮게 할 수 있습니다. 이 내용은 다음 링크에서 확인 할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;링크&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://unitystudy.net/bbs/board.php?bo_table=newwriting&amp;amp;wr_id=356&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://unitystudy.net/bbs/board.php?bo_table=newwriting&amp;amp;wr_id=356&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/williamyang3910/unitekorea2013-protecting-your-android-content-21713675&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://www.slideshare.net/williamyang3910/unitekorea2013-protecting-your-android-content-21713675&lt;/a&gt; - 32 page&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;DLL 암호화 절차&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;외부에서 컴파일된 DLL 을 open ssl 을 이용해 암호화 한다.&lt;br /&gt;- 디스어샘블을 막고&amp;nbsp;무결성을 검증하기 위해&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;암호화된 DLL 을 base64 인코딩 한다.&lt;br /&gt;- 암호화 되면, text 형태로 파일을 읽어오기 힘들기 때문에. (이 과정 없이 바로&amp;nbsp;바이너리로 로딩해도 됩니다)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;유니티에 인코딩된 파일을 알맞는 자리에 위치 시킨다.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;유니티로 base64로 인코딩된 파일을 읽고, byte[] 로 변환시킨다.&lt;/li&gt;&lt;li&gt;변환 후 복호화 한다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;복호화된 대상을 동적 로드 한다.&lt;/li&gt;&lt;li&gt;쉽게 사용하기 위해 래퍼를 만들어 인터페이스를 추가하여 사용한다.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;DLL 암호화 방법 및 사용법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;&lt;li&gt;oepnSSL 을 다운로드 받는다. 자신의 OS 에 맞는 버전을 받아 사용 하세요.&lt;br /&gt;- 윈도우 사용자의 경우, 바이너리로 받으면 편합니다.&lt;br /&gt;-&amp;nbsp;&lt;a href=&quot;https://www.openssl.org/related/binaries.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://www.openssl.org/related/binaries.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;openssl 명령어를 통해 aes-256-cbc 로 암호화 한다. 이때 암호를 입력 하라 나오는데 입력하고 key 와 iv 를 복사해 둔다.&lt;br /&gt;
&lt;textarea class=&quot;brush : bash&quot; style=&quot;margin: 0px; width: 668px; height: 175px;&quot;&gt;
openssl aes-256-cbc -nosalt -p -in HOTween.dll -out HOTween.bin
enter aes-256-cbc encryption password: cb13ad3fe5c9
Verifying - enter aes-256-cbc encryption password: cb13ad3fe5c9
key=B3457F4440802957414149DF2640A18D1CF9BFEFABDB69D3075B6DF7F879D88D
iv =F48D97C3CE4CAB228A9946464E6D9065



&lt;/textarea&gt;
&lt;/li&gt;&lt;li&gt;openssl 명령어를 통해 base64 인코딩 한다.&lt;br /&gt;예)&amp;nbsp;openssl base64 -in HOTween.bin -out HOTween.txt&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;HOTween.txt 를 유니티 Resource 폴더에 위치 시킨다.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;로더를 만든다. SecurityDLLLoader.cs&lt;br /&gt;

&lt;textarea class=&quot;brush : csharp&quot; style=&quot;margin: 0px; width: 667px; height: 692px;&quot;&gt;using System.Security.Cryptography;

public class SecuirtyDLLLoader
{
    private const string key = &quot;B3457F4440802957414149DF2640A18D1CF9BFEFABDB69D3075B6DF7F879D88D&quot;;
    private const string iv = &quot;F48D97C3CE4CAB228A9946464E6D9065&quot;;

    public static byte[] HexStringToByteArray(string hex)
    {
        byte[] bytes = new byte[hex.Length / 2];
        for (int i = 0; i &amp;lt; hex.Length; i += 2)
        {
            bytes[i / 2] = System.Convert.ToByte(hex.Substring(i, 2), 16);
        }
        return bytes;
    }

    public static System.Reflection.Assembly LoadSecurityDLL(byte[] bytes)
    {
        using (RijndaelManaged aes256 = new RijndaelManaged())
        {
            aes256.KeySize = 256;
            aes256.BlockSize = 128;

            aes256.Key = HexStringToByteArray(key);
            aes256.IV = HexStringToByteArray(iv);

            aes256.Mode = CipherMode.CBC;
            aes256.Padding = PaddingMode.PKCS7;

            using (ICryptoTransform ct = aes256.CreateDecryptor())
            {
                byte[] descrypted = ct.TransformFinalBlock(bytes, 0, bytes.Length);
                return System.Reflection.Assembly.Load(descrypted);
            }
        }
    }
    
}


&lt;/textarea&gt;

&lt;br /&gt;&lt;/li&gt;&lt;li&gt;손쉽게 사용할 레퍼를 만든다. SecurityHOTween.cs&lt;br /&gt;

&lt;textarea class=&quot;brush : csharp&quot; style=&quot;margin: 0px; width: 672px; height: 759px;&quot;&gt;using UnityEngine;
using System.Collections;

public class SecurityHOTween
{
    private static System.Reflection.Assembly _asm;

    private static System.Type _typeHOTween;
    private static System.Type _typeTweenParams;
    private static System.Reflection.MethodInfo _mtdInit;
    private static System.Reflection.MethodInfo _mtdTo;
    private static System.Reflection.MethodInfo _mtdProp2;

    public static void Init()
    {
        // load dll
        TextAsset hotweenText = Resources.Load&amp;lt;TextAsset&amp;gt;(&quot;Lib/HOTween&quot;);
        byte[] binaryDLL = System.Convert.FromBase64String(hotweenText.text);
        _asm = SecuirtyDLLLoader.LoadSecurityDLL(binaryDLL);

        // get types
        _typeHOTween = _asm.GetType(&quot;Holoville.HOTween.HOTween&quot;);
        _typeTweenParams = _asm.GetType(&quot;Holoville.HOTween.TweenParms&quot;);

        // get method
        _mtdInit = _typeHOTween.GetMethod(&quot;Init&quot;, new System.Type[] { });
        _mtdTo = _typeHOTween.GetMethod(&quot;To&quot;, new System.Type[] { typeof(object), typeof(float), _typeTweenParams });
        _mtdProp2 = _typeTweenParams.GetMethod(&quot;Prop&quot;, new System.Type[] { typeof(string), typeof(object) });

        // init
        _mtdInit.Invoke(_typeHOTween, null);
    }

    public static void To(object p_target, float p_duration, object[] p_parms)
    {
        object instanceTweenParms = System.Activator.CreateInstance(_typeTweenParams);

        object propResult = _mtdProp2.Invoke(instanceTweenParms, p_parms);
        _mtdTo.Invoke(_typeHOTween, new object[] { p_target, p_duration, propResult });
    }
}


&lt;/textarea&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;테스트!!!&lt;br /&gt;


&lt;textarea class=&quot;brush : csharp&quot; style=&quot;margin: 0px; width: 673px; height: 275px;&quot;&gt;using UnityEngine;
using System.Collections;

public class CommonEditor : MonoBehaviour 
{
    void Start()
    {
        SecurityHOTween.Init();
        SecurityHOTween.To(transform, 5.0f, new object[] { 
            &quot;position&quot;, Vector3.one * 20.0f });
    }
}



&lt;/textarea&gt;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;여담&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;openssl 을 이용한 암호화 전략은 여러가지 이유로 편하다.&lt;br /&gt;- 다양한 툴과 여러 라이브러리가 존재하기 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;동적 DLL 로드의 경우, 성능상의 이슈가 있으므로, 꼭 간단히 만들어 테스트 해보고 진행 해야 한다.&lt;br /&gt;- 애초에 동적 DLL 로 쓸꺼다라는 개념으로 프로그래밍 했다면 좀 더 편했을 수 있겠다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;위의 것을 조금 바꾸면, 스크립트 암호화가 되는데, 이는 다음 편에서....&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;:wq!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>연구실/파편화된 기록들</category>
      <category>ase256</category>
      <category>DLL</category>
      <category>DLL 동적 로드</category>
      <category>Security</category>
      <category>unity</category>
      <category>암호화</category>
      <category>외부 컴파일</category>
      <category>유니티</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1344</guid>
      <comments>https://ikpil.tistory.com/1344#entry1344comment</comments>
      <pubDate>Tue, 17 Mar 2015 00:12:44 +0900</pubDate>
    </item>
    <item>
      <title>디자인 패턴, 행위 패턴, 스트래티지 패턴(Strategy Pattern)</title>
      <link>https://ikpil.tistory.com/1343</link>
      <description>&lt;p&gt;이 패턴은 생성(Creational), 구조(Structural), 행위(Behavioral) 패턴으로 나눌 수 있는 디자인 패턴 중 행위 패턴에 속합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;포스팅 이유&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;무엇인가 이해하려 할 때, 다른 관점에서 이해 한것이 도움이 될 수 있습니다. 이해를 기록해 두기 위해 남깁니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;관련 링크&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://hyeonstorage.tistory.com/146&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://hyeonstorage.tistory.com/146&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://arabiannight.tistory.com/entry/%EC%9E%90%EB%B0%94Java-%ED%8C%A8%ED%84%B4-1%EC%8A%A4%ED%8A%B8%EB%9E%98%ED%8B%B0%EC%A7%80-%ED%8C%A8%ED%84%B4Strategy-Pattern&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://arabiannight.tistory.com/entry/%EC%9E%90%EB%B0%94Java-%ED%8C%A8%ED%84%B4-1%EC%8A%A4%ED%8A%B8%EB%9E%98%ED%8B%B0%EC%A7%80-%ED%8C%A8%ED%84%B4Strategy-Pattern&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://blog.naver.com/yeji_rang?Redirect=Log&amp;amp;logNo=220175424891&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://blog.naver.com/yeji_rang?Redirect=Log&amp;amp;logNo=220175424891&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://blog.naver.com/jidon333/220108740978&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://blog.naver.com/jidon333/220108740978&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;사례&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이 패턴을 처음 알게 된건, 대전 액션 게임 서버 개발 중 여러 종류의 경기 종료 규칙을 적용하기 위해 선임 개발자가 사용 한 것을 보고 알게 되었습니다. 그리고 캐릭터가 사용하는 총의 발사 규칙(연사, 점사, 일점사)을 적용할 때도 썼었네요.&amp;nbsp;그 밖에도 에디터에서 라인 구분 방법 분기, 컴파일에서 기계별 레지스터 할당 방법 분기, 수학에서는 계산 방법 분기, 웹싸이트에서는 가입 절차에 따른&amp;nbsp;회원 검증 방법 분기 등이 있다고 하네요.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;사용 이유&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;객체가 하는 일은 변하지 않는데, 일을 처리 방법이 달라질 때, 상속이나 조건문으로 구현하기에 일 처리 방법 및 분기의 코드(변수, 로직 등) 관리 자리가 부담스러워 독립된 자리에서 일을 처리하고 싶을 때 사용 합니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;스트래티지 패턴(Strategy Pattern) 구현 알고리즘&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;ol style=&quot;list-style-type: upper-roman;&quot;&gt;&lt;li&gt;구현(알고리즘)을 클래스(또는 클로저, 함수자 등)로 독립 시킨다.&lt;/li&gt;&lt;li&gt;독립된 구현에 공통 인터페이스(함수로 호출 부분)를 붙인다.&lt;/li&gt;&lt;li&gt;구현 사용 객체는 독립시킨 구현과 has-a 관계로 묶는다.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;구현 방법&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;링크를 참조 하세요. 워낙 많아 따로 정리할 필요가 없겠네요.&lt;/p&gt;&lt;p&gt;:wq!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>연구실/파편화된 기록들</category>
      <category>pattern</category>
      <category>Strategy</category>
      <category>디자인 패턴</category>
      <category>스트래티지</category>
      <category>패턴</category>
      <author>최익필</author>
      <guid isPermaLink="true">https://ikpil.tistory.com/1343</guid>
      <comments>https://ikpil.tistory.com/1343#entry1343comment</comments>
      <pubDate>Sun, 15 Mar 2015 21:04:59 +0900</pubDate>
    </item>
  </channel>
</rss>