티스토리 뷰
<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) > ArrayList get > Vector get > 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<?> getDeclaringClass(): 해당 메서드가 선언된 클래스 정보를 리턴한다.
</li>
<li>Class<?> getReturnType(): 해당 메서드의 리턴 타입을 리턴
</li>
<li>Class<?>[] 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 < 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 |