<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>DARKER THAN BLACK  黒の契約者</title>
    <link>https://janggom.tistory.com/</link>
    <description>잠수</description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 10:56:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>장곰부대</managingEditor>
    <item>
      <title>offline 환경에서 gcc 깔기</title>
      <link>https://janggom.tistory.com/476</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://janggom.tistory.com/475&quot;&gt;https://janggom.tistory.com/475&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1586086857110&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;article&quot; data-og-title=&quot;offline 환경에서 cqlsh 셋팅&quot; data-og-description=&quot;-- centos8 기준임 cd &amp;lt;cassandra_home&amp;gt;/bin/ ./cqlsh ImportError: No module named _ssl 이런 오류가 뜨는데 해결방법은 간단하다 그냥 openssl-devel 패키지 깔고 파이썬 재 빌드 하면 된다. 근데 외부 인터넷..&quot; data-og-host=&quot;janggom.tistory.com&quot; data-og-source-url=&quot;https://janggom.tistory.com/475&quot; data-og-url=&quot;https://janggom.tistory.com/475&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CG7gw/hyFynAiZs4/u2AwKuuIUKSghgSkKdJkGk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/doplT1/hyFyvZnXh6/9yawuDOemgsZrXNavt2BCK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://janggom.tistory.com/475&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://janggom.tistory.com/475&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CG7gw/hyFynAiZs4/u2AwKuuIUKSghgSkKdJkGk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/doplT1/hyFyvZnXh6/9yawuDOemgsZrXNavt2BCK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;offline 환경에서 cqlsh 셋팅&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;-- centos8 기준임 cd /bin/ ./cqlsh ImportError: No module named _ssl 이런 오류가 뜨는데 해결방법은 간단하다 그냥 openssl-devel 패키지 깔고 파이썬 재 빌드 하면 된다. 근데 외부 인터넷..&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;janggom.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;이 글에서 연장되는 느낌인데&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실제로 운영에 셋팅하는데 운영서버 보니깐 gcc도 안 깔려있더라&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위의 글과 같이 똑같이 gcc 깔려는데&lt;/p&gt;
&lt;p&gt;문제가 gcc의 의존성 패키지 중&lt;/p&gt;
&lt;p&gt;libxcrypt-devel 패키지랑 glib-devel 패키지가 서로 의존성을 가지고 있어서 안 깔리는 현상이 있었음&lt;span style=&quot;color: #666666;&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;rpm -Uvh --nodeps &amp;lt;패키지 이름&amp;gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리눅스</category>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/476</guid>
      <comments>https://janggom.tistory.com/476#entry476comment</comments>
      <pubDate>Sun, 5 Apr 2020 20:51:03 +0900</pubDate>
    </item>
    <item>
      <title>offline 환경에서 cqlsh 셋팅</title>
      <link>https://janggom.tistory.com/475</link>
      <description>&lt;p&gt;-- centos8 기준임&lt;/p&gt;
&lt;p&gt;cd &amp;lt;cassandra_home&amp;gt;/bin/&lt;/p&gt;
&lt;p&gt;./cqlsh&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;ImportError: No module named _ssl&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이런 오류가 뜨는데&amp;nbsp;&lt;/p&gt;
&lt;p&gt;해결방법은 간단하다 &lt;u&gt;&lt;b&gt;그냥 openssl-devel 패키지 깔고 파이썬 재 빌드&lt;/b&gt;&lt;/u&gt; 하면 된다.&lt;/p&gt;
&lt;p&gt;근데 외부 인터넷 연결이 안되는게 문제임&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일단 온라인이 되는 같은 os버전 환경을 설치한 뒤&lt;/p&gt;
&lt;p&gt;dnf download openssl-devel --resolve&lt;/p&gt;
&lt;p&gt;이 후 openssl-devel에 필요한 rpm을 받을 수 있다.&lt;/p&gt;
&lt;p&gt;근데 이게 의존성 패키지 모두를 다 다운받는게 아니라&amp;nbsp;&lt;/p&gt;
&lt;p&gt;openssl-devel을 까는데 필요한 패키지만 받는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;수동으로 하나씩 설치해보면&lt;/p&gt;
&lt;p&gt;rpm -Uvh &amp;lt;패키지&amp;gt;&lt;/p&gt;
&lt;p&gt;의존성이 필요하다고 에러가 뜬다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 다시&lt;/p&gt;
&lt;p&gt;dnf download &amp;lt;필요패키지&amp;gt; --resolve&lt;/p&gt;
&lt;p&gt;재귀적으로 계속 openssl-devel이 설치될 때 까지 설치하고 다운받고 과정을 반복한다.&lt;/p&gt;
&lt;p&gt;필요 패키지 명은 에러 로그에 뜨는 라이브러리와 틀릴 수 있기 때문에&amp;nbsp;꼭 구글검색해서 정확하게 기입하길 바란다.&lt;/p&gt;
&lt;p&gt;모든 rpm 파일을 운영서버에 ftp로 넘겨서 똑같이 설치한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;마지막으로 파이썬 재빌드&lt;/p&gt;
&lt;p&gt;cd &amp;lt;python_install_home&amp;gt;&lt;/p&gt;
&lt;p&gt;make altinstall&lt;/p&gt;</description>
      <category>리눅스</category>
      <category>cassandra</category>
      <category>csql</category>
      <category>Linux</category>
      <category>openssl</category>
      <category>Python</category>
      <category>SSL</category>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/475</guid>
      <comments>https://janggom.tistory.com/475#entry475comment</comments>
      <pubDate>Sun, 5 Apr 2020 20:39:13 +0900</pubDate>
    </item>
    <item>
      <title>한빛소프트에서 나온 깃헙책이랑 파이썬 책 본 적이 있는데</title>
      <link>https://janggom.tistory.com/474</link>
      <description>&lt;p&gt;공통점이 중간에 예제보면 miku miku 거려서&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;설마하며 찾아보니 같은 저자여서 개 웃겼는데&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아무튼 흠흠..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/474</guid>
      <comments>https://janggom.tistory.com/474#entry474comment</comments>
      <pubDate>Sun, 5 Aug 2018 00:18:45 +0900</pubDate>
    </item>
    <item>
      <title>php mysql관련 책</title>
      <link>https://janggom.tistory.com/473</link>
      <description>&lt;p&gt;성공적인 웹 프로그래밍 php와 mysql 책을 추천함&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;생 초보자는 좀 그렇고 생코에서 php 강의 한번 들어 본뒤에 볼 것을 추천함&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;데이터 저장 관련이랑 보안도 틈틈이 알려줘서 전체적인 배경지식 쌓기에 좋음&lt;/p&gt;</description>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/473</guid>
      <comments>https://janggom.tistory.com/473#entry473comment</comments>
      <pubDate>Sun, 5 Aug 2018 00:11:42 +0900</pubDate>
    </item>
    <item>
      <title>리버싱 관련 책</title>
      <link>https://janggom.tistory.com/472</link>
      <description>&lt;p&gt;리버싱 시작할 때&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;리버싱 책 중 개 두꺼운거 말고&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;crack on me로 쓴 책 있는데 이거 읽는거 추천함&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;책 제목은 기억 안 남 아마 흰색 표지일 꺼임&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;시간이 부족해서 crack on me 2개까지만 풀어봄&lt;/p&gt;</description>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/472</guid>
      <comments>https://janggom.tistory.com/472#entry472comment</comments>
      <pubDate>Sun, 5 Aug 2018 00:06:58 +0900</pubDate>
    </item>
    <item>
      <title>예제로 쉽게 배우는 스프링</title>
      <link>https://janggom.tistory.com/471</link>
      <description>&lt;p&gt;첨에 스프링 배울때 스프링 인 액션이라는 책 봤는데&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;욕만 나오더라 용어만 덕지덕지 해놓고 무슨&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;용어를 설명하는데 또 다른 용어를 사용하면서 설명함 어쩌라고&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;10쪽 까지 읽다가 버리진 않고 어딘가에 처박아 둔 기억이 있음&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그 이후에 스프링 책하면 유명하다는 토비인가 이것도 도서관에서 잠깐 봤는데&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&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;그렇게 해서 찾은 책이 스프링 프레임 워크3.0 임&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;스프링 처음 볼때 이걸로 시작하는걸로 추천함&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;스프링책 몇 권 뒤져봤는데 이거보다 쉽게 쓴 책 없었음&lt;/p&gt;</description>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/471</guid>
      <comments>https://janggom.tistory.com/471#entry471comment</comments>
      <pubDate>Sun, 5 Aug 2018 00:01:56 +0900</pubDate>
    </item>
    <item>
      <title>후니의 네트워크</title>
      <link>https://janggom.tistory.com/470</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;기사 공부하다가 라우터, 스위치, 허브 하도 뭔지 감도 안와서 물어보다가&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;추천받아서 읽게 된 책인데&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;책은 엄청 두꺼운데 총 2권짜리&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;안에 내용은 장난스럽게 쉽게 읽어진다. 1권은 그냥 쭉 읽어짐&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;책 보면 제일 웃기던게&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;문체가 그냥 현직에 종사하던 사람이&amp;nbsp;바로 앞에서 가르쳐 주는 문체임&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그리고 이상하게 글에서 아재의 냄새가 남&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&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;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&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;/p&gt;</description>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/470</guid>
      <comments>https://janggom.tistory.com/470#entry470comment</comments>
      <pubDate>Sat, 4 Aug 2018 23:44:57 +0900</pubDate>
    </item>
    <item>
      <title>자바 병렬 프로그래밍 책</title>
      <link>https://janggom.tistory.com/469</link>
      <description>&lt;p&gt;자바 스레드 공부할 일 생겨서&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;자바 병렬프로그래밍(좀 예전에 나오고 지금 절판)이랑 자바 프로그래밍(고슬링) 보고 있는데&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&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;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예제도 두리뭉실하지 않게 안티코드랑 같이 실려서 구분하기 좋음&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데 옛날 책이라서 그런지 예제로 서블릿랑&amp;nbsp;같이 나와서&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;대충 글만 보고 넘겼는데&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1장에서만 그렇고 그 이후 예제는 단독&amp;nbsp;스레드 처리 예제라서 보는데는 문제 없었음&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;단점은 이거 읽으면 읽으수록&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;실제로 현직에 있는 사람들이&amp;nbsp;어떻게 사용하는지 감이 잘 안 옴&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;갈수록&amp;nbsp;생각할게 많아져서 복잡해짐&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&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;2주가 거의 다 되서 도서관에 책 반납해야 하는건 함정&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;책을 사던가 해야지&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/469</guid>
      <comments>https://janggom.tistory.com/469#entry469comment</comments>
      <pubDate>Sat, 4 Aug 2018 23:34:44 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴] Singleton Pattern</title>
      <link>https://janggom.tistory.com/465</link>
      <description>&lt;p&gt;&lt;b&gt;1. 싱글톤 의미&lt;/b&gt;&lt;/p&gt;&lt;p&gt;클래스가 하나의 인스턴스만 가질 수 있게 보증한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. 써야할 때&lt;/b&gt;&lt;/p&gt;&lt;p&gt;어떤 클래스의 인스턴스 생성 개수의 제어가 필요할 때&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. 사용 예&lt;/b&gt;&lt;/p&gt;&lt;p&gt;원도우 매니저&lt;/p&gt;&lt;p&gt;프린터 스풀러&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. 싱글톤 코드1&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: 217px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/996530355B0EBC4532&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F996530355B0EBC4532&quot; width=&quot;217&quot; height=&quot;161&quot; filename=&quot;2.PNG&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;17&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;18&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;19&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;20&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;21&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;22&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;23&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;24&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;25&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;26&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;27&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;28&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;29&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;30&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;31&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;32&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;33&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;34&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;35&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;36&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;37&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;package&lt;/span&gt;&amp;nbsp;com.tistory.janggom.base;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;class&lt;/span&gt;&amp;nbsp;Singleton{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;static&lt;/span&gt;&amp;nbsp;Singleton&amp;nbsp;one;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;protected&lt;/span&gt;&amp;nbsp;Singleton(){}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;static&lt;/span&gt;&amp;nbsp;Singleton&amp;nbsp;getInstance(){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;if&lt;/span&gt;(one&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;null&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;synchronized&lt;/span&gt;(Singleton.&lt;span style=&quot;color:#ff3399&quot;&gt;class&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;if&lt;/span&gt;(one&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;null&lt;/span&gt;){&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//Double&amp;nbsp;Checked&amp;nbsp;Locking&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;one&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;new&lt;/span&gt;&amp;nbsp;Singleton();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;return&lt;/span&gt;&amp;nbsp;one;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;class&lt;/span&gt;&amp;nbsp;SingletonEx&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;void&lt;/span&gt;&amp;nbsp;main(&lt;span style=&quot;color:#4be6fa&quot;&gt;String&lt;/span&gt;[]&amp;nbsp;args)&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Singleton&amp;nbsp;s1&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;Singleton.getInstance();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Singleton&amp;nbsp;s2&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;Singleton.getInstance();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;println&lt;/span&gt;(s1);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;println&lt;/span&gt;(s2);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color:#4f4f4f; text-decoration:none&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none; color:white&quot;&gt;&lt;span style=&quot;font-size:9px; word-break:normal; background-color:#4f4f4f; color:white; border-radius:10px; padding:1px&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;보통 책에 나오는 기본적인 thread-safe한 싱글톤&lt;/p&gt;&lt;p&gt;생성자를 private를 해서 외부에서의 new 키워드를 막고,&lt;/p&gt;&lt;p&gt;다른 스레드를 막기 위해 더블 체크 사이에 synchronized를 사용했다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;구글링해서 발견한건데 이 코드가 완벽한것처럼 보이는데&amp;nbsp;&lt;/p&gt;&lt;p&gt;초반에 메모리 할당 시간이랑 인스턴스 생성 시간 차이로 인해 다음&amp;nbsp;스레드가 null값을 리턴할 경우가 있단다!!!!&lt;/p&gt;&lt;p&gt;정말로 극극극극극극극악의 확률이라서 걍 써도 무방할 듯 하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;걱정되면 인스턴스 생성후(16)&amp;nbsp;thread.sleep를 아주 조금 주는 방법이 있겠다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;4. 싱글톤 코드2&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: 206px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99197D385B0EBC4516&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99197D385B0EBC4516&quot; width=&quot;206&quot; height=&quot;283&quot; filename=&quot;캡처.PNG&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#272727; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #4f4f4f&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#aaa; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;17&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;18&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;19&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;20&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;21&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;22&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;23&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;24&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;25&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;26&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;27&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;28&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;29&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;30&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#f0f0f0; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;package&lt;/span&gt;&amp;nbsp;com.tistory.janggom.threadsafe;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;class&lt;/span&gt;&amp;nbsp;Singleton&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;private&lt;/span&gt;&amp;nbsp;Singleton()&amp;nbsp;{}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;static&lt;/span&gt;&amp;nbsp;Singleton&amp;nbsp;getInstance()&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;return&lt;/span&gt;&amp;nbsp;LazyHolder.INSTANCE;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;class&lt;/span&gt;&amp;nbsp;LazyHolder&amp;nbsp;{&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;내부&amp;nbsp;클래스(참조시에만&amp;nbsp;메모리에&amp;nbsp;로딩,&amp;nbsp;Lazy&amp;nbsp;Initialization)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;final&lt;/span&gt;&amp;nbsp;Singleton&amp;nbsp;INSTANCE&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;new&lt;/span&gt;&amp;nbsp;Singleton();&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;class&lt;/span&gt;&amp;nbsp;SingletonEx2&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;void&lt;/span&gt;&amp;nbsp;main(&lt;span style=&quot;color:#4be6fa&quot;&gt;String&lt;/span&gt;[]&amp;nbsp;args)&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Singleton&amp;nbsp;s1&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;Singleton.getInstance();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Singleton&amp;nbsp;s2&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;Singleton.getInstance();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;println&lt;/span&gt;(s1);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#4be6fa&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color:#4be6fa&quot;&gt;println&lt;/span&gt;(s2);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color:#4f4f4f; text-decoration:none&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;text-decoration:none; color:white&quot;&gt;&lt;span style=&quot;font-size:9px; word-break:normal; background-color:#4f4f4f; color:white; border-radius:10px; padding:1px&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;동기화(synchronized)를 사용 안해도 되는 싱글톤&lt;/p&gt;&lt;p&gt;내부 클래스를 사용해서 safe도 보증한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/465</guid>
      <comments>https://janggom.tistory.com/465#entry465comment</comments>
      <pubDate>Thu, 31 May 2018 00:31:16 +0900</pubDate>
    </item>
    <item>
      <title>UML 필요성과 특징</title>
      <link>https://janggom.tistory.com/463</link>
      <description>&lt;p&gt;&lt;b&gt;1. UML(Unified Modeling Language)의 필요성&lt;/b&gt;&lt;/p&gt;&lt;p&gt;UML이 있기 전의 시스템의 개발은 &quot;운이 좋으면 성공하고, 그렇지 않으면 망한다&quot;는 말로 흔히 표현했다. 시스템 개발 초창기에는 프로그래머들이 프로그래머들만의 이해와 논리로 시스템을 구축하였기 때문에, 그 결과물은 의뢰인의 입장에서 보았을 때 부족함이 많을 수밖에 없었다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;의뢰인의 요구사항에 맞는 소프트웨어 셀계의 필요성은 바로 설계 표기에 대한 필요성을 낳았으며, 더 나아가 시스템 개발에서 분석가, 의뢰인, 개발자가 효율적으로 의사소통하며 표준으로 받아들일 수 이는 시스템 설계를 위해 마련한 표기법이 바로 UML이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. UML 특징&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;UML는 가시화 언어이다.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;시스템의 개념 모델을 시각적인 그래픽 형태로 작성하며, 그 표기법에 있어서는 각 심벌에 명확한 정의가 존재한다.&amp;nbsp;&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;UML는 명세화 언어이다.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;소프트웨서 개발 과정인 분석, 설계, 구현 단계의 각 과저에서 필요한 모델을 정확하고 완전하게 명세화를 가능하게 만든다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;UML는 구축 언어이다.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;UML는 자바,&amp;nbsp;C#과 같은 프로그램 언어로 표현할 수 있다. UML로 명세화된 설계 모델은 프로그램 소스 코드로 변환 가능하며, 반대로 소스코드를 UML 역변환하며 분석하는 역공학(Reverse Engineering)도 가능하다.&lt;/p&gt;&lt;ul style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;UML는 문서 언어이다.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;UML은 시스템 아키텍처와 이에 대한 모든 상세 내역에 대한 문서화를 다루며, 요구사항을 표현하고 시스템을 테스트하는 언어도 제공한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/463</guid>
      <comments>https://janggom.tistory.com/463#entry463comment</comments>
      <pubDate>Mon, 28 May 2018 01:24:45 +0900</pubDate>
    </item>
    <item>
      <title>유스케이스와 유스케이스의 관계</title>
      <link>https://janggom.tistory.com/461</link>
      <description>&lt;p&gt;유스케이스 다이어그램에서 유스케이스간의 관계는 의존(Dependency, -----&amp;gt;)관계로 표현되며,&lt;/p&gt;&lt;p&gt;스테레오타입(&amp;lt;&amp;lt;stereotype&amp;gt;&amp;gt;)으로 명확하게 표현한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. 유스케이스간 포함관계(&amp;lt;&amp;lt;include&amp;gt;&amp;gt;)&lt;/p&gt;&lt;p&gt;유스케이스간 포함관계는 하나의 유스케이스를 수행할 때,&amp;nbsp;&lt;/p&gt;&lt;p&gt;같은 기능을 가진 다른 유스케이스가 &lt;b&gt;&lt;i&gt;반드시 수행&lt;/i&gt;&lt;/b&gt;하는 것을 말한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 유스케이스간 확장관계(&amp;lt;&amp;lt;extends&amp;gt;&amp;gt;)&lt;/p&gt;&lt;p&gt;확장관게의 유스케이스는 포함관계처럼 여러 유스케이스에 걸쳐 중복적으로 사용되지 않고,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;i&gt;특정 조건&lt;/i&gt;&lt;/b&gt;에서 한 유스케이스로만 확장되는 것을 의미한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. 확장 유스케이스와 포함 유스케이스&lt;/p&gt;&lt;p&gt;확장관계에 있는 유스케이스 사이의 이벤트 흐름은 포함관계에 있는 유스케이스 사이의 이벤트 흐름과 유사하다.&lt;/p&gt;&lt;p&gt;즉 기준 유스케이스의 이벤트 흐름이 수행되었다가 확장점을 만나면 지정된 유스케이스의 이벤트 이벤트 흐름으로 분기된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;포함관계&lt;/th&gt;
&lt;th&gt;확장관계&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;목적&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;&lt;li&gt;여러 유스케이스에 공통적인 기능을 표현하기 위해 사용된다.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;&lt;li&gt;기준 유스케이스에 부가적으로 추가된 기능을 표현하기 위해서 사용된다.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;이벤트 흐름&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;&lt;li&gt;포함된 유스케이스로의 이벤트 흐름 분기가 필수적이다.&lt;/li&gt;&lt;li&gt;기준 유스케이스 이후의 이벤트 흐름이 포환된 유스케이스의 수행 결과에 의존한다.&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
&lt;td&gt;&lt;ul&gt;&lt;li&gt;확장 유스케이스에 기술된 조건에 따라 선택적으로 수행된다.&lt;/li&gt;&lt;li&gt;기준 유스케이스 이후의 이벤트 흐름이 확장 유스케이스의 결과에 의존하지 않는다&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/461</guid>
      <comments>https://janggom.tistory.com/461#entry461comment</comments>
      <pubDate>Sun, 27 May 2018 17:44:53 +0900</pubDate>
    </item>
    <item>
      <title>batch for문 정리</title>
      <link>https://janggom.tistory.com/460</link>
      <description>&lt;p&gt;배치문법 공부하다가 for문이 제일 헷갈리고&amp;nbsp;x같아서&lt;/p&gt;&lt;p&gt;따로 for문을 정리해보았다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;&amp;nbsp;for문 안에서의 루프 변수 형태&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;FOR &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;%%변수&lt;/b&gt;&lt;/span&gt; IN (집합) DO 명령어&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;1. 배치파일(일괄 프로그램) 내에 작성할때는 루프변수는 %%변수 형태&lt;/p&gt;&lt;p&gt;2. 대문자, 소문자 구분함&lt;/p&gt;&lt;p&gt;3. 한 글자만 가능&lt;/p&gt;&lt;p&gt;4. 사용시 %%변수 형태로 그대로 사용&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;예) loopvar.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for %%c in (miku daisuki) do echo %%c&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;출력은&amp;nbsp;&lt;/p&gt;&lt;p&gt;miku&lt;/p&gt;&lt;p&gt;daisuki&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;2. for문 안에서의 (집합) 형태&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;FOR %%변수&amp;nbsp;IN &lt;b&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;(집합)&lt;/span&gt;&lt;/b&gt; DO 명령어&lt;/p&gt;&lt;/div&gt;&lt;p&gt;기본적으로 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;(파일명)&lt;/span&gt;, &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;(&quot;문자열&quot;)&lt;/span&gt; 형태가 있는데&lt;/p&gt;&lt;p&gt;여기서 (파일명)은 파일명 아닌거 같으면 걍 문자열로 처리한다.&lt;/p&gt;&lt;p&gt;위의 예제 loopvar.cmd 처럼 말이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예) dirFor1.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for %%c in (*) do echo %%c&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;현재 폴더의 파일 목록을 출력해준다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예2) dirFor2.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for %%c in (*.cmd *.bak) do echo %%c&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;현재 폴더에서 확장자가 cmd이거나 bak인 파일 목록 출력&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예3) dirFor3.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for %%c in (* miku daisuki) do echo %%c&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;현재 폴더의 파일들을 출력하고 문자열 miku와 문자열 daisuki도 출력&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그리고 여러개를 처리할때는 사이에 &lt;b&gt;공백&lt;/b&gt;이나 &lt;b&gt;콤마(,)&lt;/b&gt; &lt;b&gt;세미클론(;)&lt;/b&gt;을 넣는다.&lt;/p&gt;&lt;p&gt;예4) multiSet.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;for %%a in (1;2 3,4) do echo %%a&lt;/p&gt;&lt;/div&gt;&lt;p&gt;1 2 3 4가 각 줄에 출력된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(파일명)과 (&quot;문자열&quot;) 외에&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;('명령어')&lt;/span&gt;가 있는데 이건 특수한 옵션에서만 쓰인다&amp;nbsp;&lt;/p&gt;&lt;p&gt;밑에서 다시 보도록 하자&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;3. 증감 For문&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;FOR &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;/L&lt;/b&gt;&lt;/span&gt; %%변수 IN &lt;b&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;(시작,단&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;계,끝)&lt;/span&gt;&lt;/b&gt; DO 명령문&lt;/p&gt;&lt;/div&gt;&lt;p&gt;이건 그냥 형태만 봐도 감이 온다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예) optionL.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for /L %%a in (1,2,100) do echo %%a&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;1부터 100까지 홀수 출력&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;4. recursive for문&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;FOR &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;/R&lt;/b&gt;&lt;/span&gt; [경로] %%변수 IN (집합) DO 명령어&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;경로에서 recursive하게 탐색하여 각 디렉토리마다 for문을 실행한다.&lt;/p&gt;&lt;p&gt;경로를 생략하면 현재 폴더에서 탐색을 시작한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예) findyadong.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for /r c:\ %%a in (*.mp4 *.avi) do echo %%a&lt;/p&gt;&lt;p&gt;pause&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;5. directory For문&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;FOR &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;/D&lt;/b&gt;&lt;/span&gt; %변수 IN (집합) DO 명령어&lt;/p&gt;&lt;/div&gt;&lt;p&gt;(파일명) -&amp;gt; (폴더명)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예) directoryFor.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for /d %%a in (*) do echo %%a&lt;/p&gt;&lt;p&gt;pause &amp;gt;&amp;nbsp; nul&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&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: 14pt;&quot;&gt;6. file For&amp;nbsp;문&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;FOR &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;/F [&quot;옵션&quot;]&lt;/b&gt;&lt;/span&gt; %변수 IN (집합) DO 명령어&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;주로 파일 내용을&amp;nbsp;파싱할 때 사용한다.&lt;/p&gt;&lt;p&gt;(집합)이 (파일명)일 때 파일 내용을 한 줄씩 for문을 돌려 파싱하고&lt;/p&gt;&lt;p&gt;(집합)이 (&quot;문자열&quot;)일 때 문자열을 파싱한다.&lt;/p&gt;&lt;p&gt;(집합)이&amp;nbsp;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;('명령어')&lt;/span&gt;일 때 명령어&amp;nbsp;결과값을 파싱한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 때 &lt;b&gt;파싱하는 규칙&lt;/b&gt;은 &lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;[&quot;옵션&quot;]&lt;/span&gt;에서 정한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;delims(delimeters, 구분자) : 문자열을&amp;nbsp;나누는 기호 문자,&amp;nbsp;생략시 공백(스페이스,탭)으로 나눈다.&lt;/p&gt;&lt;p&gt;tokens : 구분자로 나뉘어진 것을 각각 토큰이라 한다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;토큰들과 루프 변수에 1:1로 대응하도록 한다.&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin-left: 4em;&quot;&gt;이 때 루프변수의 다음 알파벳으로 자동 대응된다.&lt;/p&gt;&lt;p&gt;skip : 생략할 행 번호 설정&lt;/p&gt;&lt;p&gt;eol : 시작 문자로 생략할&amp;nbsp;행 설정, 생략시 ;(세미클론)으로 시작하는 행은 생략된다.&lt;/p&gt;&lt;p&gt;usebackq : 대체 인용, 파일명에 공백이 들어 갈때 문자열로 처리하는걸 막거나 명령문에 특수문자가 들어갈때 오류 방지&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예1) replaceTest.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for /f &quot;delims=: tokens=1,2&quot; %%a in (&quot;hello:world&quot;) do echo %%a-%%b&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;구분자(:)로 문자열 &quot;hello:world&quot;를 &quot;hello&quot; 와 &quot;world&quot; 토큰으로 나누게 되고&lt;/p&gt;&lt;p&gt;첫번째 토큰(&quot;hello&quot;)와 두번째 토큰 2(&quot;world&quot;)는 각각 %%a 와 %%b에 대응되어서&lt;/p&gt;&lt;p&gt;출력은 hello-world가 출력된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예2) hostsView.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for /f &quot;skip=5 delims= tokens=1&quot; %%a in (c:\Windows\System32\drivers\etc\hosts) do echo %%a&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;hosts 파일내용이 5번째 행까지는 스킵한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;구분자가 없으므로 hosts 파일 내부 각 행이 통채로 토큰이 되어서 %%a에 대응된다.&lt;/p&gt;&lt;p&gt;결국 hosts파일 내용이 6번째 행부터 그대로 출력된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예3) useTokens.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;FOR /F &quot;tokens=4 delims=,&quot; %%G IN (&quot;deposit,$4500,123.4,12-AUG-09&quot;) DO echo %%G&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&quot;deposit,$4500,123.4,12-AUG-09&quot; 문자열을 구분자(,)로 나누어&amp;nbsp;&lt;/p&gt;&lt;p&gt;&quot;deposit&quot; &quot;$4500&quot; &quot;123.4&quot; &quot;12-AUG-09&quot; 4개의 토큰을 만든다.&lt;/p&gt;&lt;p&gt;4번째 토큰을 루프변수 %%G에 대응시켜&lt;/p&gt;&lt;p&gt;출력값은 12-AUG-09&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예4) useTokens2.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;FOR /F &quot;tokens=1-3 delims=,&quot; %%G IN (&quot;deposit,$4500,123.4,12-AUG-09&quot;) DO echo %%G+%%H+%%I&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;첫번째 토큰부터 3번째 토큰까지 각각 %%G %%H %%I에 대응시켜&lt;/p&gt;&lt;p&gt;deposit+$4500+123.4 를 출력한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예6) useTokens3.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;FOR /F &quot;tokens=1,2* delims=,&quot; %%G IN (&quot;deposit,$4500,123.4,12-AUG-09&quot;) DO echo %%G+%%H+%%I&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;첫번째 토큰과 2번째 토큰은 각각 %%G %%H에 대응되고&lt;/p&gt;&lt;p&gt;그 이후 문자열은 모두 %% I에 대응시킨다.&lt;/p&gt;&lt;p&gt;출력값은&amp;nbsp;deposit+$4500+123.4,12-AUG-09로 나온다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예7) eolTest.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;: 주석입니다&lt;/p&gt;&lt;p&gt;FOR /F &quot;eol=: tokens=* delims=&quot; %%G IN (eolTest.cmd) DO echo %%G&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;현재 파일의 각 행을 읽어서&lt;/p&gt;&lt;p&gt;:로 시작하는 문장을 제외한 각 행을 출력한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예8)&amp;nbsp;&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: 512px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99CFD83C5AEFD71617&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99CFD83C5AEFD71617&quot; width=&quot;512&quot; height=&quot;418&quot; filename=&quot;dir.PNG&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;파일명만 파싱해서 파일에 저장해보자&lt;br /&gt;&lt;/p&gt;&lt;p&gt;파일은 8번째 행부터 보이니깐 =&amp;gt; skip=7&lt;/p&gt;&lt;p&gt;5번째 열부터 파일이름이 시작함 =&amp;gt; token=5*&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;dirParsing.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for /f &quot;skip=7 tokens=5*&quot; %%a in ('dir') do echo %%a %%b&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&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: 210px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99C2343E5AEFDA6926&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99C2343E5AEFDA6926&quot; width=&quot;210&quot; height=&quot;299&quot; filename=&quot;dir2.PNG&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;뽑았긴 했는데 뒤에 남음도 생겼다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;dirParsing2.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;for /f &quot;skip=7 tokens=5*&quot; %%a in ('dir') do (&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if %%a neq 남음 echo %%a %%b&lt;/p&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&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: 177px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/991BBE415AEFDB7B2F&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F991BBE415AEFDB7B2F&quot; width=&quot;177&quot; height=&quot;282&quot; filename=&quot;dir3.PNG&quot; filemime=&quot;image/png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;제대로 뽑았다.&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;dirParsingF.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;@echo off&lt;/p&gt;&lt;p&gt;for /f &quot;skip=7 tokens=5*&quot; %%a in ('dir') do (&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;if %%a neq 남음 echo %%a %%b &amp;gt; dirlist.txt&lt;/p&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사실 위의 코드는&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;dir /b &amp;gt; dirlist.txt&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;이걸로 끝난다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&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: 14pt;&quot;&gt;7. local 변수&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;배치 for문 짜다보면 누구나&amp;nbsp;약속된 시간이 찾아오는데&lt;/p&gt;&lt;p&gt;바로 for문 밖 지역변수를&amp;nbsp;쓰다가 생각한거랑 다르게 작동하는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;localvarTest.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;set sum=0&lt;/p&gt;&lt;p&gt;FOR /l %%G in (1,1,5) Do (&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;echo [%sum%] &amp;amp; set /a sum+=%%G&lt;/p&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;echo Total = %sum%&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;[0]&lt;/p&gt;&lt;p&gt;[0]&lt;/p&gt;&lt;p&gt;[0]&lt;/p&gt;&lt;p&gt;[0]&lt;/p&gt;&lt;p&gt;[0]&lt;/p&gt;&lt;p&gt;Total = 15&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1부터 5까지 숫자를 더하고 출력하는 예제인데&lt;/p&gt;&lt;p&gt;출력값을 보면 이상하다. 분명 중간중간 sum값을 출력했는데 0이 나오고&lt;/p&gt;&lt;p&gt;마지막 sum값은 제대로 나온다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;batch파일 특성 때문인데&lt;/p&gt;&lt;p&gt;1. 한줄단위로&amp;nbsp;명령어를 실행된다.&lt;/p&gt;&lt;p&gt;2. 코드 실행전 확장(expansion)이 한번 일어난다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;문자를 파싱한다. -&amp;gt; 문자를 확장(expansion) 한다. -&amp;gt; 실행한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;확장이란것은 실행하기 전 내부 프로세스에서 명령어를 다시 조합한다고 이해하면 될 듯하다.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;이프케이프 문자열 확장하거나 괄호를 확장한다거나 변수를 확장한다거나 명령어를 확장한다거나&lt;/p&gt;&lt;p&gt;여러가지 확장들이 있는데 여기서 문제가 되는게 변수확장(variable expansion)이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위에서 작성한 코드는 다음 과정으로 한줄 씩 처리된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;set sum=0 &lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;지역변수 sum에 0을 할당한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;FOR %%G in (1,2,3,4,5) Do ( echo [0] &amp;amp; set /a sum+=%%G )&lt;/p&gt;&lt;/div&gt;&lt;p&gt;for /l문은 일반 for문으로 확장되고, %sum%은 0값으로 확장된다.&lt;/p&gt;&lt;p&gt;set /a는 연산처리 하도록 내부에서 확장된다.&lt;/p&gt;&lt;p&gt;여기서 확장은 한줄에 한번만 일어나기 때문에&amp;nbsp;&lt;/p&gt;&lt;p&gt;%sum%값은 계속 0인채로 출력되는 것이다.&amp;nbsp;실제 sum 값은 증가(할당)하고 있지만.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;echo Total = 15&lt;/p&gt;&lt;/div&gt;&lt;p&gt;이 명령어를 읽을 때는 sum값이 15이므로 %sum%이 15로 확장된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 변수확장을 이용한 재밌는 예제가 있는데&lt;/p&gt;&lt;p&gt;swapVar.cmd&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;set var1=1&lt;/p&gt;&lt;p&gt;set var2=2&lt;/p&gt;&lt;p&gt;set var1=%var2% &amp;amp;set var2=%var1%&lt;/p&gt;&lt;p&gt;echo var1 : %var1%&lt;/p&gt;&lt;p&gt;echo var2 : %var2%&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;set var1=%var2% &amp;amp;set var2=%var1%&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 명령어는 실행전 변수 확장으로&lt;/p&gt;&lt;p&gt;set var1=2 &amp;amp;set var2=1&amp;nbsp;&lt;/p&gt;&lt;p&gt;로 변한다. 임시 변수 사용없이 스왑이 가능하다는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그럼 이제 변수확장 이걸&amp;nbsp;어떻게 풀어야 할까&lt;/p&gt;&lt;p&gt;2가지 방법이 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. setlocal enabledelayedexpansion 로 확장을 실행할때로 지연시키고&amp;nbsp;&lt;/p&gt;&lt;p&gt;기호 문자 !를 사용하여&amp;nbsp;loop 돌때마다 확장시키는 것이다.&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;set sum=0&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;setlocal enabledelayedexpansion&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;FOR /l %%G in (1,1,5) Do (&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;echo [&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;!&lt;/b&gt;&lt;/span&gt;sum&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;!&lt;/b&gt;&lt;/span&gt;] &amp;amp; set /a sum+=%%G&lt;/p&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;echo Total = %sum%&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;/p&gt;&lt;/div&gt;&lt;p&gt;이렇게 하면 loop 돌때마다 변수확장이 매번 일어난다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 외부에서 처리 한다.(서브루틴을 사용한다.)&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;@echo off&lt;/p&gt;&lt;p&gt;set sum=0&lt;/p&gt;&lt;p&gt;FOR /l %%G in (1,1,5) Do (&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;call :outsub %%G&lt;/b&gt;&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;echo Total = %sum%&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;goto :end&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;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;:outsub&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;echo [%sum%] &amp;amp; set /a sum+=&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;%1&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;exit/b&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;&lt;b&gt;:end&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;pause &amp;gt; nul&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&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: 14pt;&quot;&gt;8. 나만을 위한 예제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;다음은 이 글 전체 주제와 관계 없는 글입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 그냥 심심해서 돌아다니는 batch파일들 중 일부를 해석해보았다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;a href=&quot;http://www.snoopybox.co.kr/1403&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(0, 85, 255);&quot;&gt;http://www.snoopybox.co.kr/1403&lt;/span&gt;&lt;/a&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;:: MKV 파일을 MP4로 변환하는 과정입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;if not exist temp md temp&lt;/p&gt;&lt;p&gt;rem temp 폴더가 없으면 temp 폴더를 만들어라&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;del /q temp\*.*&lt;/p&gt;&lt;p&gt;rem temp 폴더 안 파일 모두 묻지고 않고 삭제&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;for %%a in (*.mkv) do (&lt;/p&gt;&lt;p&gt;rem 현재 폴더에서 mkv 확장자인 동영상들을 for문 돌린다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Tools\mkvinfo &quot;%%a&quot; --output-charset UTF-8 -o temp\temp1.txt&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem 파일 정보 추출 해서 temp폴더에 텍스트 저장&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;Tools\mediainfo &quot;%%a&quot; &amp;gt; temp\temp2.txt&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem 파일 정보 추출 해서 temp폴더에 텍스트 저장&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;findstr /c:&quot;Frame rate&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:&quot; temp\temp2.txt &amp;gt; temp\temp3.txt&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem 텍스트 파일에서 해당 문자열을 포함한 행을 찾아서 다른 텍스트 파일에 저장(동영상의 fps)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;findstr /c:&quot;Track type&quot; temp\temp1.txt &amp;gt; temp\temp4.txt&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem 텍스트 파일에서 해당 문자열을 포함한 행을 찾아서 다른 테스트 파일에 저장(track별 type)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;for /f &quot;tokens=5&quot; %%d in (temp\temp4.txt) do (&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem 텍스트 파일에서 공백으로 나누어진 토큰 중 5번째로 for문으로 돌린다(순 track별 type)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;if not exist temp\temp.h264 (&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;rem h264파일이 존재안하면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if %%d==video Tools\mkvextract tracks &quot;%%a&quot; 1:temp\temp.h264 2:temp\temp.audio&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;rem 타입이 video이면 위 방식으로 추출&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;if %%d==audio Tools\mkvextract tracks &quot;%%a&quot; 2:temp\temp.h264 1:temp\temp.audio&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;			&lt;/span&gt;rem 타입이 audio이면 위 방식으로 추출&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;findstr /c:&quot;Codec ID: A_AAC&quot; temp\temp1.txt &amp;gt; nul&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem 텍스트 파일에서 해당 문자열을 포함한 행을 찾아서 다른 텍스트에 저장&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;if errorlevel 1 (&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem acc 코덱인 오디오가 존재 안하면(위에서 해당 문자열을 찾지 못했을 때)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;Tools\ffmpeg -i temp\temp.audio -ac 2 temp\temp.wav&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;rem 먼저 wav로 인코딩&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;Tools\neroAacEnc -if temp\temp.wav -lc -br 128000 -of temp\temp.aac&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;rem 다음 aac로 인코딩&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;) else (&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem acc 코덱인 오디오가 존재하면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;ren temp\temp.audio temp.aac&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;rem 확장자 acc로 변경&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;for /f &quot;tokens=4 usebackq&quot; %%c in (temp\temp3.txt) do (&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem 프레임 정보&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;Tools\mp4box -fps %%c -add temp\temp.h264:level=3.1 -add temp\temp.aac &quot;%%~na.mp4&quot;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;		&lt;/span&gt;rem acc파일과 h264파일을 mp4파일로 만듦&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;del /q temp\*.*&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;rem temp 폴더안에 파일 다 지움&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;코드 해석해보니깐 문제점을 감히 나열해보면&lt;/p&gt;&lt;p&gt;1. fps를 따로 뽑던데 마지막에 mp4box돌릴 때&amp;nbsp;fps 굳이 안줘도 알아서 계산해서 합쳐짐&amp;nbsp;&lt;/p&gt;&lt;p&gt;2. 듀얼 오디오나 자막이 존재할 때 오디오 하나 빼고 다 버려짐&lt;/p&gt;&lt;p&gt;(이게 좀 큰 문제임)&lt;/p&gt;&lt;p&gt;3. 메타 데이터 없어짐 아마도 합쳐진 mp4 영상정보 보면 메타데이터 엉망일꺼임&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4. 가변 프레임 가지고 있는건 처리 못함&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;시간남으면 일부 무단 수정해봐야지.feat ffmpeg&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/460</guid>
      <comments>https://janggom.tistory.com/460#entry460comment</comments>
      <pubDate>Mon, 7 May 2018 20:19:46 +0900</pubDate>
    </item>
    <item>
      <title>scrapy install error</title>
      <link>https://janggom.tistory.com/459</link>
      <description>&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;&amp;nbsp;error: Microsoft Visual C++ 14.0 is required. Get it with &quot;Microsoft Visual C++ Build Tools&quot;: http://landinghub.visualstudio.com/visual-cpp-build-tools&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;저기 홈페이지로 가서 뭐 깔라고 되있는데&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted&lt;/p&gt;&lt;p&gt;여기서 해당 버전 다운받아서&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;pip install Twisted‑17.9.0‑cp36‑cp36m‑win32.whl&lt;/p&gt;&lt;p&gt;한뒤&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;pip install scrapy&amp;nbsp;&lt;/p&gt;&lt;p&gt;다시 설치하면 완료&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>python</category>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/459</guid>
      <comments>https://janggom.tistory.com/459#entry459comment</comments>
      <pubDate>Sun, 29 Apr 2018 19:36:55 +0900</pubDate>
    </item>
    <item>
      <title>덕 타이핑(Duck typing)</title>
      <link>https://janggom.tistory.com/458</link>
      <description>&lt;div class=&quot;txc-textbox&quot; style=&quot;border-style: solid; border-width: 1px; border-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding: 10px;&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/div&gt;
&lt;pre style=&quot;background:#000;color:#f8f8f8&quot;&gt;&lt;p&gt;&lt;span style=&quot;color:#99cf50&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;text-decoration:underline&quot;&gt;Duck&lt;/span&gt;:
        &lt;span style=&quot;color:#99cf50&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#89bdff&quot;&gt;quack&lt;/span&gt;(&lt;span style=&quot;color:#3e87e3&quot;&gt;self&lt;/span&gt;): &lt;span style=&quot;color:#e28964&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color:#65b042&quot;&gt;&lt;span style=&quot;color:#99cf50&quot;&gt;u&lt;/span&gt;&quot;꽥꽥!&quot;&lt;/span&gt;
        &lt;span style=&quot;color:#99cf50&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#89bdff&quot;&gt;feathers&lt;/span&gt;(&lt;span style=&quot;color:#3e87e3&quot;&gt;self&lt;/span&gt;): &lt;span style=&quot;color:#e28964&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color:#65b042&quot;&gt;&lt;span style=&quot;color:#99cf50&quot;&gt;u&lt;/span&gt;&quot;오리에게 흰색, 회색 깃털이 있습니다.&quot;&lt;/span&gt;

&lt;span style=&quot;color:#99cf50&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;text-decoration:underline&quot;&gt;Person&lt;/span&gt;:
        &lt;span style=&quot;color:#99cf50&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#89bdff&quot;&gt;quack&lt;/span&gt;(&lt;span style=&quot;color:#3e87e3&quot;&gt;self&lt;/span&gt;): &lt;span style=&quot;color:#e28964&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color:#65b042&quot;&gt;&lt;span style=&quot;color:#99cf50&quot;&gt;u&lt;/span&gt;&quot;이 사람이 오리를 흉내내네요.&quot;&lt;/span&gt;
        &lt;span style=&quot;color:#99cf50&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#89bdff&quot;&gt;feathers&lt;/span&gt;(&lt;span style=&quot;color:#3e87e3&quot;&gt;self&lt;/span&gt;): &lt;span style=&quot;color:#e28964&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color:#65b042&quot;&gt;&lt;span style=&quot;color:#99cf50&quot;&gt;u&lt;/span&gt;&quot;사람은 바닥에서 깃털을 주어서 보여 줍니다.&quot;&lt;/span&gt;

&lt;span style=&quot;color:#99cf50&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#89bdff&quot;&gt;in_the_forest&lt;/span&gt;(&lt;span style=&quot;color:#3e87e3&quot;&gt;duck&lt;/span&gt;):
        duck.quack()
        duck.feathers()

&lt;span style=&quot;color:#99cf50&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#89bdff&quot;&gt;game&lt;/span&gt;():
        donald &lt;span style=&quot;color:#e28964&quot;&gt;=&lt;/span&gt; Duck()
        john &lt;span style=&quot;color:#e28964&quot;&gt;=&lt;/span&gt; Person()
        in_the_forest(donald)
        in_the_forest(john)&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;해당 변수, 메소드만 가지고 있으면 다른건 무시하고 실행한다는 뜻이다.&lt;/p&gt;&lt;p&gt;솔직히 자료형을 명시안해도 되는&amp;nbsp;파이썬이기 때문에&amp;nbsp;모르고&amp;nbsp;사용하고 있음&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;타 언어들은 덕 타이핑을 제네릭으로 표현 하던데&amp;nbsp;&lt;/p&gt;&lt;p&gt;아무래도 덕 타이핑 개념에는 파이썬이 딱 맞지 않을까?&amp;nbsp;&lt;/p&gt;</description>
      <category>python</category>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/458</guid>
      <comments>https://janggom.tistory.com/458#entry458comment</comments>
      <pubDate>Sun, 29 Apr 2018 00:33:42 +0900</pubDate>
    </item>
    <item>
      <title>클래스 메소드에 인수로 self 주는 이유</title>
      <link>https://janggom.tistory.com/457</link>
      <description>&lt;p&gt;self가 반드시 필요한 것은 아니다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);&quot;&gt;self를 안 쓰고 쓰는 차이는&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: rgb(255, 94, 0); color: rgb(255, 255, 255);&quot;&gt;클래스 변수, 메소드&lt;/span&gt;와 &lt;span style=&quot;background-color: rgb(70, 115, 255); color: rgb(255, 255, 255);&quot;&gt;인스턴스의 변수, 메소드&lt;/span&gt;중 뭘 만드는 가이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;background:#000;color:#f8f8f8&quot;&gt;&lt;span style=&quot;color:#99cf50&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;text-decoration:underline&quot;&gt;WhySelf&lt;/span&gt;:

    class_variable &lt;span style=&quot;color:#e28964&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#3387cc&quot;&gt;1&lt;/span&gt;

    &lt;span style=&quot;color:#99cf50&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#89bdff&quot;&gt;&lt;span style=&quot;color:#dad085&quot;&gt;__init__&lt;/span&gt;&lt;/span&gt;(&lt;span style=&quot;color:#3e87e3&quot;&gt;self&lt;/span&gt;):
        &lt;span style=&quot;color:#3e87e3&quot;&gt;self&lt;/span&gt;.instance_variable &lt;span style=&quot;color:#e28964&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#3387cc&quot;&gt;2&lt;/span&gt;
    
    &lt;span style=&quot;color:#99cf50&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#89bdff&quot;&gt;instance_func&lt;/span&gt;(&lt;span style=&quot;color:#3e87e3&quot;&gt;self&lt;/span&gt;):
        &lt;span style=&quot;color:#e28964&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color:#65b042&quot;&gt;'instance_func'&lt;/span&gt;)
    
    &lt;span style=&quot;color:#99cf50&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color:#89bdff&quot;&gt;class_func&lt;/span&gt;():
        &lt;span style=&quot;color:#e28964&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color:#65b042&quot;&gt;'class_func'&lt;/span&gt;)

&lt;span style=&quot;color:#e28964&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#e28964&quot;&gt;/&lt;/span&gt;클래스 함수, 변수 사용
WhySelf.class_func()
&lt;span style=&quot;color:#e28964&quot;&gt;print&lt;/span&gt;(WhySelf.class_variable)

&lt;span style=&quot;color:#e28964&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#e28964&quot;&gt;/&lt;/span&gt;인스턴스 함수, 변수 사용
x &lt;span style=&quot;color:#e28964&quot;&gt;=&lt;/span&gt; WhySelf()

x.instance_func()
WhySelf.instance_func(x)
&lt;span style=&quot;color:#aeaeae;font-style:italic&quot;&gt;#x.class_func()&lt;/span&gt;
&lt;span style=&quot;color:#e28964&quot;&gt;print&lt;/span&gt;(x.class_variable)
&lt;span style=&quot;color:#e28964&quot;&gt;print&lt;/span&gt;(x.instance_variable)
&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&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;a href=&quot;http://neopythonic.blogspot.kr/2008/10/why-explicit-self-has-to-stay.html&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;color: rgb(0, 85, 255);&quot;&gt;http://neopythonic.blogspot.kr/2008/10/why-explicit-self-has-to-stay.html&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>python</category>
      <category>Self</category>
      <category>파이썬</category>
      <author>장곰부대</author>
      <guid isPermaLink="true">https://janggom.tistory.com/457</guid>
      <comments>https://janggom.tistory.com/457#entry457comment</comments>
      <pubDate>Sat, 28 Apr 2018 23:45:28 +0900</pubDate>
    </item>
  </channel>
</rss>