<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>{ BLog: &amp;quot;heyoon2j&amp;quot; }</title>
    <link>https://yoonix.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 21 Aug 2026 13:21:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>heyoon2j</managingEditor>
    <item>
      <title>Git fork &amp;amp; Pull request</title>
      <link>https://yoonix.tistory.com/237</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #2f5496;&quot;&gt;&lt;b&gt;Git fork &amp;amp; Pull requset&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;Fork vs Clone 차이&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Fork&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;- 하나의 Remote Repository를 복사한다. 변경 권한이 없어 기존 Remote Repository에 영향을 주지 못한다.&lt;/p&gt;
&lt;p&gt;- Pull Request를 통해 변경을 요청하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Clone&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;- Remote Repository를 Local Repository로 복사한다.&lt;/p&gt;
&lt;p&gt;- 권한이 없으면 push를 하지 못한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;Pull request 순서&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Project를 자신의 Github로 Fork 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pdz97/btqKJ2GrGgK/1NjYPLvGP3QdAA9BsvdKK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pdz97/btqKJ2GrGgK/1NjYPLvGP3QdAA9BsvdKK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pdz97/btqKJ2GrGgK/1NjYPLvGP3QdAA9BsvdKK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpdz97%2FbtqKJ2GrGgK%2F1NjYPLvGP3QdAA9BsvdKK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;- Github에 해당 Project Repository에 들어가 Fork를 누르면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그렇게 되면 자신의 Repository를 확인하면, 복사가 된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Fork 한 Repostiry를 자신의 Local Repository에 복사한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lPWip/btqKIqt3ryT/UY5Ad20lgbhrlzqfLprEKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lPWip/btqKIqt3ryT/UY5Ad20lgbhrlzqfLprEKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lPWip/btqKIqt3ryT/UY5Ad20lgbhrlzqfLprEKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlPWip%2FbtqKIqt3ryT%2FUY5Ad20lgbhrlzqfLprEKk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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 data-ke-size=&quot;size16&quot;&gt;- Code 버튼을 클릭하면 Clone 할 수 있는 주소가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해당 주소는 복사한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1602554020146&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/heyoon2j/maze-game.git&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자신의 터미털을 켜고, 다음과 같이 명령어를 입력한다(Windows를 쓰시는 분은 Git bash와 같은 터미널 프로그램을 설치하는 것을 추천한다)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. branch 생성, 이동&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 코드에 영향을 주지 않고, 독립적으로 개발을 진행하기 위해서는 branch가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1602554681396&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# git checkout -b &amp;lt;branch Name&amp;gt;
$ git checkout -b dev

$ git branch -a&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;$ git checkout -b dev&lt;/b&gt; : dev라는 branch를 생성하고, 해당 branch로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;$ git branch -a&lt;/b&gt; : 모든 branch의 리스트를 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;* 만약 Fork를 통해 기존에 생성되어 있는 branch로 이동하려면, 위의 checkout 명령어에서 &quot;-b&quot; 옵션을 제거하면 된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 개발 진행 후&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1) Add, Commit 작업을 통해 Local Repository에 저장한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602555432857&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git add README.md

$ git commit -m &quot;docs: Initialization README.md&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2) 원하는 Remote Repository에 Push 작업을 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602555617461&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 연결된 Repository list 출력
$ git remote -v

# git push [Remote Repository Name] [Branch Name]
$ git push origin dev&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;$ git push [Repository Name] [Branch]&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: 해당 Repository의 Branch에 Push 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. Pull request 보내기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- push 후에 자신의 github 저장소에 Compare &amp;amp; pull request 버튼이 활성화되어 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 버튼을 클릭하고, Pull request를 생성한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6. Code Review 및 Merge pull request&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Pull Request를 받은 Project 관리자가 Merge를 할지 말지 결정한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;7. 동기화&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Project는 여러 사람이 계속 업데이트를 하기 때문에 작업 후에 최신 버전으로 업데이트할 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1) 최신 업데이트를 하기 위해 실제 Project Repository를 Remote Repository를 추가한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602590090985&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git remote add upstream https://github.com/heyoon2j/maze-game.git

$ git remote -v
origin	https://github.com/theVebper/maze-game.git (fetch)
origin	https://github.com/theVebper/maze-game.git (push)
upstream	https://github.com/heyoon2j/maze-game.git (fetch)
upstream	https://github.com/heyoon2j/maze-game.git (push)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;$ git remote add [Repository Name] [Remote Repository Address]&lt;/b&gt; : 해당 주소의 Remote Repositoy를 Repository Name으로 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 리스트를 확인하면 추가되어 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2) upstream repository로부터 최신 데이터를 업데이트한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602590283964&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git fetch upstream
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
오브젝트 묶음 푸는 중: 100% (3/3), 1.34 KiB | 686.00 KiB/s, 완료.
https://github.com/heyoon2j/maze-game URL에서
 * [새로운 브랜치]   main       -&amp;gt; upstream/main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;$ git fetch [Repository Name]&lt;/b&gt; : 해당 Name을 가진 Repository를 업데이트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3) 업데이트한 최신 데이터와 자신의 branch와 병합한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602590458032&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git checkout main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 먼저 병합할 branch로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;$ git checkout [Branch Name]&lt;/b&gt; : 해당 branch로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1602590541549&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git merge upstream/main
업데이트 중 a7894a5..f53f3b7
Fast-forward
 README.md | 76 ++++++++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 51 insertions(+), 25 deletions(-)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;$ git merge [Branch Name]&lt;/b&gt; : 현재 Branch와 입력한 Branch와 병합한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;* 2)과 3)번을 한 번에 할 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602556427084&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; $ git pull [Remote Repository Name]
 # Remote Repository의 fetch 후 merge 한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- &lt;b&gt;$ git pull [Remote Repository Name] [Branch]&lt;/b&gt;: &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Remote Repository의 Branch를 현재 Branch로 가지고 온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;참고 사이트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://milooy.wordpress.com/2017/06/21/working-together-with-github-tutorial/&quot;&gt;https://milooy.wordpress.com/2017/06/21/working-together-with-github-tutorial/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* &lt;/b&gt;&lt;a href=&quot;https://velog.io/@hyunju-song/202010-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8git-workflow&quot;&gt;velog.io/@hyunju-song/202010-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8git-workflow&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;a href=&quot;https://velog.io/@imacoolgirlyo/Git-fork%EC%99%80-clone-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-5sjuhwfzgp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;velog.io/@imacoolgirlyo/Git-fork%EC%99%80-clone-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-5sjuhwfzgp&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;* &lt;a href=&quot;https://wayhome25.github.io/git/2017/07/08/git-first-pull-request-story/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;wayhome25.github.io/git/2017/07/08/git-first-pull-request-story/&lt;/a&gt;&lt;/p&gt;</description>
      <category>Tool/Git</category>
      <category>#git #github</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/237</guid>
      <comments>https://yoonix.tistory.com/237#entry237comment</comments>
      <pubDate>Tue, 13 Oct 2020 13:10:17 +0900</pubDate>
    </item>
    <item>
      <title>Java Wrapper Class</title>
      <link>https://yoonix.tistory.com/236</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #2f5496;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;■ Java Wrapper Class&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 기본형 타입을 객체로 쓰기 위해 있는 클래스&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기본형&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Wrapper Class&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;byte&lt;/td&gt;
&lt;td&gt;Byte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;char&lt;/td&gt;
&lt;td&gt;Character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;short&lt;/td&gt;
&lt;td&gt;Short&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;long&lt;/td&gt;
&lt;td&gt;Long&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;Float&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;double&lt;/td&gt;
&lt;td&gt;Double&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Wrapper Class 생성 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;valueOf() 이용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602441106570&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Integer integer1 = Integer.valueOf(10);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;new 키워드 이용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602441128695&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Integer integer = new Integer(10);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Autoboxing &amp;amp; unboxing&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Autoboxing&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 기본 자료형을 Wrapper Class로 자동 변환 시킴&lt;/p&gt;
&lt;pre id=&quot;code_1602441552371&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Integer integer2 = 10;
Character character2 = 'A';&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Unboxing&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 기본 자료형이 필요한 자리에 Wrapper Class를 사용하는 경우, 자동으로 변환&lt;/p&gt;
&lt;pre id=&quot;code_1602441624438&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static Integer add(Integer x, Integer y){
    return x + y;   // UnBoxing, 클래스는 덧셈이 안 된다.
                    // 자동으로 기본 자료형으로 변형되어서 계산
                    // 여기서 반환 시에는 다시 Autoboxing이 이루어짐
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Wrapper Class의 값 비교&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Wrapper Class는 Reference Type이므로 == 연산자를 이용하여 비교할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1602441685995&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Integer intOne = new Integer(100);
Integer intTwo = new Integer(100);

System.out.println(intOne == intTwo); // false
System.out.println(intOne.equals(intTwo)) // true
System.out.println(intOne == 100) // true (Unboxing)    &lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;4. 문자열 &amp;lt;-&amp;gt; 기본 자료형&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* parse+자료형 정적 메서드 사용하여 문자열 -&amp;gt; 기본 자료형&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602441771741&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  int x = Integer.parseInt(&quot;123&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* valueOf 이용하여 문자열 -&amp;gt; Wrapper Class&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602441784452&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Integer y = new Integer(&quot;100&quot;); // 오버로딩되어 있음
Integer z = Integer.valueOf(&quot;5555&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding/Java</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/236</guid>
      <comments>https://yoonix.tistory.com/236#entry236comment</comments>
      <pubDate>Mon, 12 Oct 2020 03:43:59 +0900</pubDate>
    </item>
    <item>
      <title>Java Collection Framework</title>
      <link>https://yoonix.tistory.com/235</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #2f5496;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;■ Java Collection Framework&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* java.utils에 속한 일련의 클래스로, 자료구조를 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 잘 짜인 인터페이스를 기반으로 다양한 자료구조를 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 제네릭 클래스로 되어있어, 다양한 객체를 요소로 담을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; JCF 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. List 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Collection 인터페이스를 상속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 데이터의 순서(index)가 유일한 데이터의 구분자(identifier)로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Ex&amp;gt; [1, 3, 2, 5, 6, 2, 1] : 같은 값이 있으나, index가 다름&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Set 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Collection Interface 상속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 순서가 없는 데이터 {집합}을 다루는 인터페이스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 중복되는 데이터를 효율적으로 제거하는 데 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 중복을 검사하는 수단으로 hashCode(), equals()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - hash를 빠르게 계산해서 hash만 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 그 다음에 판정이 나지&amp;nbsp; 않으면, equasl()로 추가 비교&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Map 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Collection Interface 상속하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* Key, Value 쌍으로 구성된 자료의 집합을 다루는 인터페이스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Map.Entry&amp;lt;K, V&amp;gt; 형태로 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Key는 중복될 수 없으며, Value는 중복이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Key가 identifier 역할을 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Collection 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Collection 인터페이스 주요 메서드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean add(E e)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;요소 e를 컬렉션에 추가한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean addAll(Collection&amp;lt;? extends E&amp;gt; c)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;다른 컬렉션 c의 모든 요소를 컬렉션에 추가한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;void clear()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션의 모든 요소를 제거한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean contains(Object o)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션에 요소 o가 존재하는 확인한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean containsAll(Collection&amp;lt;?&amp;gt; c)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션 c의 모든 요소가 컬렉션에 포함되는지 확인한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean isEmpty()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션이 비어있는지 확인한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Iterator iterator()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션의 Iterator를 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean remove(Object o)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션에서 요소 o를 제거한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean removeAll(Collection&amp;lt;?&amp;gt; c)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션 c에 속한 모든 요소를 컬렉션에서 제거한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean retainAll(Collection&amp;lt;?&amp;gt; c)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션 c에 포함된 객체만 남기고 나머지 요소를 제거한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;int size()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션에 속한 요소의 개수를 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;T[] toArray()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;컬렉션의 요소들을 T[] 배열로 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Iterator&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* iterator()로 반환되는 객체로, Collection에 저장된 요소에 접근하기 위해 사용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 80px;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;boolean hasNext()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;다음 요소가 있는지 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;E next()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;다음 요소가 있을 경우 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;void remove()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;현재 위치의 요소를 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* Iterator 활용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602430808400&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Iterator&amp;lt;String&amp;gt; iter = collection.iterator();
while (iter.hasNext()) {
  String string = iter.next();
  System.out.println(string);
}

for (String string: collection) {
  System.out.println(string);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; List 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;List 인터페이스 주요 메서드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 260px;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;void add(int index, E element)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;index 위치에 요소 element를 삽입한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;boolean addAll(int index, Collection&amp;lt;? extends E&amp;gt; c)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;index 위치부터 컬렉션 c의 모든 요소를 추가한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;E get(int index)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;index 위치에 저장된 요소를 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;&lt;b&gt;int indexOf(Object o)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;객체 o가 저장된 첫번째 인덱스를 반환한다. 없을 경우 -1을 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;&lt;b&gt;int lastIndexOf(Object o)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;객체 o가 저장된 마지막 인덱스를 반환한다. 없을 경우 -1을 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;ListIterator listIterator()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;ListIterator 객체를 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;E remove(int index)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;index에 위치한 객체를 제거하고, 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;E set(int index, E element)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;index에 위치한 요소를 element로 대체한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;&lt;b&gt;List subList(int fromIndex, int toIndex)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;fromIndex에 위치한 요소부터 toIndex의 직전에 위치한 요소까지 포함한 List를 반환한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;List 인터페이스의 구현체&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* List Collection&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602430974584&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;String&amp;gt; stringList = new ArrayList&amp;lt;&amp;gt;();    // 가장 많이 쓰이는, 배열 기반의 리스트
List&amp;lt;String&amp;gt; stringList1 = new LinkedList&amp;lt;&amp;gt;();  // 노드의 연결로 구성된 리스트
List&amp;lt;String&amp;gt; stringList2 = new Vector&amp;lt;&amp;gt;();      // 멀티스레드 환경에서 안전하게 동작하나... 너무 느리다!!!
List&amp;lt;String&amp;gt; stringList3 = new Stack&amp;lt;&amp;gt;();       // Vector를 더 제한한 방법, Stack 자료구조 구현&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* ArrayList&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 제네릭 클래스로 구현된 자료구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 배열을 기반으로 구현된 클래스로, 가장 자주 활용되며 활용도가 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - ArrayList의 생성자는 세 종류가 주어진다.&lt;/p&gt;
&lt;pre id=&quot;code_1602431040743&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public ArrayList()
public Arraylist(int initialCapacity)
public ArrayList(Collection&amp;lt;? extends E&amp;gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* LinkedList&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 제네릭 클래스로 구현된 자료구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp; 연결리스트를 기반으로 구현된 클래스로, 배열의 단점을 극복하기 위한 구현체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - ArrayList vs LinkedList&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&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;구현체&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;순차 추가/수정/삭제&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비순차 추가/수정/삭제&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;조 회&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;ArrayList&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;빠름&lt;/td&gt;
&lt;td&gt;느림&lt;/td&gt;
&lt;td&gt;빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;LinkedList&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;느림&lt;/td&gt;
&lt;td&gt;빠름&lt;/td&gt;
&lt;td&gt;느림&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;List 정렬&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Collections 클래스의 sort() 메서드 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* &lt;span&gt;public static &amp;lt;T extends Comparable&amp;lt;? super T&amp;gt; void sort(List&amp;lt;T&amp;gt; list)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 객체에 선언된 &lt;b&gt;public int compareTo(T t)&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메소드로 비교하여 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* &lt;span&gt;public static &amp;lt;T&amp;gt; void sort(List&amp;lt;T&amp;gt; list, Comparator&amp;lt;? super T&amp;gt; c)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Comparator 객체 c에 정의된&amp;nbsp;&lt;b&gt;public int compare(T o1, T o2) 메소드&lt;/b&gt;로 비교하여 정렬&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;ListIterator&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;listIterator()&lt;/b&gt;로 반환되는 객체로, 양방향 사용이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Iterator를 상속받은 클래스&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&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean hsaPrevious()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이전 요소가 있는지 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;E previous()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이전 요소가 있을 경우 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Set 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Set의 구현체&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* HashSet&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Set의 대표적인 구현체로, 기본적인 기능이 구현되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* TreeSet&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - NaviableSet 인터페이스를 구현하며,&amp;nbsp; 이진 탐색 트리 자료구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 객체를 삽입하는 동시에 정렬되는 특성상, 비교가 가능해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;b&gt;- TreeSet 메서드&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public E first()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정렬된 첫 요소를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public E last()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정렬된 마지막 요소를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public E lower(E e)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;e 객체의 바로 이전 객체를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public E higher(E e)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;e 객체의 바로 다음 객체를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public E floor(E e)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;e 또는 e 보다 이전 객체를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public E ceiling(E e)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;e 또는 e 보다 이후 객체를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public E pollFirst()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정렬된 첫 요소를 제거하고 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public E pollLast()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정렬된 마지막 요소를 제거하고 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public NavigableSet descendingSet()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;내림차순으로 정렬하는 객체를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public NavigableSet headSet(E toElement, boolean inclusive)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;toElement 이전 요소로 구성된 객체 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public NavigableSet tailSet(E fromElement, boolean inclusive)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;fromElement 이후 요소로 구성된 객체 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;fromElement 이후, toElement 이전 요소로 구성된 객체 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Map 인터페이스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Map&amp;lt;K, V&amp;gt;의 구현체&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; HashMap&amp;lt;K, V&amp;gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;: 가장 많이 사용되는 Map의 구현체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;TreeMap&amp;lt;K, V&amp;gt;&lt;/b&gt;&lt;/span&gt; : 정렬 기준이 더해진 NavigableMap을 구현한 구현체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Hashtable&amp;lt;K, V&amp;gt;&lt;/b&gt;&lt;/span&gt; : HashMap과 유사하지만 성능이 떨어지는 대신 멀티스레드에 안전한 구현체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Properties&lt;/b&gt;&lt;/span&gt; : 속성 파일을 손쉽게 관리하는, Hashtable&amp;lt;K, V&amp;gt;의 하위 클래스 구현체&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Map&amp;lt;K, V&amp;gt;의 주요 메서드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;void clear()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Map의 모든 요소를 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean containsKey(Object key)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key가 존재하는지 여부를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean containsValue(Object value)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;value가 존재하는지 여부를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Set&amp;lt;Map.Entry&amp;lt;K,V&amp;gt;&amp;gt; entrySet()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Map의 Entry 요소를 Set에 담아 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;V get(Object key)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key에 해당하는 value 객체 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Set keySet()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key 요소를 Set 형태로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;V put(K key, V value)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key와 value 쌍으로 구성된 Entry 추가. 기존에 등록된 key라면 해당 value를, 없으면 null을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;void putAll(Map&amp;lt;? extends K, ? extends V&amp;gt; m)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;m에 속한 모든 Entry를 추가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;V remove(Object key)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key에 해당하는 Entry를 제거하고 반환. 등록되지 않은 key라면 null 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Collection values&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;value 객체들을 Collection에 담아 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Collection values&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;value 객체들을 Collection에 담아 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;int size()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Map에 포함된 Entry 객체의 수 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;boolean isEmpty()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Map에 데이터가 없는지 여부 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;TreeMap&amp;lt;K, V&amp;gt;의 주요 메서드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public Map.Entry&amp;lt;K, V&amp;gt; firstEntry()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정렬된 첫 Entry 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public Map.Entry&amp;lt;K, V&amp;gt; lastEntry()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정렬된 마지막 Entry 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public Map.Entry&amp;lt;K, V&amp;gt; lowerEntry(K key)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key 바로 이전 Entry 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public Map.Entry&amp;lt;K, V&amp;gt; higherEntry(K key)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key 바로 다음 Entry 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public Map.Entry&amp;lt;K, V&amp;gt; floorEntry(K key)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key 또는 key 보다 이전 Entry 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public Map.Entry&amp;lt;K, V&amp;gt; ceilingEntry(K key)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key 또는 key 보다 이후 Entry 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public Map.Entry&amp;lt;K, V&amp;gt; pollFirstEntry()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정렬된 첫 Entry를 제거하고 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public Map.Entry&amp;lt;K, V&amp;gt; pollLastEntry()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;정렬된 마지막 Entry를 제거하고 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public NavigableSet descendingKeySet()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;내림차순으로 정렬하는 Set 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public NavigableSet descendingKeyMap()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;내림차순으로 정렬하는 Map 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public NavigableMap&amp;lt;K, V&amp;gt; headMap(K toKey, boolean inclusive)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;toKey 이전 Entry로 구성된 객체 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public NavigableMap&amp;lt;K, V&amp;gt; tailMap(K fromKey, boolean inclusive)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;fromKey 이후 Entry로 구성된 객체 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;public NavigableMap&amp;lt;K, V&amp;gt; subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;fromKey 이후, toKey 이전 Entry로 구성된 객체 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Properties의 주요 메서드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메서드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;getProperty()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key에 해당하는 속성 값을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;stringPropertyNames()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key의 목록을 Set으로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;setProperty()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;key로 value를 등록하고 기존 value 값을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;load()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;reader를 이용해 속성을 읽어온다. (.properties)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;loadFromXML()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;XML 형식으로 저장된 속성을 읽어온다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;store()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;writer를 이용해 속성을 저장한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;storeToXML()&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;XML 형식으로 속성 파일을 저장한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding/Java</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/235</guid>
      <comments>https://yoonix.tistory.com/235#entry235comment</comments>
      <pubDate>Thu, 8 Oct 2020 23:59:15 +0900</pubDate>
    </item>
    <item>
      <title>Java  I/O Stream</title>
      <link>https://yoonix.tistory.com/234</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #2f5496;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;■ Java I/O Stream&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Decorator Pattern으로 구현되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Java의 I/O 방식은 Node - Stream&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Node&lt;/b&gt; : 데이터의 소스 또는 데이터의 목적지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Node는 키보드(입력), 모니터(출력), 파일(입출력) 등을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Stream&lt;/b&gt; : Node로부터 데이터를 주고받는 통로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 입력으로 사용되는 스트림과 출력으로 사용되는 스트림은 별개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 입출력을 함께하는 것을 채널(Channel) : NIO(New Input/Output)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; I/O Stream 구분&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;I/O 대상 기준&lt;/b&gt; : Input Stream, Output Stream&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;자료의 종류&lt;/b&gt; : Byte 단위 Stream, 문자 단위 Stream&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Stream 기능&lt;/b&gt; : 기반 Stream, 보조 Stream&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; 표준 입출력&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* System 클래스의 표준 입출력 멤버&lt;/p&gt;
&lt;pre id=&quot;code_1602339417619&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class System{
    public static PrintStream out;
    public static InputStream in;
    public static PrintStream err;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; 기본 Stream 종류&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Byte 단위 Stream&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Byte 단위로 자료를 읽고 씀(동영상, 음악 파일 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;InputStream&lt;/b&gt; : 입력 스트림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;OutputStream&lt;/b&gt; : 출력 스트림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;* Method(Input)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 75.721%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메소드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;b&gt;int read()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;byte 하나를 읽어서 int로 반환. 읽을 값이 없으면 -1 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;b&gt;int read(byte[] b)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;데이터를 읽어 b에 저장하고, 읽은 바이트 수를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;b&gt;int read(byte[] b, int offset, int len)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;최대 len개의 바이트를 읽어 b의 offset 위치부터 채운다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;b&gt;void close()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;스트림을 종료하고 자원을 반납&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;b&gt;int available()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;읽을 수 있는 데이터의 크기를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;b&gt;long skip(long n)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;스트림에서 n 만큼 건너 뛴다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;b&gt;void mark(int readLimit)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;reset()으로 돌아갈 위치를 표시한다. readLimit은 돌릴 수 있는 최대 바이트 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;b&gt;void reset()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;mark()가 호출된 지점으로 돌아간다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 30.5467%;&quot;&gt;&lt;b&gt;boolean markSupported()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 63.6201%;&quot;&gt;mark, reset 메소드의 지원 여부를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;* Method(Output)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 76%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.7674%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메소드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.0677%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.7674%;&quot;&gt;&lt;b&gt;void write(int b)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.0677%;&quot;&gt;b의 끝 1byte를 출력 버퍼에 보낸다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.7674%;&quot;&gt;&lt;b&gt;void write(byte[] b)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.0677%;&quot;&gt;배열 b의 모든 Byte를 보낸다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.7674%;&quot;&gt;&lt;b&gt;void flush()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.0677%;&quot;&gt;출력 버퍼를 비운다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.7674%;&quot;&gt;&lt;b&gt;void close()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.0677%;&quot;&gt;스트림 종료. 내부적으로 flush() 호출한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;* Example&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602350477736&quot; class=&quot;java&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class InputOutputStream {
    public static void main(String[] args) {

        System.out.println(&quot;입력 &quot;);
        try {
            int i;
            InputStreamReader isr = new InputStreamReader(System.in);
            while((i = isr.read()) != '끝') {
                System.out.print((char) i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
} &lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 문자 단위 Stream&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Character(2 Btye) 단위로 &lt;span style=&quot;color: #333333;&quot;&gt;자료를 읽고 씀&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Reader&lt;/b&gt; : 입력 스트림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;b&gt;Writer&amp;nbsp;&lt;/b&gt;: 출력 스트림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;* Method(Input)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 76.1849%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메소드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;int read()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;char 하나를 읽어서 int로 반환. 읽을 값이 없으면 -1 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;int read(char[] cbuf)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;데이터를 읽어 cbuf에 저장하고, 읽은 char 수를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;int read(char[] cbuf, int offset, int len)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;최대 len개의 char를 읽어 cbuf의 offset 위치부터 채운다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;&lt;span&gt;int read(java.nio.CharBuffer target)&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;NIO target에 데이터를 저장한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;void close()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;스트림을 종료하고 자원을 반납&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;int available()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;읽을 수 있는 데이터의 크기를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;long skip(long n)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;스트림에서 n 만큼 건너 뛴다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;void mark(int readLimit)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;reset()으로 돌아갈 위치를 표시한다. readLimit은 돌릴 수 있는 최대 바이트 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;void reset()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;mark()가 호출된 지점으로 돌아간다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.0186%;&quot;&gt;&lt;b&gt;boolean markSupported()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0976%;&quot;&gt;mark, reset 메소드의 지원 여부를 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;* Method(Output)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 76.6511%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메소드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;void write(int c)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;c 내용을 char로 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;void write(char[] cbuf)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;배열 cbuf의 모든 char를 보낸다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;void write(char[] cbuf, int off, int len)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;cbuf의 off부터 (off + len - 1) 만큼을 문자열로 변환하여 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;void write(String str)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;str을 출력한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;void write(String str, int off, int len)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;str의 off부터 (off + len - 1) 만큼을 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;Writer append(CharSequence csq)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;csq를 출력하고 Writer 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;Writer append(CharSequence csq, int start, int end)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;csq의 start부터 end까지를 출력하고 Writer 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;Writer append(char c)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;c를 출력하고 Writer 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;void flush()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;출력 버퍼를 비운다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;&lt;b&gt;void close()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 53.8839%;&quot;&gt;스트림 종료. 내부적으로 flush() 호출한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; File Stream&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. FileInputStrea, FileOutputStream&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 파일명이나 File 객체를 이용하여 입출력 스트림 생성 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* FileOutputStream에서 boolean append를 true로 하면 기존 파일에 이어서 쓴다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. FileReader, FileWriter&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 파일명이나 File 객체를 이용하여 입출력 Reader 생성 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* FileWriter에서 &lt;span style=&quot;color: #333333;&quot;&gt;boolean append를 true로 하면 기존 파일에 이어서 쓴다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;* Example&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602350637164&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ReaderWriterStream {
    public static void main(String[] args) throws IOException {
        FileReader fis = new FileReader(&quot;src/reader.txt&quot;);
//        FileInputStream fis = new FileInputStream(&quot;src/reader.txt&quot;);
//        InputStreamReader isr = new InputStreamReader(fis);
        int i;
        while((i = fis.read())!= -1){
            System.out.println((char)i);
        }
        fis.close();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. File Constructor &amp;amp; Method&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 91.1628%; height: 219px;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px; width: 29.7674%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;생성자 및 메소드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 19px; width: 61.3954%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px; width: 29.7674%;&quot;&gt;&lt;b&gt;File(String pathname)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 40px; width: 61.3954%;&quot;&gt;pathname에 해당하는 파일 생성. 기본 경로는 애플리케이션의 시작 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 29.7674%;&quot;&gt;&lt;b&gt;File(String parent, String child)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 61.3954%;&quot;&gt;parent 경로 아래 child 파일 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 29.7674%;&quot;&gt;&lt;b&gt;File(File parent, String child)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 61.3954%;&quot;&gt;parent 경로 아래 child 파일 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 29.7674%;&quot;&gt;&lt;b&gt;File(URI uri)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 61.3954%;&quot;&gt;file로 시작하는 URI 객체를 이용해 파일 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 29.7674%;&quot;&gt;&lt;b&gt;boolean createNewFile()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 61.3954%;&quot;&gt;새로운 파일을 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 29.7674%;&quot;&gt;&lt;b&gt;boolean mkdir()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 61.3954%;&quot;&gt;새로운 디렉토리를 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 29.7674%;&quot;&gt;&lt;b&gt;boolean mkdirs()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 61.3954%;&quot;&gt;경로상의 모든 디렉토리를 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 29.7674%;&quot;&gt;&lt;b&gt;boolean delete()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 61.3954%;&quot;&gt;파일/디렉토리 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; width: 29.7674%;&quot;&gt;&lt;b&gt;void deleteOnExit()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 61.3954%;&quot;&gt;애플리케이션 종료시 자동으로 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.7674%;&quot;&gt;&lt;b&gt;boolean exist()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 61.3954%;&quot;&gt;해당 파일이 존재하는지 여부&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;* RandomAccessFile Class&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 입출력 클래스 중 유일하게 파일 입출력을 동시에 할 수 있는 클래스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 파일 포인터가 있어서 읽고 쓰는 위치의 이동이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;* Example&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602350096720&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// File.separator를 이용하여 &quot;\&quot; 표현할 수 있다.
String filePath = &quot;D:&quot; + File.separator + &quot;Temp&quot; + File.separator + &quot;MyTemp&quot;;

File fileOne = new File(filePath);
fileOne.mkdir();

File fileTwo = new File(filePath, &quot;file2.txt&quot;);
fileTwo.createNewFile();

File fileThree = new File(fileOne, &quot;file3.txt&quot;);
fileThree.createNewFile();

File fileFour = new File(new URI(&quot;file:///d:/Temp/MyTemp/file4.txt&quot;));
fileFour.createNewFile();
fileFour.deleteOnExit();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 그 외 File 클래스의 주요 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 69.4883%;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메소드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;b&gt;getName()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;파일 이름 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;b&gt;getPath()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;입력된 경로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;b&gt;isAbsolute()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;절대 경로를 사용하는지? 여부 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;b&gt;getAbsolutePath()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;절대 경로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;b&gt;getCanonicalPath()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;상위 경로 기호(&quot;..&quot;)가 없어진 절대 경로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;b&gt;isDirectory()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;해당 File이 Directory인지? 여부 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;b&gt;isFile()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;해당 File이 File인지? 여부 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;b&gt;list()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;해당 Path의 리스트 반환, String Array로 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.2326%;&quot;&gt;&lt;b&gt;listFiles()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 45.5635%;&quot;&gt;해당 Path의 리스트 반환, File 객체 Array로 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; 보조 Stream&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 실제로 읽고 쓰는 Stream이 아닌 보조적인 기능을 추가하는 Stream&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;* FilterInputStream과 FilterOutputStream이 보조 Stream의 상위&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;protected FilterInputStream(InputStream in)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;public FilterOutputStream(OutputStream out)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Byte -&amp;gt; char Stream&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Byte를 문자 기반으로 변환시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;InputStreamReader(InputStream is)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;OutputStreamWriter(OutputStream os)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 스트림 자료형 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - &lt;b&gt;Character Set : utf-8, ms949, euc-kr&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602351109667&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;InputStreamReader readerOne = new InputStreamReader(System.in);
InputStreamReader readerTwo = new InputStreamReader(System.in, &quot;utf-8&quot;);

OutputStreamWriter writerOne = new OutputStreamWriter(System.out);
OutputStreamWriter writerTwo = new OutputStreamWriter(System.out, &quot;ms949&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Buffered Stream&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 내부에 8192byte 배열을 가지고 있어, 읽거나 쓸 때의 속도를 향상(Throughput 향상)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - throughtput : 평균 전송량 / 파일의 입출력 등 한 번에 많은 양을 보내는 것이 효율적일 때 신경 쓴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - delay : 지연 시간 / 게임, 반응성이 중요한 경우, 버퍼링을 쓰게 되면 오히려 안 좋을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&lt;b&gt;&lt;span&gt; BufferedInputStream&lt;/span&gt;(InputStream is)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&lt;b&gt;&lt;span&gt; BufferedOutputStream&lt;/span&gt;(OutputStream os)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;BufferedReader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;BufferedWriter&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;&lt;b&gt;String readLine()&amp;nbsp;&lt;/b&gt;: Line Feed(\n)와 Carriage Return(\n)을 제거해주고 한 줄을 읽어 들인다.&lt;/p&gt;
&lt;pre id=&quot;code_1602351557589&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;File src = new File(&quot;./src.txt&quot;);
try (BufferedReader buffReader = new BufferedReader(new FileReader(src));) {
  String line = null;
  while ((line = br.readLine()) != null) {
    System.out.println(line);
  }
} catch (IOException e) {
  e.printStackTrace();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Data Stream&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 자료가 저장된 상태 그대로 자료형을 유지하며 읽기, 쓰기 기능을 제공하는 Stream&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;DataInputStream&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;DataOutputStream&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;readByte(), readShort(), writeInt(), writeUTF()&lt;/b&gt; 등 메서드가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1602351745511&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;File src = new File(&quot;c:/Temp/data.dat&quot;);
try (DataOutputStream out = new DataOutputStream(new FileOutputStream(src))) {
  out.writeUTF(&quot;UTF-8&quot;);
  out.writeInt(15);
  out.writeFloat(14.23);
}

try (DataInputStream in = new DataInputStream(new FileInputStream(src))) {
  String string = in.readUTF();
  int integer = in.readInt();
  float floatNum = in.readFloat();
  System.out.println(string + &quot; &quot; + integer + &quot; &quot; + floatNum);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. Print Stream&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 문자열 표현 Stream&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;PrintReader&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;PrintWriter&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602351857870&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class SubStream{
    public static void main(String[] args){
        try(FileOutputStream fos = new FileOutputStream(&quot;data.txt&quot;);
                DataOutputStream dos = new DataOutputStream(fos);
                FileInputStream fis = new FileInputStream(&quot;data.txt&quot;);
                DataInputStream dis = new DataInputStream(fis)){

            dos.writeByte(100);
            dos.write(100);
            dos.writeChar('A');
            dos.writeUTF(&quot;안녕하세요&quot;);

            System.out.println(dis.readByte());
            System.out.println(dis.read());
            System.out.println(dis.readChar());
            System.out.println(dis.readUTF);

        }catch(Exception e){
            e.printStackTrace();            
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. 직렬화(Serialization&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 인스턴스의 상태를 그대로 저장하거나 Network로 전송하고, 이를 다시 복원(Deserialization)하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 보조 Stream으로 Object Stream 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;ObjectInputStream&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;ObjectOutputStream&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;readObject(), writeObject()&lt;/b&gt; 메소드 이용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 직렬화를 위해서는 해당 클래스에&amp;nbsp;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;Serializable Interface&lt;/b&gt;&lt;/span&gt;를 사용하여 명시해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* HAS-A 관계인 경우, 관계 Class들 모두 Serialization 해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1602352101109&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Foo implements Serializable { // has-a 관계의 모든 클래스가 Serializable이어야 함
  static final long serialVersionUID = 1L; // 객체의 버전 관리
  // 클래스 버전을 따로 관리하는 이유는 클래스 내용 자체가 바뀔 수 있기 때문에
  // 객체를 저장할 때와 불러올 때 같은지 체크하여
  // serialVersionUID가 일치하지 않으면 실패

  String userName;
  int id;

  transient String passWord; // transient 키워드, 해당 코드는 직렬화하지 말라는 의미
  // Password는 중요 정보이기 때문에 포함시키지 않기 위해서

  @Override
  public String toString() {
    return userName + &quot; &quot; + id + &quot; &quot; + passWord;
  }
}

class FooTest {
  public static void main (String [] args) {
    File dst = new File(&quot;C:/Temp/obj.data&quot;);
    Foo foo = new Foo();
    foo.userName = &quot;yoon&quot;;
    foo.id = 142;
    foo.passWord = &quot;qwer1234&quot;;

    try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(dst));
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(dst));) {
      out.writeObject(foo);
      Object read = in.readobject();
      if (read != null &amp;amp;&amp;amp; read instanceof Foo) {
        Foo readFoo = (Foo)read;
        System.out.println(readFoo);
      }
    } catch (IOException | ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 부모 클래스가 Serializable이 아닌 경우 자식 클래스에서 직접 처리해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - readObject(), writeObject()를 자식 클래스에서 직접 구현&lt;/p&gt;
&lt;pre id=&quot;code_1602352193314&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class ParentFoo {
  int memVarOne;
  double memVarTwo;
}

class ChildFoo extends ParentFoo implements Serializable {
  @Override
  private void writeObject(ObjectOutputStream out) throws IOException {
    out.writeInt(memVarOne);
    out.writeDouble(memVarTwo);
    out.defaultWriteObject();
  }
  
  @Override
  private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    memVarOne = in.readInt();
    memVarTwo = in.readDouble();
    in.defaultReadObject();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;nbsp;&lt;b&gt;Externalizable Interface&lt;/b&gt;를 이용하여 읽기, 쓰기에 대해 정의할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; -&amp;nbsp;&lt;b&gt;writeExternal, readExternal&lt;/b&gt; 함수 Override&lt;/p&gt;</description>
      <category>Coding/Java</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/234</guid>
      <comments>https://yoonix.tistory.com/234#entry234comment</comments>
      <pubDate>Thu, 8 Oct 2020 23:58:38 +0900</pubDate>
    </item>
    <item>
      <title>Java 코드 작성 습관</title>
      <link>https://yoonix.tistory.com/233</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 반복문을 줄여야 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 리소스를 계속 사용하기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Dynamic Lookup을 줄인다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; instanceOf()와 같은 메서드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 필요시 순수 함수 형식으로 코드 짜기(객체뿐만 아니라 함수도 모듈화가 된다)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 당연히 필요시에는 OOP 준수(Real-Time과 같은 쓰레딩 부분 등 Critical 한 부분)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. Stream과 Collection, 기본적인 속도는 for 문이 Stream 보다 빠르다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 기존 Collection을 재사용해야 되는데, Collection의 변경이 필요한 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Prototype으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. Object 클래스의 메서드 Overriding&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 자주 사용하는 메소드 : equals(), hashCode(), clone(), toString()&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6. 배열 복사할 때, System.arraycopy() 사용&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; native로 되어있기 때문에 좀 더 최적화가 되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;7. Comparator &amp;amp; Comparable Interface 사용&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; compare(T o1, T o2) &amp;amp; copareTo(T o) 메서드 이용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 배열 Sort : Arrays.sort()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Collection Sort : Collection.sort()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;8. 문자열의 추가, 수정, 삭제가 빈번한 경우, StringBuffer &amp;amp; StringBuilder&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; String은 immutable 속성을 가지기 때문에 변경이 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; StringBuffer는 동기화 키워드를 지원하므로, 멀티스레드 환경에서 안전하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; StringBuilder는 동기화를 지원하지 않기 때문에, 단일 스레드 환경에서 성능이 더 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Example&lt;/p&gt;
&lt;pre id=&quot;code_1603349140188&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            int k = Integer.parseInt(br.readLine());
            System.out.println(((int)Math.pow(2, k) - 1));
            move(k, 1, 2, 3);
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void move(int k, int src, int mid, int dst) throws IOException {
        if (k &amp;gt; 0){
            move(k-1, src, dst, mid);
            bw.write(src + &quot; &quot; + dst + &quot;\n&quot;);
            move(k-1, mid, src, dst);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;9. String &amp;lt;-&amp;gt; 기본 자료형 변경할 때&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 기본 자료형으로 변경 : Integer.parseInt()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 클래스형으로 변경 : Integer.valueOf()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;10. Math 클래스 메소드 활용을 줄이자&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 1) *2 or /2의 경우, Shift 연산자 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; =&amp;gt; * 2 : &amp;lt;&amp;lt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; =&amp;gt; / 2 : &amp;gt;&amp;gt; 또는 * 0.5를 이용하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 2) Math.floor()과 Math.ceil 대신 int 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; Math.floor() : int(3.5)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; Math.ceil() : int(3.5) + 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; 3) Math.abs() 대신 * -1 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; =&amp;gt; Math.abs() : (a &amp;gt; 0) ? a : a * -1&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 출처 : &lt;a href=&quot;https://rockonflash.wordpress.com/2007/08/11/optimizations-for-as3-calculations/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;rockonflash.wordpress.com/2007/08/11/optimizations-for-as3-calculations/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;* 계속 추가될 예정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Coding/Java</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/233</guid>
      <comments>https://yoonix.tistory.com/233#entry233comment</comments>
      <pubDate>Thu, 8 Oct 2020 23:44:15 +0900</pubDate>
    </item>
    <item>
      <title>Java Code Convention(Google Java Style 정리)</title>
      <link>https://yoonix.tistory.com/231</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #2f5496;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;■ Code Java Code Convention&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;Google Java Code Convention &lt;span&gt;정리&lt;br /&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;공식 문서 &lt;/span&gt;: &lt;a href=&quot;https://google.github.io/styleguide/javaguide.html&quot;&gt;https://google.github.io/styleguide/javaguide.html&lt;/a&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1602059099466&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Google Java Style Guide&quot; data-og-description=&quot;1 Introduction This document serves as the complete definition of Google's coding standards for source code in the Java&amp;trade; Programming Language. A Java source file is described as being in Google Style if and only if it adheres to the rules herein. Like ot&quot; data-og-host=&quot;google.github.io&quot; data-og-source-url=&quot;https://google.github.io/styleguide/javaguide.html&quot; data-og-url=&quot;https://google.github.io/styleguide/javaguide.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://google.github.io/styleguide/javaguide.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://google.github.io/styleguide/javaguide.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Google Java Style Guide&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;1 Introduction This document serves as the complete definition of Google's coding standards for source code in the Java&amp;trade; Programming Language. A Java source file is described as being in Google Style if and only if it adheres to the rules herein. Like ot&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;google.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;1. Source file 기본 사항&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1.1. File name&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;Source file&lt;span&gt;은 대소문자를 구분한 이름을 가지고&lt;/span&gt;, 확장자는 .java로 지정한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1.2. File encoding: UTF-8&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;Source file&lt;span&gt;의 인코딩은 &lt;/span&gt;UTF-8&lt;span&gt;을 사용한다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1.3. Special characters&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1.3.1. Whitespace characters&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* 공백문자(0x20)는 &lt;/span&gt;Source file&lt;span&gt;에서 아무렇게나 쓸 수 있는 유일한 문자이다&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; * &lt;/span&gt;&lt;span&gt;문자열 및 문자 리터럴의 다른 모든 공백 문자는 이스케이프 된다&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; * &lt;/span&gt;Tab &lt;span&gt;문자는 들여쓰기에 사용되지 않는다&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1.3.2. Special escape sequences&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;특수 이스케이프 문자를 사용할 때는 이스케이프 시퀀스&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;\b, \t, \n, \f, \r, \&quot; , \'&lt;span&gt;과 &lt;/span&gt;\\ &lt;span&gt;)&lt;/span&gt;&lt;span&gt;를 사용한다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;진수 표현&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;\012&lt;span&gt;) &lt;/span&gt;&lt;span&gt;또는 유니코드&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;\u000a&lt;span&gt;)&lt;/span&gt;&lt;span&gt;는 추천하지 않는다&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1.3.3. Non-ASCII characters&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;비 &lt;/span&gt;ASCII &lt;span&gt;문자의 경우&lt;/span&gt;, &lt;span&gt;실제 유니코드 문자 또는 동등한 유니코드 이스케이프가 사용된다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;2. Source file structure&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;파일 구조 순서는 다음과 같다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1) &lt;/span&gt;&lt;span&gt;라이센스 또는 저작권 정보&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;있는 경우&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2) &lt;/span&gt;package&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3) &lt;/span&gt;import&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4) &lt;/span&gt;&lt;span&gt;하나의 최상위 클래스&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602003921950&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
* Copyright ...
*/
package kr.co.example;
import java.io.File;
public class ClassName{
	// ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.1. License or copyright information, if present&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;라이센스 또는 저작권 정보가 있는 경우&lt;/span&gt;, &lt;span&gt;여기에 속한다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.2. Package statements&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.3. Import statements&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;Wildcard Import&lt;span&gt;는 사용되지 않는다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;Import &lt;span&gt;문은 줄 바꿈이 되지 않는다&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.3.1 Ordering and spacing&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;Imports&lt;span&gt;의 순서는 다음과 같다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; 1. &lt;/span&gt;&lt;span&gt;단일 블록에서 모든 &lt;/span&gt;static imports&lt;br /&gt;&lt;span&gt;&amp;nbsp; 2. &lt;/span&gt;&lt;span&gt;단일 블록에서 모든 &lt;/span&gt;non-static imports&lt;br /&gt;&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;static&lt;span&gt;과 &lt;/span&gt;non-static&lt;span&gt;이 모두 있는 경우&lt;/span&gt;, &lt;span&gt;하나의 빈 줄이 두 블록을 구분한다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;import &lt;span&gt;문 사이에는 다른 빈 줄이 없다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;각 블록 내에는 이름이 &lt;/span&gt;ASCII &lt;span&gt;정렬 순서로 정렬된다&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2.3.2. No static import for classes&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;정적 중첩 클래스에는 정적 가져오기가 사용되지 않는다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;해당 클래스는 일반 &lt;/span&gt;imports&lt;span&gt;로 가져온다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;3. Formatting&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.1. Braces&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.1.1. Braces are used where optional&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;if, else, for, do 및 while&lt;span&gt;문에는 중괄호가 사용돼야 한다&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;몸이 비어있거나 단 하나의 문이 포함된 경우에도&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.1.2. Nonempty blocks: K &amp;amp; R style&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;중괄호는 Kernighan 와 &lt;/span&gt;Ritchie style&lt;span&gt;을 따른다&lt;/span&gt;. &lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1. &lt;/span&gt;&lt;span&gt;여는 중괄호 앞에는 줄 바꿈이 없다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2. &lt;/span&gt;&lt;span&gt;여는 중괄호 뒤는 줄 바꿈&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3. &lt;/span&gt;&lt;span&gt;닫는 중괄호 앞에는 줄 바꿈&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4. &lt;/span&gt;&lt;span&gt;닫는 중괄호 뒤에는 줄 바꿈&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;else, catch &lt;span&gt;등이 있는 경우에는 줄 바꿈을 하지 않는다&lt;/span&gt;.&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;열거형 클래스의 경우에는 예외가 존재한다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;Example&lt;/p&gt;
&lt;pre id=&quot;code_1602006880005&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return () -&amp;gt; {
	while (condition()) {
		method();
	}
};

return new MyClass() {
	@Override public void method() {
		if (condition()) {
			try {
				something();
			} catch (ProblemException e) {
				recover();
			}
		} else if (otherCondition()) {
			somethingElse();
		} else {
			lastThing();
		}
	}
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.1.3. Empty blocks: may be concise&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;빈 블록인 경우&lt;/span&gt;, &lt;span&gt;줄 바꿈 없이 사용할 수 있다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;다중 블록 명령문인 경우에는 줄 바꿈을 해야 된다&lt;/span&gt;.&lt;/p&gt;
&lt;pre id=&quot;code_1602051408657&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// This is acceptable
void doNothing() {}

// This is equally acceptable
void doNothingElse() {
}

// This is not acceptable: No concise empty blocks in a multi-block statement
try {
	doSomething();
} catch (Exception e) {}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.2. Block indentation: +2 spaces&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;새 블록이 열릴 때마다&lt;/span&gt;, &lt;span&gt;들여쓰기가 두 칸씩 증가한다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;다른 곳에서는 &lt;/span&gt;+4 spaces or Tab&lt;span&gt;을 사용하는 경우도 있다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.3. Column limit: 100&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;Java &lt;span&gt;코드의 열 제한은 &lt;/span&gt;100&lt;span&gt;자이다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.4. Line-wrapping&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;줄 바꿈의 주요 지침은 더 높은 구문 수준에서 중단하는 것을 선호한다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;포괄적이고 결정적인 공식은 없다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1. &lt;/span&gt;&lt;span&gt;비 할당 연산자에서 줄이 끊어지면 기호 앞에서 끊어진다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2. &lt;/span&gt;&lt;span&gt;할당 연산자의 경우&lt;/span&gt;, &lt;span&gt;보통 기호 뒤에서 끊어진다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3. &lt;/span&gt;&lt;span&gt;매서드 또는 생성자 이름 뒤에 오는 여는 괄호&lt;/span&gt;&lt;span&gt;( &lt;/span&gt;&quot;&lt;span&gt;(&lt;/span&gt;&quot; &lt;span&gt;)&lt;/span&gt;&lt;span&gt;는 연결된 상태를 유지한다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4. &lt;/span&gt;&lt;span&gt;쉼표는 앞에 토큰에 계속 붙어 있는다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 5. &lt;/span&gt;&lt;span&gt;람다의 본문이 중괄호가 없는 단일 식으로 구성된 경우 화살표 바로 뒤에 줄 바꿈이 있을 수 있다는 점을 제외하고는 람다의 화살표 옆에서 줄이 끊어지지 않는다&lt;/span&gt;. &lt;/p&gt;
&lt;pre id=&quot;code_1602059347212&quot; class=&quot;java&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MyLambda&amp;lt;String, Long, Object&amp;gt; lambda =
    (String label, Long value, Object obj) -&amp;gt; {
        ...
    };

Predicate&amp;lt;String&amp;gt; predicate = str -&amp;gt;
    longExpressionInvolving(str);
    
System.out.println(a + b
	+ c);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.4.1. Indent continuation lines at least +4 spaces&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;줄 바꿈 시 연속 줄인 경우&lt;/span&gt;, &lt;span&gt;최소 &lt;/span&gt;+4 &lt;span&gt;공백의 들여쓰기를 한다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.5. Whitespace&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.5.1. Vertical Whitespace&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;수평 공백은 다음과 같다&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1. &lt;/span&gt;if, for, catch &lt;span&gt;뒤에 오는 괄호 &lt;/span&gt;( &lt;span&gt;와는 분리&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2. &lt;/span&gt;else, catch &lt;span&gt;앞에 오는 &lt;/span&gt;} &lt;span&gt;와는 분리&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3. &lt;/span&gt;{ &lt;span&gt;여는 중괄호 앞에 공백이 사용&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span&gt;예외 &lt;/span&gt;&lt;span&gt;@SomeAnnotation({a, b})&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span&gt;예외 &lt;/span&gt;&lt;span&gt;String[][] x = {{&quot;foo&quot;}}&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 4. &lt;/span&gt;, : ; &lt;span&gt;다음이나 닫는 괄호 &lt;/span&gt;) &lt;span&gt;뒤에 공백 사용&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 5. &lt;/span&gt;&lt;span&gt;선언의 유형과 변수 사이&lt;/span&gt;: &lt;span&gt;List&amp;lt;String&amp;gt; list&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.6. Grouping parentheses: recommended&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;선택적 그룹화 괄호는 코드가 잘못 해석될 가능성이 없는 경우 생략한다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7. Specific constructs&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.1. Enum classes&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;Enum &lt;span&gt;상수 뒤에 오는 쉼표 뒤 줄 바꿈은 선택 사항이다&lt;/span&gt;.&lt;/p&gt;
&lt;pre id=&quot;code_1602066442861&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private enum Answer {
	YES {
		@Override public String toString() {
			return &quot;yes&quot;;
		}
	},
	NO,
	MAYBE
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.2. Variable declarations&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.2.1. One variable per declaration&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;모든 변수 선언은 하나의 변수만 선언한다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;int a, b; &lt;/span&gt;&lt;span&gt;은 사용되지 않는다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;for &lt;span&gt;루프 헤더의 경우는 허용된다&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.2.2. Declared when needed&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;지역 변수는 시작 부분에서 습관적으로 선언하지 않는다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;처음 사용되는 지접에 가깝게 선언하여 사용한다&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.3. Arrays&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;C Style&lt;span&gt;을 사용하지 않는다 : &lt;/span&gt;&lt;span&gt;String args[]&lt;br /&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;다음과 같이 사용한다 : &lt;/span&gt;&lt;span&gt;String[] args&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.4. Switch statements&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; 3.7.4.1. Indentation&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;다른 블록과 마찬가지로 스위치 블록의 내용은 &lt;/span&gt;+2&lt;span&gt;로 들여쓰기를 한다&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.4.2. Fall-through: commented&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;Fall-through&lt;span&gt;가 발생하는 경우&lt;/span&gt;, &lt;span&gt;주석을 단다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;// fall through&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.4.3. The default case is present&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;default &lt;span&gt;문의 경우&lt;/span&gt;, Code&lt;span&gt;가 없더라도 존재해야 된다&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;Example&lt;/p&gt;
&lt;pre id=&quot;code_1602070102582&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;switch (input) {
	case 1:
	case 2:
		prepareOneOrTwo();
		// fall through
	case 3:
		handleOneTwoOrThree();
		break;
	default:
		handleLargeNumber(input);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.5. Annotations&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;각 &lt;/span&gt;Annotation&lt;span&gt;은 자체 줄에 나열된다&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;, &lt;span&gt;한 줄에 하나의 &lt;/span&gt;Annotation&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;파라미터가 없는 &lt;/span&gt;Annotation&lt;span&gt;의 경우는 한 줄로 사용 가능하다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;필드에 적용되는 &lt;/span&gt;Annotation&lt;span&gt;의 경우도 보통 한 줄에 하나씩 적용할 수 있으나&lt;/span&gt;, &lt;span&gt;여러 개의 &lt;/span&gt;Annoation&lt;span&gt;을 적용하는 경우 한 줄로 표현할 수 있다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;* &lt;/span&gt;Example&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602070802274&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
@Nullable
public String getNameIfPresent() { ... }

@Override public int hashCode() { ... }

@Partial @Mock DataLoader loader;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.6. Comments&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;블록 주석은 주변 코드와 동일한 수준에서 들여쓰기 한다&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.7. Modifiers&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;Modifier&lt;span&gt;는 다음 순서를 따른다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602070828082&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public protected private abstract default static final transient volatile synchronized native strictfp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3.7.8. Numeric Literals&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;long &lt;span&gt;정수 리터럴의 경우&lt;/span&gt;, &lt;span&gt;소문자가 아닌 &lt;b&gt;대문자 &lt;/b&gt;&lt;/span&gt;&lt;b&gt;L&lt;/b&gt;&lt;span&gt;을 사용하여 표기한다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;4. Naming&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4.1. Rules by identifier type&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt; 4.1.1. Package names&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;패키지 이름은 모두 소문자이며&lt;/span&gt;, &lt;span&gt;연속된 단어는 단순히 함께 연결한다&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;밑줄 없음&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602074314564&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.deepspace
// package com.example.deepSpace : not use
// package com.example.deep_space : not use&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4.1.2. Class names&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;b&gt;UpperCamelCase&lt;/b&gt;&lt;span&gt;로 작성&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;클래스 이름은 일반적으로 명사 또는 명사구이다&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Ex&amp;gt; Character, ImmutableList &lt;span&gt;등&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;인터페이스 이름은 명사 또는 명사구&lt;/span&gt;, &lt;span&gt;형용사 또는 형용사구이다&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Ex&amp;gt; Readable &lt;span&gt;등&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;테스트 클래스는 테스트 중인 클래스의 이름으로 시작하여 &lt;/span&gt;Test&lt;span&gt;를 붙인다&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Ex&amp;gt; HashTest, HashIntegrationTest&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4.1.3. Method names&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;b&gt;lowerCamelCase&lt;/b&gt;&lt;span&gt;로 작성&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;메서드 이름은 일반적으로 동사 또는 동사구이다&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Ex&amp;gt; sendMessage, stop &lt;span&gt;등&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4.1.4. Constant names&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;상수 이름은 &lt;b&gt;모두 대문자&lt;/b&gt;를 사용되며&lt;/span&gt;, &lt;span&gt;각 단어는 단일 밑줄로 구분한다&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Ex&amp;gt; CONSTANT_CASE&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;이름은 일반적으로 명사 또는 명사구이다&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4.1.5. Non-constant field names&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;상수가 아닌 필드 이름은 &lt;/span&gt;lowerCamelCase&lt;span&gt;로 작성된다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;이름은 일반적으로 명사 또는 명사구이다&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Ex&amp;gt; computedValues, index&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4.1.6. Parameter names&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;매개변수 이름은 &lt;/span&gt;lowerCamelCase&lt;span&gt;로 작성된다&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4.1.7. Local variable names&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;지역 변수 이름은 &lt;/span&gt;lowerCamelCase&lt;span&gt;로 작성된다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;b&gt;&lt;span&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;5. Programming Practices&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5.1. @Override: always used&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;@Override Annotation&lt;span&gt;은 항상 사용한다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;예외로 부모 메서드가 &lt;/span&gt;@Deprecated &lt;span&gt;인 경우&lt;/span&gt;, &lt;span&gt;생략 가능하다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5.2. Caught exceptions: not ignored&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;아래에 언급된 경우를 제외하고는 포착된 예외에 대한 응답으로 아무것도 하지 않는 것은 거의 옳지 않다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1602077914906&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try {
	int i = Integer.parseInt(response);
	return handleNumericResponse(i);
} catch (NumberFormatException ok) {
	// it's not numeric; that's fine, just continue
}
return handleTextResponse(response);
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5.3. Static members: qualified using class&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;정적 클래스 멤버에 대한 참조는 클래스를 사용하여 정규화한다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5.4. Finalizers: not used&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;Object.finalize&lt;span&gt;를 재정의하는 것은 거의 드물다&lt;/span&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;추가 내용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;좋은 코드는 &lt;/span&gt;80&lt;span&gt;자 또는 &lt;/span&gt;130&lt;span&gt;자를 생각한다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;옛날 터미널 크기가 &lt;/span&gt;80*25 &lt;span&gt;이어서 고정폭 폰트로 &lt;/span&gt;80&lt;span&gt;자는 딱 터미널 사이즈에 맞았다&lt;/span&gt;.&lt;br /&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;옛날 프린터 용지가 &lt;/span&gt;132&lt;span&gt;자였다&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding/Java</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/231</guid>
      <comments>https://yoonix.tistory.com/231#entry231comment</comments>
      <pubDate>Wed, 7 Oct 2020 02:55:25 +0900</pubDate>
    </item>
    <item>
      <title>java.lang 패키지</title>
      <link>https://yoonix.tistory.com/230</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #2f5496;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;■ java.lang 패키지&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Java에서 가장 기본적이며, 자주 사용되는 클래스를 모아놓은 패키지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 별도로 import를 하지 않아도 사용이 가능한 기본 중의 기본&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Object Class&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 모든 클래스의 조상 클래스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 클래스의 기본 기능을 제공&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 필요한 경우, Object 클래스에 구현된 메서드를 Override&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 87.2558%; height: 140px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.2911%; height: 20px;&quot;&gt;&lt;b&gt;메소드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.4208%; height: 20px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.2911%; height: 20px;&quot;&gt;&lt;b&gt;&lt;span&gt;public final native Class&amp;lt;?&amp;gt; getClass()&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.4208%; height: 20px;&quot;&gt;&lt;span&gt;현재 객체의 클래스를 반환한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.2911%; height: 20px;&quot;&gt;&lt;b&gt;&lt;span&gt;public native int hashCode()&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.4208%; height: 20px;&quot;&gt;&lt;span&gt;현재 객체의 해시코드 값을 반환한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 36.2911%; height: 40px;&quot;&gt;&lt;b&gt;&lt;span&gt;public boolean equals()&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.4208%; height: 40px;&quot;&gt;&lt;span&gt;현재 객체와 대상이 같은 객체를 참조하는지 여부를 반환한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.2911%; height: 20px;&quot;&gt;&lt;b&gt;&lt;span&gt;public String toString()&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.4208%; height: 20px;&quot;&gt;&lt;span&gt;객체를 문자열로 변환하여 반환한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 36.2911%; height: 20px;&quot;&gt;&lt;b&gt;&lt;span&gt;proteted native clone() throws CloneNotSupportedException&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.4208%; height: 20px;&quot;&gt;&lt;span&gt;객체를 복사하여 새로운 객체로 반환한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. equals()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 동일한 객체를 가리키는지 여부 확인&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- Object 클래스의 equals() 메소드 구현&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;* 객체의 참조만을 비교&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601387136081&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean equals(Object obj) {
    return (this == obj);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- String 클래스의 equals() 메소드 구현(Overriding)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;* 효율적으로 객체의 내용이 동일한지 비교&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601387240416&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String aString = (String)anObject;
        if (!COMPACT_STRINGS || this.coder == aString.coder) {
            return StringLatin1.equals(value, aString.value);
        }
    }
    return false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. hashCode()&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 객체를 구분하기 위해 사용하는 정수 값(해시코드)을 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&amp;nbsp;* 프로그램 내에서 객체마다 유일하므로 주소값처럼 사용 가능&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;* 메모리 주소는 JVM에서 관리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- native 메소드이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- hashCode() 제약 사항&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;* 필수 - 한 객체의 hashCode()를 여러 번 호출할 경우, equals()에 사용하는 값이 변하지 않으면 동일한 값을 반환해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;* 필수 - equals() 메서드가 같다고 판단한 두 객체의 hashCode() 반환 값은 같아야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;* 권고 - equals() 메소드가 다르다고 판단한 두 객체의 hashCode()가 반드시 다를 필요는 없으나, 다른 값이 나오면 HashTable 성능이 향상된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601388658766&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Member{
	public String id;
    
    public Member(String id){
    	this.id = id;
    }
    
    @Override
    public boolean equals(Object obj){
    	if(obj instanceof Member){
        	Memeber member = (Member)obj;
            if(id.equals(member.id){
            	return true;
            }
        }
    	return false;
    }
    
    @Override
    public int hashCode(){
    	return id.hashCode();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. clone()&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 자신을 복제하여 새로운 객체를 생성하는 메소드&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 배열을 복제할 경우 새로운 객체를 생성하므로 원본을 훼손하지 않을 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- clone() 메서드를 Overriding 할 시, Cloneable Interface를 구현해야 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;* Deep Copy 필요시, Overriding 해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601388944740&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int [] ints = {1, 2, 3, 4, 5};
int [] ints2 = ints.clone();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. getClass()&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 현재 객체의 Class 클래스를 반환&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601388993899&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Foo {
    public void methodA() {
        System.out.println(&quot;method A called.&quot;);
    }
}

class FooTest {
    public static void main(String[] args) throws Exception {
        Foo foo = new Foo();
        Class fooClass = foo.getClass();

        System.out.println(fooClass.getName());
        System.out.println(fooClass.getDeclaredMethods().length);
        System.out.println(Foo.class.getDeclaredMethod(&quot;methodA&quot;).invoke(foo));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; System Class&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- OS와 Interaction 하기 위한 클래스&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 정적 변수와 정적 메서드만으로 구성된 클래스&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 78.3256%; height: 260px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;메소드&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;arraycopy()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;src 배열의 내용을 dst 배열로 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;currentTimeMillis()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;현재 시스템 시간을 ms로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;exit()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;프로그램을 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;gc()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;GC를 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;getenv()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;환경 변수의 값을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;getProperties()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;시스템 속성을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;getProperty()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;&lt;span&gt;시스템 속성 값을 문자열로 반환한다. 없을 경우 null 또는 def를 반환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;identityHashCode()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;&lt;span&gt;객체의 해시코드 값을 반환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;lineSeparator()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;시스템의 줄넘김 문자열을 반환한다. &lt;span&gt;UNIX: \n, WINDOWS: \r\n&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;nanoTime()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;&lt;span&gt;시스템 시간을 ns로 반환&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;setProperties()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;&lt;span&gt;시스템 속성을 한번에 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.5814%; height: 20px;&quot;&gt;&lt;b&gt;setProperty()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.7907%; height: 20px;&quot;&gt;&lt;span&gt;시스템 속성을 하나씩 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. in, out, err 정적 변수&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- &lt;b&gt;in&lt;/b&gt; : InputStream 객체, 표준 입력&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- &lt;b&gt;out&lt;/b&gt; : Print&lt;span style=&quot;color: #333333;&quot;&gt;Stream 객체, 표준 출력&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- &lt;b&gt;err&lt;/b&gt; : Print&lt;span style=&quot;color: #333333;&quot;&gt;Stream 객체, 표준 에러&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601389424205&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.in.read();       // in: InputStream 객체, 표준 입력
System.out.println();   // out: PrintStream 객체, 표준 출력
System.err.println();   // err: PrintStream 객체, 표준 에러&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. System.arraycopy()&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- Array를 Shallow Copy&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- native로 되어있기 때문에 좀 더 최적화가 되어있다고 생각하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;* 그렇기 때문에 for문 보다 더 효율적이다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601389538701&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] ints = {1, 2, 3, 4};
int[] ints1 = new int[10];
System.arraycopy(ints, 0, ints1, 0, ints.length);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. currentTimeMillis(), nanoTIme() : 시간&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601389595113&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.out.println(System.currentTimeMillis());
System.out.println(System.nanoTime());  // RTOS가 아니기 때문에 정확하지 않을 수 있음(Real Time OS), 보통 참고용으로만 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. exit()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- 프로그램 강제 종료&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- status == 0 : 정상 종료&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- status != 0 : 비정상 종료 (보통 1 사용)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601389668241&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.exit(0);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. gc()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- Garbage Collection 호출&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- &lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;하지만 바로 호출이 아닌&lt;/b&gt;&lt;/span&gt;, 원하는 타이밍에 좀 더 빨리 처리해달라고 요청하는 정도라고 생각하면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601389816843&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.gc();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6. getenv(), getProperties(), getProperty()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- &lt;b&gt;getenv()&lt;/b&gt; : 환경변수 호출&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- &lt;b&gt;getProperties()&lt;/b&gt; : 모든 속성 값 호출&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;- &lt;b&gt;getProperty()&lt;/b&gt; : 특정 속성 값 호출&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601389926930&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;System.out.println(System.getenv());
System.out.println(System.getenv(&quot;JAVA_HOME&quot;));
System.out.println(System.getenv(&quot;Path&quot;));
System.out.println(System.getProperties());
System.out.println(System.getProperty(&quot;user.country&quot;));
System.out.println(System.getProperty(&quot;java.io.tmpdir&quot;));
System.out.println(System.getProperty(&quot;line.separator&quot;));   // windows \r\n, linux \n
System.out.println(System.getProperty(&quot;file.separator&quot;));   // windows \ linux&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Math Class&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 수학 계산에 필요한 메서드를 가진 final 클래스&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 모든 메서드가 static 메서드로 구현되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 210px;&quot; border=&quot;1&quot; data-ke-style=&quot;style5&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;메소드&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;설 명&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;abs()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;절대값을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;ceil()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;올림 값을 double로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;floor()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;내림 값을 double로 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;max()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;두 값 중 더 큰 값을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;min()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;두 값 중 더 작은 값을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;random()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;0 이상 1.0 미만의 임의의 값을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;round()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;소수점 첫째자리에서 반올림한 정수 값을 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;addExact()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;덧셈 연산으로, Overflow 발생 시 ArithmaticException 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;subtractExact()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;뺄셈 연산으로, Overflow 발생 시 ArithmaticException 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;multiplyExact()&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;곱셈 연산으로, Overflow 발생 시 ArithmaticException 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Example&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1603353237391&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// abs() : 절대 값, int long float double Overriding
System.out.println(Math.abs(-4));       // 4

// ceil() : 올림, double 입력, double 출력
System.out.println(Math.ceil(1.2));     // 2.0

// floor() : 내림, double 입력, double 출력
System.out.println(Math.floor(1524.4)); // 1524.0

// max(), min() : 2개의 값만을 비교하게 되어 있음
System.out.println(Math.max(4, 2));     // 4
System.out.println(Math.min(4, 2));     // 2

// random() : 0.0 이상, 1.0 미만의 값을 임의로 출력
System.out.println(Math.random());
System.out.println(Math.random() &amp;gt; 0.7);    // 30퍼센트 확율인 경우, 보통 이런 식으로 사용

// 확률 표현
int count = 0;
for(int i = 0; i &amp;lt; 1000; i++){
    if (Math.random() &amp;lt; 0.3) {
        count += 1;
    }
}

int minVal = 2;
int maxVal = 10;
int randInt = (int)(Math.random() * (maxVal - minVal + 1) + minVal);    // 2 이상 ~ 9 미만
System.out.println(randInt);


// round() : 반올림, float -&amp;gt; int, double -&amp;gt; long 변환
System.out.println(Math.round(1.4f));   // 1

// addExact() : 덧셈 연산으로, Overflow 발생 시 ArithmaticException 발생.
// subtractExact() : 뺄셈 연산으로, Overflow 발생 시 ArithmaticException 발생.
// multiplyExact() : 곱셈 연산으로, Overflow 발생 시 ArithmaticException 발생.
try {
    System.out.println(Math.addExact(Integer.MAX_VALUE, 10));
    System.out.println(Math.subtractExact(Integer.MIN_VALUE, 10));
    System.out.println(Math.multiplyExact(Integer.MAX_VALUE, 4));
} catch(ArithmeticException e) {
    e.printStackTrace();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding/Java</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/230</guid>
      <comments>https://yoonix.tistory.com/230#entry230comment</comments>
      <pubDate>Tue, 29 Sep 2020 23:32:23 +0900</pubDate>
    </item>
    <item>
      <title>Java Stream API</title>
      <link>https://yoonix.tistory.com/229</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #2f5496;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;■ Stream API&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Java 8에 추가된 java.util.stream 패키지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 컬렉션 요소를 람다식으로 처리할 수 있도록 돕는 함수형 프로그래밍 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Stream API 특징&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 간결한 코드로 작성할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 하지만 일반적으로 Stream으로 반복문을 실행하는 것보다 for문을 이용하는 방법이 빠르기 때문에, 무작정 사용하는 것은 속도를 느리게 만들 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601223448621&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// JAVA 7
List&amp;lt;String&amp;gt; list = Arrays.asList(&quot;fast&quot;, &quot;campus&quot;, &quot;rocks&quot;);
List&amp;lt;String&amp;gt; newList = new ArrayList&amp;lt;&amp;gt;();

for (String s: list) {
    newList.add(s.toUpperCase());
}

for (String s: newList) {
    System.out.println(s);
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1601223458002&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// JAVA 8
List&amp;lt;String&amp;gt; list = Arrays.asList(&quot;fast&quot;, &quot;campus&quot;, &quot;rocks&quot;);
Stream&amp;lt;String&amp;gt; stream = list.stream();
stream.map(String::toUpperCase).forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 데이터 소스에 대한 공통된 접근 방식 제공, Stream으로 변경해주고 나면 List, Set, Map 모두 동일한 방식으로 데이터를 처리할 수 있다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- 중간 처리와 최종 처리를 지원&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Stream 생성 방식&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Collection의 인스턴스 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- Stream stream() 메소드 이용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601223986582&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;String&amp;gt; list1 = Arrays.asList(&quot;fast&quot;, &quot;campus&quot;, &quot;rocks&quot;);
Stream&amp;lt;String&amp;gt; stream1 = list1.stream();&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Arrays를 이용하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- Arrays.stream() 메소드 이용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- IntStream, LongStream, DoubleStream 가능&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601224738292&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] ints = {4, 6, 2, 19, 2, 58, 4, 6, 5};
IntStream intStream = Arrays.stream(ints);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Stream 클래스의 클래스 메소드&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- Stream.of() 메소드 이용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601224862126&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DoubleStream doubleStream = DoubleStream.of(0.4, 0.6, 0.2, 1.2);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. Stream의 range를 이용하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601224912252&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IntStream intStream1 = IntStream.range(0, 10);  // 10은 포함되지 않는다.
intStream1.forEach(System.out::println);
IntStream intStream2 = IntStream.rangeClosed(0, 10); // 10이 포함된다.
// LongStream도 range, rangeClosed가 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. Random 객체를 이용한 방법&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- ints(), longs(), doubles() 메소드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;- i&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;nts(streamSize, randomNumberOrigin, randomNumberBound)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601224988415&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Random random = new Random();
LongStream longStream = random.longs(100);  // 100개 제한
longStream.forEach(System.out::println);

LongStream longStream2 = random.longs(100, 0, 1000); // 0 부터 1000개 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Stream API 종류&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Stream 종류&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 49.7674%; height: 151px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.822%;&quot;&gt;&lt;b&gt;종류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 62.178%;&quot;&gt;&lt;b&gt;처리 대상&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.822%;&quot;&gt;Stream&lt;/td&gt;
&lt;td style=&quot;width: 62.178%;&quot;&gt;일반적인 객체를 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.822%;&quot;&gt;IntStream&lt;/td&gt;
&lt;td style=&quot;width: 62.178%;&quot;&gt;기본 자료형 int를 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.822%;&quot;&gt;LongStream&lt;/td&gt;
&lt;td style=&quot;width: 62.178%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본 자료형 long를 처리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 37.822%;&quot;&gt;DoubleStream&lt;/td&gt;
&lt;td style=&quot;width: 62.178%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본 자료형 double를 처리&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 중간 처리 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1) Filtering 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Stream distinct()&lt;/b&gt; - 스트림에 같은 요소가 있을 경우, 하나만 남기고 삭제하는 메소드&lt;/p&gt;
&lt;pre id=&quot;code_1601359297814&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stringStream.distinct().forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;Stream filter(Predicate&amp;lt;? super T&amp;gt; predicate)&lt;/b&gt; - Predicate 계열을 입력받아, true인 요소를 남긴다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601359337750&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stringStream = Stream.of(&quot;Java&quot;, &quot;Is&quot;, &quot;Fun&quot;, &quot;Isn't&quot;, &quot;It&quot;, &quot;?&quot;, &quot;Java&quot;, &quot;Java&quot;);
stringStream.filter(s -&amp;gt; s.length() &amp;gt;= 3)
   .forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2) Cutting 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Stream limit(long maxSize)&lt;/b&gt; : 스트림의 최대 요소 개수가 maxSize인 스트림 반환&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;Stream skip(long n)&lt;/b&gt; : 스트림의 최초 n개를 생략하는 메소드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3) Sorting 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;b&gt;&lt;span&gt; compareTo()&lt;/span&gt;&lt;/b&gt;&lt;span&gt; 또는 입력받은 &lt;b&gt;Comparator&lt;/b&gt;를 이용해 정렬&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;Stream sorted()&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: Comparator 객체를 정렬한 스트림 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;Stream sorted(Comparator&amp;lt;? super T&amp;gt; comparator)&lt;/b&gt;&lt;span&gt; : Comparator를 이용하여 정렬&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601361100204&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stringStream = Stream.of(&quot;abc&quot;, &quot;fwf&quot;, &quot;dnmov&quot;, &quot;work&quot;);
stringStream.sorted().forEach(System.out::println);         // String 객체의 comateTo를 사용

stringStream = Stream.of(&quot;abc&quot;, &quot;fwf&quot;, &quot;dnmov&quot;, &quot;work&quot;);
stringStream.sorted((o1, o2) -&amp;gt; o1.length() - o2.length())   // Comparator 인터페이스를 람다식으로 구현
        .forEach(System.out::println);
System.out.println();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4) Mapping 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Function 계열의 인터페이스를 사용하여 스트림의 각 요소를 매핑&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;S&lt;/b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;tream map(Function&amp;lt;? super T, ? extends R&amp;gt; mapper)&lt;/b&gt; : 기존 스트림의 T 타입 요소를 R 타입으로 변환하여 새로운 스트림 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;PStream mapToP(ToPFunction&amp;lt;? super T&amp;gt; mapper)&lt;/b&gt; : R이 기본형 타입으로 제한된 map()&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601362734942&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stringStream = Stream.of(&quot;abc&quot;, &quot;fwf&quot;, &quot;dnmov&quot;, &quot;work&quot;);
// Function 계열로 String -&amp;gt; Integer로 변환하는 매핑, Function&amp;lt;String, Integer&amp;gt;
Stream&amp;lt;Integer&amp;gt; stream2 = stringStream.map(s -&amp;gt; s.length());
stream2.forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;b&gt;&lt;span&gt; &lt;span&gt;Stream flatMap(Function&amp;lt;? super T, ? extends Stream&amp;lt;? extends R&amp;gt;&amp;gt; mapper)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &lt;span&gt;스트림의 T 타입 요소가 n개의 R 타입 요소로 매핑된 새로운 스트림을 반환&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&lt;b&gt;&lt;span&gt;PStream flatMapToP(Function&amp;lt;? super T, ? extends PStream&amp;gt; mapper)&lt;/span&gt;&lt;/b&gt; : &lt;span&gt;R이 기본형 타입으로 제한된 flatMap()&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601362946482&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;String&amp;gt; list2 = Arrays.asList(&quot;java&quot;, &quot;backend&quot;, &quot;best&quot;, &quot;course&quot;);
System.out.println(list2.stream().flatMap(data -&amp;gt; {
   return Arrays.stream(data.split(&quot;&quot;));
}).distinct().count());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5) Peek(조회) 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;중간 결과를 출력해 볼 수 있는 메소드(디버깅 기능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;b&gt;&lt;span&gt; &lt;span&gt;Stream peek(Consumer&amp;lt;? super T&amp;gt; action)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;: &lt;span&gt;Consumer 계열의 람다식으로 입력받아 입력 요소를 소비&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601363055239&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list2 = Arrays.asList(&quot;java&quot;, &quot;backend&quot;, &quot;best&quot;, &quot;course&quot;);
list2.stream().flatMap(data -&amp;gt; {
   return Arrays.stream(data.split(&quot;&quot;));
}).peek(s -&amp;gt; {
   System.out.println(s);
}).distinct().forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 최종 처리 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1) Maching 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- boolean 타입의 값을 리턴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;boolean allMatch(Predicate&amp;lt;? super T&amp;gt; predicate)&lt;/b&gt; : 모든 요소가 true일 경우, true를 리턴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;boolean anyMatch(Predicate&amp;lt;? super T&amp;gt; predicate)&lt;/b&gt; : 하나라도 요소가 true일 경우 true를 리턴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;boolean noneMatch(Predicate&amp;lt;? super T&amp;gt; predicate)&lt;/b&gt; : 모든 요소가 false인 경우, true 리턴&lt;/p&gt;
&lt;pre id=&quot;code_1601367812362&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Stream&amp;lt;String&amp;gt; st0 = Stream.of(&quot;avc&quot;, &quot;def&quot;, &quot;gop&quot;);
System.out.println(st0.allMatch(s -&amp;gt; s.equals(&quot;avc&quot;))); // false

st0 = Stream.of(&quot;avc&quot;, &quot;def&quot;, &quot;gop&quot;);
System.out.println(st0.anyMatch(s -&amp;gt; s.equals(&quot;avc&quot;))); // true

st0 = Stream.of(&quot;avc&quot;, &quot;def&quot;, &quot;gop&quot;);
System.out.println(st0.noneMatch(s -&amp;gt; s.equals(&quot;avc&quot;))); // false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2) 집계(통계)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본형 스트림(Int, Long, Double) : &lt;b&gt;count()&lt;/b&gt;,&lt;b&gt; sum()&lt;/b&gt;,&lt;b&gt; average()&lt;/b&gt;,&lt;b&gt; min()&lt;/b&gt;,&lt;b&gt; max()&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Stream&amp;lt;T&amp;gt; 스트림 :&amp;nbsp;&lt;b&gt;count()&lt;/b&gt;,&amp;nbsp;&lt;b&gt;min()&lt;/b&gt;,&amp;nbsp;&lt;b&gt;max()&lt;/b&gt; -&amp;gt; (min과 max는 Comparator 구현 필요)&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span&gt;&lt;b&gt;T reduce(T identity, BinaryOperator accumulator)&lt;/b&gt; : identity를 초기값으로 하여, accumulator를 이용해 누적 집계 연산&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp; * sum()이 실제로도 reduce로 구현되어 있다&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601369077178&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IntStream.range(0, 10).reduce(0, (value1, value2) -&amp;gt; value1 + value2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3) 반복 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;b&gt;void forEach(Comsumer&amp;lt;? super T&amp;gt; action)&lt;/b&gt; : Consumer 계열의 람다식을 입력받아, 각 요소를 소비&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4) 수집 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;/span&gt;Collectors 클래스의 정적 메소드를 이용하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;&amp;lt;R, A&amp;gt; R collect(Collector&amp;lt;? super T, A, R&amp;gt; collector)&lt;/b&gt; : Collection으로 변환시키는 메소드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Collectors.toList()&lt;/b&gt; : ArrayList 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Collectors.toSet()&lt;/b&gt; : HashSet 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Collectors.toMap(Function&amp;lt;? super T, ? extends K&amp;gt; keyMapper, Function&amp;lt;? super T, ? extends U&amp;gt; valueMapper)&lt;/b&gt; : Map&amp;lt;K, U&amp;gt; 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Collectors.toCollection(Supplier collectionFactory)&lt;/b&gt; : 입력 값으로 Collector로 변환&lt;/p&gt;
&lt;pre id=&quot;code_1601383184992&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Collectors 클래스의 정적 메소드를 이용하는 방법
// toList() 메소드를 쓸 경우, ArrayList로 Collect하는 Collector 반환
String[] array = {&quot;Collection&quot;, &quot;Framework&quot;, &quot;is&quot;, &quot;so&quot;, &quot;cool&quot;};
Stream&amp;lt;String&amp;gt; stream3 = Arrays.stream(array);
List&amp;lt;String&amp;gt; collected = stream3.filter(s -&amp;gt; s.length() &amp;gt;= 3)
//                         .collect(Collectors.toList());
                           .collect(Collectors.toCollection(LinkedList::new));
System.out.println(collected);

// toSet() 메소드를 쓸 경우, HashSet으로 collect하는 Collector 반환
Stream&amp;lt;String&amp;gt; stream4 = Arrays.stream(array);
Set&amp;lt;String&amp;gt; collected2 = stream4.filter(s -&amp;gt; s.length() &amp;gt;= 3)
                            .collect(Collectors.toSet());
System.out.println(collected2);

// toMap() : Map&amp;lt;K, V&amp;gt; -&amp;gt; Map.Entry&amp;lt;K, V&amp;gt; - Key, Value를 정해줘야 된다.
Stream&amp;lt;String&amp;gt; stream5 = Arrays.stream(array);
Map&amp;lt;String, Integer&amp;gt; collected3 = stream5.filter(s -&amp;gt; s.length() &amp;gt;= 3)
                            .collect(Collectors.toMap(s-&amp;gt;s, String::length));
System.out.println(collected3);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5) 그룹화/분리 메소드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Map&amp;lt;R, List&amp;gt; groupingBy(Function&amp;lt;? super T, ? extends K&amp;gt; classifier)&lt;/b&gt; : Key 값으로 Function을 입력받고, Key를 기준으로 List 타입으로 그룹화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Map&amp;lt;Boolean, List&amp;gt; partitioningBy(Predicate&amp;lt;? super T&amp;gt; predicate)&lt;/b&gt; : Key 값으로 Predicate를 입력받고, true, false에 따라 List 타입으로 분리된다.&lt;/p&gt;
&lt;pre id=&quot;code_1601384554008&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String[] arr = {&quot;Python&quot;, &quot;is&quot;, &quot;aweful&quot;, &quot;lame&quot;, &quot;not&quot;, &quot;good&quot;};
Map&amp;lt;Integer, List&amp;lt;String&amp;gt;&amp;gt; map = Arrays.stream(arr)
        .collect(Collectors.groupingBy(s -&amp;gt; s.length()));
System.out.println(map);

Map&amp;lt;Boolean, List&amp;lt;String&amp;gt;&amp;gt; map2 = Arrays.stream(arr)
        .collect(Collectors.partitioningBy(s -&amp;gt; s.length() &amp;lt; 4));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그룹화 + Downstream collector&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Collector 중에도 counting(), summingP(), averagingP(), maxBy(), minBy(), reducing() 이 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1601385355001&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;Integer, Long&amp;gt; map3 = Arrays.stream(arr)
                .collect(Collectors.groupingBy(String::length,Collectors.counting()));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6) 병렬 스트림&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 생성 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; a. stream() 대신 parallelStream()으로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; b. stream 생성 후 parallel()으로 병렬화&lt;/p&gt;
&lt;pre id=&quot;code_1601385419852&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Stream&amp;lt;String&amp;gt; parStream = Arrays.stream(arr).parallel();
System.out.println(parStream.map(String::length).count());

List&amp;lt;String&amp;gt; list4 = List.of(&quot;atew&quot;, &quot;bff&quot;, &quot;cqqwq&quot;, &quot;dassa&quot;);
Stream&amp;lt;String&amp;gt; stream6 = list4.parallelStream();    // 병렬이기 때문에 연산 순서가 달라질 수도 있다! 내부적으로 여러 쓰레드가 계산하기 때문에
stream6.map(String::length)
        .peek(s -&amp;gt; System.out.println(&quot;A:&quot; + s))
        .filter(value -&amp;gt; value &amp;gt; 3)
        .peek(s -&amp;gt; System.out.println(&quot;B:&quot; + s))
        .forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Coding/Java</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/229</guid>
      <comments>https://yoonix.tistory.com/229#entry229comment</comments>
      <pubDate>Mon, 28 Sep 2020 01:44:02 +0900</pubDate>
    </item>
    <item>
      <title>Terraform 시작하기</title>
      <link>https://yoonix.tistory.com/228</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #2f5496;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;■ Terraform Start&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Terraform Insatll (설치하기)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Download Terraform&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://www.terraform.io/downloads.html&quot;&gt;https://www.terraform.io/downloads.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 해당 OS에 맞는 버전&amp;nbsp; 설치&lt;/p&gt;
&lt;pre id=&quot;code_1600929555624&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://releases.hashicorp.com/terraform/0.13.3/terraform_0.13.3_linux_amd64.zip
unzip terraform_0.13.3_linux_amd64.zip
mv terraform /usr/bin/terraform &amp;amp;&amp;amp; sudo chmod +x
vi ~/.profile
   export PATH=&quot;$PATH:/usr/bin/terraform&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Version Check&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1600929620418&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Basic (Terraform 기초)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Provider&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Terraform과 외부 서비스를 연결해주는 기능을 하는 모듈&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- AWS, Azure, GCP와 같은 Public Cloud 뿐만 아니라, MySQL, DOcker와 같은 Local Service 등을 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 서비스 종류는 공식 문서에서 확인 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; * &lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://www.terraform.io/docs/providers/index.html#inner&quot;&gt;https://www.terraform.io/docs/providers/index.html#inner&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. HCL&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Hashicorp Configuration Language 약어&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Terraform에서 사용하는 설정 언어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- HCL 파일의 확장자는 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;.tf&lt;/b&gt;&lt;/span&gt;를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Plan&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Terraform Project Directory 아래의 모든 .tf 파일의 내용을 실제로 적용 가능하지 확인하는 작업&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;terraform plan 명령어&lt;/b&gt;&lt;/span&gt;를 제공하며, 해당 명령어 실행 시, 어떤 리소스가 생성, 수정, 삭제될지를 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. Apply&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Terraform Project Directory 아래의 모든 .tf 파일의 내용대로 리소스를 생성, 수정, 삭제하는 일을 적용이라 한다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;terraform apply 명령어&lt;/b&gt;&lt;/span&gt;를 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; Using Terraform&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동작을 위한 기본 Step은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 1) HCL을 이용하여, .tf 파일에 Infra Resources을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2) terraform plan 명령어를 통해 Resources를 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 3) terraform apply 명령어를 통해 Resources를 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Step 1. Provider Definition &amp;amp; Intialization&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Hashicorp Configuration Language 약어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Terraform에서 사용하는 설정 언어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- HCL 파일의 확장자는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;.tf&lt;/b&gt;&lt;/span&gt;를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 공식 문서 : &lt;a href=&quot;https://registry.terraform.io/providers/hashicorp/aws/latest/docs#argument-reference&quot;&gt;https://registry.terraform.io/providers/hashicorp/aws/latest/docs#argument-reference&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Make Project Directory&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 먼저 Project에 사용될 Directory 생성&lt;/p&gt;
&lt;pre id=&quot;code_1601546656152&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir ~/terraform_aws&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Make Provider.tf&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Provider 정의&lt;/p&gt;
&lt;pre id=&quot;code_1601719268736&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;touch provider.tf
// 내용
terraform {
 required_providers {
   &amp;lt;PROVIDER_NAME&amp;gt; = {
    source  = &quot;&amp;lt;SOURCE_PATH&amp;gt;&quot;
     version = &quot;~&amp;gt; 3.0&quot;
  }
 }
}
provider &quot;&amp;lt;PROVIDER_NAME&amp;gt;&quot; {
 &amp;lt;ATTR_NAME&amp;gt; = &quot;&amp;lt;ATTR_VALUE&amp;gt;&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example&lt;/p&gt;
&lt;pre id=&quot;code_1601719989969&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;terraform {
  required_providers {
    aws = {
      source  = &quot;~/terraform_aws&quot;
      version = &quot;~&amp;gt; 3.0&quot;
    }
  }
}
 provider &quot;aws&quot; {
  access_key = &quot;&amp;lt;AWS_ACCESS_KEY&amp;gt;&quot;
  secret_key = &quot;&amp;lt;AWS_SECRET_KEY&amp;gt;&quot;
  region = &quot;ap-northeast-2&quot;
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AWS 설정 값은 보통 Provider에 쓰지 않고, 환경변수 또는 파일 설정을 통해서도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;a. 환경변수 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601728014512&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#export AWS_ACCESS_KEY_ID=&quot;&amp;lt;AWS_ACCESS_KEY_ID&amp;gt;&quot;         // access_key
#export AWS_SECRET_ACCESS_KEY=&quot;&amp;lt;AWS_SECRET_ACCESS_KEY&amp;gt;&quot; // secret_key
#export AWS_DEFAULT_REGION=&quot;ap-northeast-2&quot;             // region&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;b&gt;b. 파일 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601728894755&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi ~/.aws/config
[default]
region = ap-northeast-2

vi ~/.aws/credentials
[default]
aws_secret_access_key = &amp;lt;SECRET_KEY&amp;gt;
aws_access_key_id = &amp;lt;KEY_ID&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Terraform Project Initialization&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이제 Provider를 기준으로 Project를 초기화시켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;terraform init&lt;/b&gt; 명령어 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Step 2. Write Modules&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Terraform에서는 Directory 하나가 모듈의 단위가 되기 때문에, 공용으로 사용되는 Infra 구성은 모듈화하여 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모듈화하면, 재사용이 용이해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공식 문서 : &lt;a href=&quot;https://www.terraform.io/docs/modules/index.html&quot;&gt;https://www.terraform.io/docs/modules/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. Module의 기본 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기본적으로 Module은 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;Root Module&quot;&lt;/b&gt;&lt;/span&gt;과 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&quot;Child Module&quot;&lt;/b&gt;&lt;/span&gt;이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Root Module에서는 다른 Child Module을 호출하여 출력 값을 다른 Child Module의 입력 값으로 전달하여 Module들을 연결시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중첩 Module의 경우는 &lt;b&gt;&quot;modules/&quot;&lt;/b&gt;의 하위에 위치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;a. Input variables&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 다른 Module로부터 입력받을 입력 값들을 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - variables.tf 파일에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;b. Output variables&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 다른 Module에게 반환할 출력 값들을 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - output.tf 파일에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;c. Resources&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - Infrastructure Object들을 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - main.tf 파일에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;d. terraform.tfstate 및 terraform.tfstate.backup&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - Terraform 상태를 포함하며, Terraform의 구성과 프로비저닝 된 인프라 간의 관계를 추적할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;e. .terraform&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - 인프라를 프로비저닝 하는데 사용되는 모듈과 플러그인이 포함되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - .tf 파일에 정의된 인프라 구성이 아닌 Terraform의 특정 인스턴스에 한정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;f. *.tfvars&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Direcotry Structure&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1601732753903&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ tree complete-module/
.
├── README.md
├── main.tf
├── variables.tf
├── outputs.tf
├── ...
├── modules/
│   ├── nestedA/
│   │   ├── README.md
│   │   ├── variables.tf
│   │   ├── main.tf
│   │   ├── outputs.tf
│   ├── nestedB/
│   ├── .../
├── examples/
│   ├── exampleA/
│   │   ├── main.tf
│   ├── exampleB/
│   ├── .../&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. Root Module&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 필수 요소인 Module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일의 위치는 Project Root Directory에 위치해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Root Module은 다른 Module의 기본 진입점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- main.tf에는 Child Module의 Source 위치 또는 Module들의 연결을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Child Module&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Resource들을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- main.tf Example&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;* 다른 Resource의 Argument에 접속하기 위해서는 &amp;lt;RESOURCE_TYPE&amp;gt;로 접근&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1601735655513&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Syntax
resource &quot;&amp;lt;RESOURCE_TYPE&amp;gt;&quot; &quot;&amp;lt;NAME&amp;gt;&quot;{
  &amp;lt;ATTRIBUTE&amp;gt; = &amp;lt;VALUE&amp;gt;
}

# Example
resource &quot;aws_vpc&quot; &quot;myVPC&quot; {
  cidr_block = &quot;${var.vpc_cidr}&quot;
  tags = {
    Name = &quot;${var.name}&quot;
  }
  enable_dns_hostnames = &quot;true&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- variables.tf Example&lt;/p&gt;
&lt;pre id=&quot;code_1601735694661&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;variable &quot;name&quot; {
  description = &quot;VPC Name&quot;
  type = &quot;string&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- output.tf Example&lt;/p&gt;
&lt;pre id=&quot;code_1601735729415&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output &quot;myPub-id&quot; {
  value = &quot;${aws_subnet.myPubC.id}&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Step 3. Calling Modules&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Calling Child Module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;* 자식 모듈 호출하는&amp;nbsp; 방법&lt;/p&gt;
&lt;pre id=&quot;code_1601736360117&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# INPUT_VARIABLE은 Module의 variables.tf 파일에 정의되어 있어야 한다.
# 다른 Module의 값을 사용하기 위해서는 다른 Module의 output.tf 파일에 정의되어 있거나, 해당 파일에 정의되어 있어야 한다. 
module &quot;&amp;lt;MODULE_NAME&amp;gt;&quot; {
 source = &quot;&amp;lt;SOURCE_PATH&amp;gt;&quot;
 &amp;lt;INPUT_VARIABLE&amp;gt; = &quot;&amp;lt;STRING_VALUE&amp;gt;&quot;
 &amp;lt;INPUT_VARIABLE&amp;gt; = &amp;lt;INTEGER_VALUE&amp;gt;
}

# example
module &quot;ec2&quot; {
 source = &quot;./modules/ec2&quot;

 vpc_id = &quot;${module.vpc.spoonVPC}&quot;
}
module &quot;vpc&quot; {
 source = &quot;./modules/vpc&quot;

 name = &quot;spoonVPC&quot;
 vpc_cidr = &quot;192.168.0.0/16&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Step 4. Terraform Plan &amp;amp; Apply&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. terraform plan 명령어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- terraform plan 명령어를 실행하면, Terraform Code와 현재 Infra 상태를 비교하여 생성/변경/삭제할 Resource 항목들을 나열한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 원하는 대로 결과가 출력이 되지 않으면 Code를 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1601739580185&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform paln&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. terraform apply 명령어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- terraform plan 명령어를 통해 원하는 결과가 확인되면, 결과를 현재 Infra에 적용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- terraform apply 명령어를 실행하면, 생성/변경/삭제할 Resource 항목들을 현재 Infra에 적용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1601739774874&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform apply&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Step 5. Terraform Destroy&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- terraform destroy 명령어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;* 해당 명령어를 통해 Infra를 삭제한다.&lt;/p&gt;
&lt;pre id=&quot;code_1601739905406&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ terraform destroy [options] [dir]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;- &lt;a href=&quot;https://www.44bits.io/ko/post/terraform_introduction_infrastrucute_as_code&quot;&gt;https://www.44bits.io/ko/post/terraform_introduction_infrastrucute_as_code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- Terraform 공식 사이트 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.terraform.io/&quot;&gt;https://www.terraform.io/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;a id=&quot;user-content-참고하기-좋은-사이트&quot; style=&quot;color: #000000;&quot; href=&quot;https://github.com/yoon2ix/Yoon-TIL/blob/master/Terraform/01-terraform-start.md#%EC%B0%B8%EA%B3%A0%ED%95%98%EA%B8%B0-%EC%A2%8B%EC%9D%80-%EC%82%AC%EC%9D%B4%ED%8A%B8&quot; aria-hidden=&quot;true&quot;&gt;&lt;/a&gt;참고하기 좋은 사이트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a href=&quot;https://github.com/futurice/terraform-examples&quot;&gt;https://github.com/futurice/terraform-examples&lt;/a&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;</description>
      <category>Tool/Terraform</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/228</guid>
      <comments>https://yoonix.tistory.com/228#entry228comment</comments>
      <pubDate>Fri, 25 Sep 2020 00:18:05 +0900</pubDate>
    </item>
    <item>
      <title>Terraform 이란?</title>
      <link>https://yoonix.tistory.com/227</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #2f5496;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;■ Terraform&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Terraform은 HashiCorp에서 만든 Infra Resource의 Modeling 및 Provisionin을 도와주는 Tool 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; IaC (Infrastructure as Code)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- Code를 이용해 Infra를 관리한다는 의미&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- IaC를 위한 Tool로는 Terraform, AWS CloudFormation 등이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #36424d;&quot;&gt;&lt;b&gt;&amp;bull; 멱등성&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 기존 Script 같은 경우, 조건문을 이용하여 결과가 같아지도록 만들 수 있지만, 일반적으로 여러 번 실행에 대한 동일한 결과를 보장하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;- 요즘에 나오는 Tools(Terraform, Ansible 등)은 멱등성을 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Tool/Terraform</category>
      <author>heyoon2j</author>
      <guid isPermaLink="true">https://yoonix.tistory.com/227</guid>
      <comments>https://yoonix.tistory.com/227#entry227comment</comments>
      <pubDate>Thu, 24 Sep 2020 15:26:42 +0900</pubDate>
    </item>
  </channel>
</rss>