티스토리 뷰

<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>자바 성능 튜닝 이야기 요약 (ch1 - 8)</title>

<!-- 2016-08-31 수 17:29 -->




<style type="text/css">

 <!--/*--><![CDATA[/*><!--*/

  .title  { text-align: center; }

  .todo   { font-family: monospace; color: red; }

  .done   { color: green; }

  .tag    { background-color: #eee; font-family: monospace;

            padding: 2px; font-size: 80%; font-weight: normal; }

  .timestamp { color: #bebebe; }

  .timestamp-kwd { color: #5f9ea0; }

  .right  { margin-left: auto; margin-right: 0px;  text-align: right; }

  .left   { margin-left: 0px;  margin-right: auto; text-align: left; }

  .center { margin-left: auto; margin-right: auto; text-align: center; }

  .underline { text-decoration: underline; }

  #postamble p, #preamble p { font-size: 90%; margin: .2em; }

  p.verse { margin-left: 3%; }

  pre {

    border: 1px solid #ccc;

    box-shadow: 3px 3px 3px #eee;

    padding: 8pt;

    font-family: monospace;

    overflow: auto;

    margin: 1.2em;

  }

  pre.src {

    position: relative;

    overflow: visible;

    padding-top: 1.2em;

  }

  pre.src:before {

    display: none;

    position: absolute;

    background-color: white;

    top: -10px;

    right: 10px;

    padding: 3px;

    border: 1px solid black;

  }

  pre.src:hover:before { display: inline;}

  pre.src-sh:before    { content: 'sh'; }

  pre.src-bash:before  { content: 'sh'; }

  pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }

  pre.src-R:before     { content: 'R'; }

  pre.src-perl:before  { content: 'Perl'; }

  pre.src-java:before  { content: 'Java'; }

  pre.src-sql:before   { content: 'SQL'; }


  table { border-collapse:collapse; }

  caption.t-above { caption-side: top; }

  caption.t-bottom { caption-side: bottom; }

  td, th { vertical-align:top;  }

  th.right  { text-align: center;  }

  th.left   { text-align: center;   }

  th.center { text-align: center; }

  td.right  { text-align: right;  }

  td.left   { text-align: left;   }

  td.center { text-align: center; }

  dt { font-weight: bold; }

  .footpara:nth-child(2) { display: inline; }

  .footpara { display: block; }

  .footdef  { margin-bottom: 1em; }

  .figure { padding: 1em; }

  .figure p { text-align: center; }

  .inlinetask {

    padding: 10px;

    border: 2px solid gray;

    margin: 10px;

    background: #ffffcc;

  }

  #org-div-home-and-up

   { text-align: right; font-size: 70%; white-space: nowrap; }

  textarea { overflow-x: auto; }

  .linenr { font-size: smaller }

  .code-highlighted { background-color: #ffff00; }

  .org-info-js_info-navigation { border-style: none; }

  #org-info-js_console-label

    { font-size: 10px; font-weight: bold; white-space: nowrap; }

  .org-info-js_search-highlight

    { background-color: #ffff00; color: #000000; font-weight: bold; }

  /*]]>*/-->

</style>

<script type="text/javascript">

/*

@licstart  The following is the entire license notice for the

JavaScript code in this tag.


Copyright (C) 2012-2013 Free Software Foundation, Inc.


The JavaScript code in this tag is free software: you can

redistribute it and/or modify it under the terms of the GNU

General Public License (GNU GPL) as published by the Free Software

Foundation, either version 3 of the License, or (at your option)

any later version.  The code is distributed WITHOUT ANY WARRANTY;

without even the implied warranty of MERCHANTABILITY or FITNESS

FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.


As additional permission under GNU GPL version 3 section 7, you

may distribute non-source (e.g., minimized or compacted) forms of

that code without the copy of the GNU GPL normally required by

section 4, provided you include this license notice and a URL

through which recipients can access the Corresponding Source.



@licend  The above is the entire license notice

for the JavaScript code in this tag.

*/

<!--/*--><![CDATA[/*><!--*/

 function CodeHighlightOn(elem, id)

 {

   var target = document.getElementById(id);

   if(null != target) {

     elem.cacheClassElem = elem.className;

     elem.cacheClassTarget = target.className;

     target.className = "code-highlighted";

     elem.className   = "code-highlighted";

   }

 }

 function CodeHighlightOff(elem, id)

 {

   var target = document.getElementById(id);

   if(elem.cacheClassElem)

     elem.className = elem.cacheClassElem;

   if(elem.cacheClassTarget)

     target.className = elem.cacheClassTarget;

 }

/*]]>*///-->

</script>

</head>

<body>

<div id="content">

<h1 class="title">

자바 성능 튜닝 이야기 요약 (ch1 - 8)</h1>

<div id="table-of-contents">

<h2>

Table of Contents</h2>

<div id="text-table-of-contents">

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-1">1. desdign pattern</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-1-1">1.1. Transfer Object</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-1-2">1.2. Service Locator</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-2">2. APM</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-3">3. String</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-3-1">3.1. string builder</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-3-2">3.2. string buffer</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4">4. Collection</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-1">4.1. Set</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-1-1">4.1.1. HashSet</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-1-2">4.1.2. TreeSet</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-1-3">4.1.3. LinkedHashSet</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-2">4.2. red black tree</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-3">4.3. List</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-3-1">4.3.1. Vector</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-3-2">4.3.2. ArrayList</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-3-3">4.3.3. LinkedList</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-4">4.4. Map</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-4-1">4.4.1. HashTable</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-4-2">4.4.2. HashMap</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-4-3">4.4.3. TreeMap</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-4-4">4.4.4. LinkedHashMap</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-5">4.5. Queue</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-5-1">4.5.1. priorityQueue</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-5-2">4.5.2. LinkedBlockingQueue</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-5-3">4.5.3. ArrayBlockingQueue</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-5-4">4.5.4. DelayQueue</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-5-5">4.5.5. SynchronousQueue</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-6">4.6. 대표 클래스</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-7">4.7. 동기화</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-4-8">4.8. 마치며</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-5">5. loop</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-5-1">5.1. 참고</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-5-2">5.2. if</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-6">6. static</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-6-1">6.1. http return code</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-6-2">6.2. static variable</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-6-3">6.3. static block</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-6-3-1">6.3.1. static 사용 예시</a></li>

</ul>

</li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-7">7. reflection</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-7-1">7.1. Class 클래스</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-7-2">7.2. 메서드 클래스</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-7-3">7.3. 필드 클래스</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-7-4">7.4. 사용시 주의 사항</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-7-5">7.5. 정리하며</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-8">8. synchronized</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-8-1">8.1. 스레드</a>

<ul>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-8-1-1">8.1.1. 구현</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-8-1-2">8.1.2. block메서드: sleep, wait, join</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-8-1-3">8.1.3. interrupt, notify, notifyAll</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-8-1-4">8.1.4. 예시</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-8-1-5">8.1.5. 스레드 중지하기</a></li>

</ul>

</li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-8-2">8.2. synchronize</a></li>

<li><a href="https://www.blogger.com/blogger.g?blogID=7538964523841624141#sec-8-3">8.3. java.util.concurrent</a></li>

</ul>

</li>

</ul>

</div>

</div>

<div class="outline-2" id="outline-container-sec-1">

<h2 id="sec-1">

<span class="section-number-2">1</span> desdign pattern</h2>

<div class="outline-text-2" id="text-1">


많이 사용되는 패턴을 숙지하자

<br />


</div>

<div class="outline-3" id="outline-container-sec-1-1">

<h3 id="sec-1-1">

<span class="section-number-3">1.1</span> Transfer Object</h3>

<div class="outline-text-3" id="text-1-1">


set, get 함수를 만들어 놓고 toString 함수를 구현한다. 

toString 안에선 빌더 사용

<br />


</div>

</div>

<div class="outline-3" id="outline-container-sec-1-2">

<h3 id="sec-1-2">

<span class="section-number-3">1.2</span> Service Locator</h3>

<div class="outline-text-3" id="text-1-2">


static 하게 생성된 서비스 로케이터 안에 캐시를 두고 

데이터를 저장해 둔다. 데이터 캐시용이다.

<br />


</div>

</div>

</div>

<div class="outline-2" id="outline-container-sec-2">

<h2 id="sec-2">

<span class="section-number-2">2</span> APM</h2>

<div class="outline-text-2" id="text-2">


프로그램 속도 측정을 위해 APM을 사용하자

간단히 annotation을 사용해 클래스의 속도를 측정할 수 있다.

<br />


</div>

</div>

<div class="outline-2" id="outline-container-sec-3">

<h2 id="sec-3">

<span class="section-number-2">3</span> String</h2>

<div class="outline-text-2" id="text-3">


 string 클래스를 사용하지 말고 string builder/ buffer를 사용하자

string클래스가 스트링 + 연산을 수행할 때 기존 객체를 버리고 새로운 string 객체를 만들어 사용한다. 

그래서 속도가 매우 느리고 메모리도 엄청나게 많이 사용한다. 

<br />


</div>

<div class="outline-3" id="outline-container-sec-3-1">

<h3 id="sec-3-1">

<span class="section-number-3">3.1</span> string builder</h3>

</div>

<div class="outline-3" id="outline-container-sec-3-2">

<h3 id="sec-3-2">

<span class="section-number-3">3.2</span> string buffer</h3>

<div class="outline-text-3" id="text-3-2">


thread safe  / singleton, static 에 사용

<br />


</div>

</div>

</div>

<div class="outline-2" id="outline-container-sec-4">

<h2 id="sec-4">

<span class="section-number-2">4</span> Collection</h2>

<div class="outline-text-2" id="text-4">

</div>

<div class="outline-3" id="outline-container-sec-4-1">

<h3 id="sec-4-1">

<span class="section-number-3">4.1</span> Set</h3>

<div class="outline-text-3" id="text-4-1">


set에 iterator가 구현되어 있긴 하지만

여러 데이터를 넣어 두고 해당 데이터가 존재하는지를 확인하는 용도로 사용되는 경우가 많다. 

<br />


</div>

<div class="outline-4" id="outline-container-sec-4-1-1">

<h4 id="sec-4-1-1">

<span class="section-number-4">4.1.1</span> HashSet</h4>

<div class="outline-text-4" id="text-4-1-1">


해쉬테이블에 데이터를 담음. 순서 없음

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-1-2">

<h4 id="sec-4-1-2">

<span class="section-number-4">4.1.2</span> TreeSet</h4>

<div class="outline-text-4" id="text-4-1-2">


값에 따라서 순서 결정

다른 HashSet보다 add가 느리다.

키 값이 있는지 확인하는 속도도 느린 편이다.

값의 정렬이 필요한 경우가 아니면 쓰지 않는다. 

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-1-3">

<h4 id="sec-4-1-3">

<span class="section-number-4">4.1.3</span> LinkedHashSet</h4>

<div class="outline-text-4" id="text-4-1-3">


HashTable에 데이터를 담는데 

저장된 순서에 따라 순서 결정 (??)

<br />


</div>

</div>

</div>

<div class="outline-3" id="outline-container-sec-4-2">

<h3 id="sec-4-2">

<span class="section-number-3">4.2</span> red black tree</h3>

<div class="outline-text-3" id="text-4-2">

<ul class="org-ul">

<li>노드는 검은색 혹은 빨간색

</li>

<li>root 는 검은색

</li>

<li>말단은 검은색 

</li>

<li>붉은 노드는 검은 하위 노드

</li>

<li>모든 말단 노드로 이동하는 경로의 검은 노드 수는 동일 

</li>

</ul>

</div>

</div>

<div class="outline-3" id="outline-container-sec-4-3">

<h3 id="sec-4-3">

<span class="section-number-3">4.3</span> List</h3>

<div class="outline-text-3" id="text-4-3">


add는 속도 비슷, get(해당 인덱스의 데이터를 가져옴)의 경우 LinkedList가 터무니없이 느리다. 

이유는 linked list가 큐를 상속하기 때문인데 큐의 get은 매우 느리다. 

( 보기에 peek은 힙의 루트를 보는것 같고, get은 인덱스를 순차적으로 찾아서 느린 것 같긴 한데)

(fifo는 first in first out이고 인덱스랑 관계 없음?)

 get 메서드 대신, peek 메서드를 사용하면 빠르게 데이터를 얻을 수 있다. 

벡터는 synchronized라서 arraylist보다 상당히 느리다. 

결과적으로 속도는 LinkedList(peek) &gt; ArrayList get &gt; Vector get &gt; LinkedList (get)

<br />




벡터와 arraylist에서 가장 첫 데이터를 remove하면 이후 인덱스의 메모리가 모두 당겨온다.

첫 번째 값을 삭제하는 것이 마지막 값을 삭제하는 것보다 느리다. 

<br />


</div>

<div class="outline-4" id="outline-container-sec-4-3-1">

<h4 id="sec-4-3-1">

<span class="section-number-4">4.3.1</span> Vector</h4>

<div class="outline-text-4" id="text-4-3-1">


thread safe

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-3-2">

<h4 id="sec-4-3-2">

<span class="section-number-4">4.3.2</span> ArrayList</h4>

</div>

<div class="outline-4" id="outline-container-sec-4-3-3">

<h4 id="sec-4-3-3">

<span class="section-number-4">4.3.3</span> LinkedList</h4>

<div class="outline-text-4" id="text-4-3-3">


(큐를 상속한 dequeue(double ended)를 상속. )

Queue 인터페이스를 구현해서 fifo 가능 

<br />


</div>

</div>

</div>

<div class="outline-3" id="outline-container-sec-4-4">

<h3 id="sec-4-4">

<span class="section-number-3">4.4</span> Map</h3>

<div class="outline-text-3" id="text-4-4">

</div>

<div class="outline-4" id="outline-container-sec-4-4-1">

<h4 id="sec-4-4-1">

<span class="section-number-4">4.4.1</span> HashTable</h4>

<div class="outline-text-4" id="text-4-4-1">


Thread safe 

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-4-2">

<h4 id="sec-4-4-2">

<span class="section-number-4">4.4.2</span> HashMap</h4>

<div class="outline-text-4" id="text-4-4-2">


null 값 허용

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-4-3">

<h4 id="sec-4-4-3">

<span class="section-number-4">4.4.3</span> TreeMap</h4>

<div class="outline-text-4" id="text-4-4-3">


treeset 과 다른 것은 키에 의해 순서가 정해짐

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-4-4">

<h4 id="sec-4-4-4">

<span class="section-number-4">4.4.4</span> LinkedHashMap</h4>

<div class="outline-text-4" id="text-4-4-4">


doubly linkedlist

<br />


</div>

</div>

</div>

<div class="outline-3" id="outline-container-sec-4-5">

<h3 id="sec-4-5">

<span class="section-number-3">4.5</span> Queue</h3>

<div class="outline-text-3" id="text-4-5">

</div>

<div class="outline-4" id="outline-container-sec-4-5-1">

<h4 id="sec-4-5-1">

<span class="section-number-4">4.5.1</span> priorityQueue</h4>

<div class="outline-text-4" id="text-4-5-1">


추가된 순서와 상관없이 먼저 생성된 객체가 먼저.

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-5-2">

<h4 id="sec-4-5-2">

<span class="section-number-4">4.5.2</span> LinkedBlockingQueue</h4>

<div class="outline-text-4" id="text-4-5-2">


블록킹 큐는 큐에 공간이 없으면 생길 때까지 blocked

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-5-3">

<h4 id="sec-4-5-3">

<span class="section-number-4">4.5.3</span> ArrayBlockingQueue</h4>

<div class="outline-text-4" id="text-4-5-3">


저장하는 데이터 수가 fix

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-5-4">

<h4 id="sec-4-5-4">

<span class="section-number-4">4.5.4</span> DelayQueue</h4>

<div class="outline-text-4" id="text-4-5-4">


큐가 대기하는 시간을 지정하여 처리하도록 되어 있음.

<br />


</div>

</div>

<div class="outline-4" id="outline-container-sec-4-5-5">

<h4 id="sec-4-5-5">

<span class="section-number-4">4.5.5</span> SynchronousQueue</h4>

<div class="outline-text-4" id="text-4-5-5">


한 스레드가 put 하면 다른 스레드에서 take 할 때 까지 기다린다. 

<br />


</div>

</div>

</div>

<div class="outline-3" id="outline-container-sec-4-6">

<h3 id="sec-4-6">

<span class="section-number-3">4.6</span> 대표 클래스</h3>

<div class="outline-text-3" id="text-4-6">

<ul class="org-ul">

<li>set : hashset

</li>

<li>list : arraylist

</li>

<li>map : hashmap

</li>

<li>queue : linkedlist

</li>

</ul>

</div>

</div>

<div class="outline-3" id="outline-container-sec-4-7">

<h3 id="sec-4-7">

<span class="section-number-3">4.7</span> 동기화</h3>

<div class="outline-text-3" id="text-4-7">


jdk 1.0에선 vector, hashtable은 동기화 처리가 되어 있다. 

jdk 1.2에선 동기화 처리가 되어있지 않다. 

대신 Collections에서 synchronized로 시작하는 메서드를 이용한다.

Set s = Collections.synchronizedSet(new HashSet (..));

<br />


</div>

</div>

<div class="outline-3" id="outline-container-sec-4-8">

<h3 id="sec-4-8">

<span class="section-number-3">4.8</span> 마치며</h3>

<div class="outline-text-3" id="text-4-8">


안드로이드 클라이언트에선 성능이 중요하지만 

그냥 웹 클라이언트는 크게 의미가 없다. 

<br />


</div>

</div>

</div>

<div class="outline-2" id="outline-container-sec-5">

<h2 id="sec-5">

<span class="section-number-2">5</span> loop</h2>

<div class="outline-text-2" id="text-5">


while문은 잘못하면 무한루프에 빠지므로 자제하자

for문 조건 안에 연산을 넣지말 고, 미리 변수에 넣어두자. 

처음부터 끝까지 이터레이션 할 땐 foreach를 쓰면 간편하다. 

하지만 foreach 속도가 막 차이 나는 건 아니다. 

<br />


</div>

<div class="outline-3" id="outline-container-sec-5-1">

<h3 id="sec-5-1">

<span class="section-number-3">5.1</span> 참고</h3>

<div class="outline-text-3" id="text-5-1">


 JIT 컴파일러는 의미없는 코드는 생략할 수 있다. 

만약 어떤 변수가 실제로 쓰이지 않으면 코드에서 생략됨..

<br />


</div>

</div>

<div class="outline-3" id="outline-container-sec-5-2">

<h3 id="sec-5-2">

<span class="section-number-3">5.2</span> if</h3>

<div class="outline-text-3" id="text-5-2">


if 하나 당 시간 소요니 너무 많이 남발하지 말자

switch case문은 컴파일 하면 ifne, goto로 바뀌게 되는데, 

if보다 가독성이 좋다. 그리고 컴파일 시 숫자가 정렬된 if 문이 된다.

switch-case문 JDK6 에서는 정수, enum 만 사용 가능 했는데 

이후엔 string 도 사용가능. 내부 구현은 hashCode를 이용함.

<br />


</div>

</div>

</div>

<div class="outline-2" id="outline-container-sec-6">

<h2 id="sec-6">

<span class="section-number-2">6</span> static</h2>

<div class="outline-text-2" id="text-6">

</div>

<div class="outline-3" id="outline-container-sec-6-1">

<h3 id="sec-6-1">

<span class="section-number-3">6.1</span> http return code</h3>

<div class="outline-text-3" id="text-6-1">

<ul class="org-ul">

<li>200 : 정상적인 경우의 리턴 코드 

</li>

<li>300 : redirection이 필요한 경우 

</li>

<li>400 : 클라이언트 오류가 있을 경우 (존재하지 않는 주소 요청)

</li>

<li>500 : 서버에 오류가 있을 때 

</li>

</ul>

</div>

</div>

<div class="outline-3" id="outline-container-sec-6-2">

<h3 id="sec-6-2">

<span class="section-number-3">6.2</span> static variable</h3>

<div class="outline-text-3" id="text-6-2">


static변수는 클래스의 변수로 객체에 관계없이 하나의 주소를 가진다.

(다른 JVM이면 다른 주소를 가진다)

GC의 대상이 아니다.

<br />


</div>

</div>

<div class="outline-3" id="outline-container-sec-6-3">

<h3 id="sec-6-3">

<span class="section-number-3">6.3</span> static block</h3>

<div class="outline-text-3" id="text-6-3">


static block은 (static {//do something} ) 

클래스가 최초로 로딩될 때 순차적으로 실행된다. 생성자와는 관계가 없다. 

주로 DB, 설정 파일 읽을 때 static block을 사용

<br />


</div>

<div class="outline-4" id="outline-container-sec-6-3-1">

<h4 id="sec-6-3-1">

<span class="section-number-4">6.3.1</span> static 사용 예시</h4>

<div class="outline-text-4" id="text-6-3-1">


DB를 읽어오는 CodeManager가 있다. 

해당 클래스 안에 

<br />



<div class="org-src-container">


<pre class="src src-java">pulbic class Code Manager {

    private static CodeManger cm;

    static {

       cm = new CodeManager();

    }

    private CodeManager () {

    }

    public static CodeManagerGetInstance(){

       return cm;

    }

    ...

}

</pre>

</div>

</div>

</div>

</div>

</div>

<div class="outline-2" id="outline-container-sec-7">

<h2 id="sec-7">

<span class="section-number-2">7</span> reflection</h2>

<div class="outline-text-2" id="text-7">


reflection이라는 패키지를 이용하면 

JVM에 로딩되어 있는 클래스와 메서드 정보를 읽을 수 있다. 

<br />


</div>

<div class="outline-3" id="outline-container-sec-7-1">

<h3 id="sec-7-1">

<span class="section-number-3">7.1</span> Class 클래스</h3>

<div class="outline-text-3" id="text-7-1">

<ul class="org-ul">

<li>String getName(): 클래스의 이름을 리턴한다.

</li>

<li>Package getPackage()

</li>

<li>Field[] getFields(): public으로 선언된 변수 목록

</li>

</ul>

<br />


<div class="org-src-container">


<pre class="src src-java">String currenClassName=this.getClass().getName();

</pre>

</div>

</div>

</div>

<div class="outline-3" id="outline-container-sec-7-2">

<h3 id="sec-7-2">

<span class="section-number-3">7.2</span> 메서드 클래스</h3>

<div class="outline-text-3" id="text-7-2">

<ul class="org-ul">

<li>Class&lt;?&gt; getDeclaringClass(): 해당 메서드가 선언된 클래스 정보를 리턴한다.

</li>

<li>Class&lt;?&gt; getReturnType(): 해당 메서드의 리턴 타입을 리턴

</li>

<li>Class&lt;?&gt;[] getParameterTypes(): 해당 메서드를 사용하기 위한 매개변수의 타입들을 리턴

</li>

</ul>

<br />


</div>

</div>

<div class="outline-3" id="outline-container-sec-7-3">

<h3 id="sec-7-3">

<span class="section-number-3">7.3</span> 필드 클래스</h3>

<div class="outline-text-3" id="text-7-3">

<ul class="org-ul">

<li>int getModifiers() : 해당 변수의 접근자 정보를 리턴 

</li>

<li>String getName() : 해당 변수의 이름을 리턴 

</li>

<li>String toString() : 해당 변수의 정보를 리턴

</li>

</ul>

</div>

</div>

<div class="outline-3" id="outline-container-sec-7-4">

<h3 id="sec-7-4">

<span class="section-number-3">7.4</span> 사용시 주의 사항</h3>

<div class="outline-text-3" id="text-7-4">


리플렉션은 느리다.

object 타입을 확인하기 위해 리플렉션을 사용해선 안되고 

instance of 를 사용해야 한다. (10배 가량 빠름)

<br />



<div class="org-src-container">


<pre class="src src-java">Object src = new BigDeciaml("6");

if (src.getClass().getName().equals("java.math.BigDecimal")) {}

if (src instance of java.math.BigDecimal){}

</pre>

</div>

</div>

</div>

<div class="outline-3" id="outline-container-sec-7-5">

<h3 id="sec-7-5">

<span class="section-number-3">7.5</span> 정리하며</h3>

<div class="outline-text-3" id="text-7-5">


클래스의 메타 데이터 정보는 JVM의 perm영역에 저장.

많은 클래스가 동적으로 생성될 경우 perm에서 OutOfMemoryError가 발생할 수 있다. 

<br />


</div>

</div>

</div>

<div class="outline-2" id="outline-container-sec-8">

<h2 id="sec-8">

<span class="section-number-2">8</span> synchronized</h2>

<div class="outline-text-2" id="text-8">

</div>

<div class="outline-3" id="outline-container-sec-8-1">

<h3 id="sec-8-1">

<span class="section-number-3">8.1</span> 스레드</h3>

<div class="outline-text-3" id="text-8-1">

</div>

<div class="outline-4" id="outline-container-sec-8-1-1">

<h4 id="sec-8-1-1">

<span class="section-number-4">8.1.1</span> 구현</h4>

<div class="outline-text-4" id="text-8-1-1">


Thread 클래스를 상속하거나 Runnable 인터페이스를 구현해 스레드를 구현할 수 있다. 

(Thread 클래스 implements Runnable)

Runnable 인터페이스에선 run 메서드를 가지고 있고, 

Thread클래스는 이를 실행하는 start 함수를 갖고 있다. 

<br />



<div class="org-src-container">


<pre class="src src-java">public class RunnableImpl implements Runnable {

    public void run() {}

}

public class ThreadExtends extends Thread {

    public void run() {}

}


public class RunThreads {

   public static void main() {

       RunnableImpl ri = new RunnableImpl();

       new Thread(ri).start();


       ThreadExtends te = new ThreadExtends();

       te.start();

}

</pre>

</div>

</div>

</div>

<div class="outline-4" id="outline-container-sec-8-1-2">

<h4 id="sec-8-1-2">

<span class="section-number-4">8.1.2</span> block메서드: sleep, wait, join</h4>

<div class="outline-text-4" id="text-8-1-2">

<ul class="org-ul">

<li>sleep: 명시된 시간만큼 대기

</li>

<li>wait: 명시된 시간만큼 notify가 올 때까지 대기 (시간 명시 안할 수도 있음)

</li>

<li>join: 명시된 시간만큼 해당 스레드가 죽기를 기다림(시간 명시 안할 수도 있음)

</li>

</ul>

</div>

</div>

<div class="outline-4" id="outline-container-sec-8-1-3">

<h4 id="sec-8-1-3">

<span class="section-number-4">8.1.3</span> interrupt, notify, notifyAll</h4>

<div class="outline-text-4" id="text-8-1-3">

<ul class="org-ul">

<li>interrupt() :  block 상태를 중지 시킨다. 중지된 스레드에선 InterruptedException이 발생한다. 

</li>

<li>isInterrupted(): 인터럽트 여부를 확인한다. (인스턴스 메서드로 해당 스레드의 상태확인),

</li>

<li>interrupted(): (스태틱 메서드로 현 스레드의 상태확인)

</li>

<li>isAlive(): 해당 스레드가 살아있는지 

</li>

<li>notify, notifyAll : 객체의 모니터와 관련된 단일/모든 스레드를 깨움

</li>

</ul>

</div>

</div>

<div class="outline-4" id="outline-container-sec-8-1-4">

<h4 id="sec-8-1-4">

<span class="section-number-4">8.1.4</span> 예시</h4>

<div class="outline-text-4" id="text-8-1-4">

<div class="org-src-container">


<pre class="src src-java">public class Sleep extends Thread {

    public void run() {

 try { Thread.sleep(10000); // sleep 10 seconds

 } catch (InterruptedException e) {

    System.out.println("interrupted");

 } catch (Exception e) {

    e.printStackTrace();

 }

   }

}

public static void main (String args[]) {

    Sleep s=new Sleep();

    s.start();

    try {

       int cnt=0;

       while (cnt &lt; 5) {

  s.join(1000); // 1초 동안 s 를 기다린다. 하지만 sleep 중

  cnt++;

       }

       if (s.isAlive) { 

  s.interrupt();

       }

    }catch(Exception e) {

       e.printStackTrace();

    } 

}

</pre>

</div>

</div>

</div>

<div class="outline-4" id="outline-container-sec-8-1-5">

<h4 id="sec-8-1-5">

<span class="section-number-4">8.1.5</span> 스레드 중지하기</h4>

<div class="outline-text-4" id="text-8-1-5">


interrupt는 block 메서드를 통해 block을 중지시키는 메서드지 스레드를 중지 시키진 않는다. 

(정확히는 block 중지 예약으로, 미래의 sleep이 있더라도 interruptException 발생)

스레드를 멈추려면 "while과 flag" 혹은 매우 짧은 시간의 sleep을 이용한다. 

<br />



<div class="org-src-container">


<pre class="src src-java">public class infinitThread extends Thread {

    private boolean flag = true;

    public void run () {

 while (flag) {

     // do something

 }

 try {

     Thread.sleep(0,1); // 1ns

 }catch(Exception e) {

     break;

 }


    }


    public void setFlag (boolean flag) {

 this.flag = flag;

    }

}

</pre>

</div>

</div>

</div>

</div>

<div class="outline-3" id="outline-container-sec-8-2">

<h3 id="sec-8-2">

<span class="section-number-3">8.2</span> synchronize</h3>

<div class="outline-text-3" id="text-8-2">


메서드 혹은 블록에 사용. 

(생성자엔 사용 불가능)

<br />


<div class="org-src-container">


<pre class="src src-java">public synchronized void sampleMethod () {}


private Object obj=new Object();

public void sampleBlock() {

    synchronized(obj){


    }

}

</pre>

</div>

synch되야하는 변수가 static이면

해당 변수를 조작하는 메서드는 static synchronized여야 한다.

그냥 synchronized 일 경우, 

각 객체마다 따로 메서드에 대한 동기화만 이뤄지기 때문에

클래스 변수인 static변수에 대한 동기화는 이뤄지지 않는다.

<br />


</div>

</div>

<div class="outline-3" id="outline-container-sec-8-3">

<h3 id="sec-8-3">

<span class="section-number-3">8.3</span> java.util.concurrent</h3>

<div class="outline-text-3" id="text-8-3">


JDK 5.0에 추가된 패키지로 스레드 관련 api를 지원한다. 

<br />


<ul class="org-ul">

<li>lock 

</li>

<li>executors : 스레드 풀 및 관리 

</li>

<li>Concurrent collection

</li>

<li>Atomic varibles : synchronized 없이 동기화 되어 있는 변수

</li>

</ul>

</div>

</div>

</div>

</div>

<div class="status" id="postamble">

<div class="author">

Author: dahyun</div>

<div class="date">

Created: 2016-08-31 수 17:29</div>

<div class="creator">

<a href="http://www.gnu.org/software/emacs/">Emacs</a> 24.5.1 (<a href="http://orgmode.org/">Org</a> mode 8.2.10)</div>

<div class="validation">

<a href="http://validator.w3.org/check?uri=referer">Validate</a></div>

</div>

</body>

</html>


'Programming tips > language' 카테고리의 다른 글

c coding convetion  (0) 2018.03.31
shell programming tutorial  (0) 2018.03.31
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함