2013년 2월 27일 수요일

[펌] JMX를 이용한 Tomcat 6/7 Monitoring(JDBC)포함

원문 : http://www.javapattern.info/454

Tomcat JMX 접속 모니터링 설정 및 확인 방법

1. Tomcat 설치 - 7.0.X

2. tomcat user/role setting
[jboss@ip-10-31-156-81 bin]$ vi ../conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="admin-gui" />
  <role rolename="manager" />
  <role rolename="manager-gui" />
  <role rolename="manager-script" />
  <role rolename="manager-jmx" />
  <role rolename="manager-status" />
  <user username="tomcat" password="s3cret" roles="admin-gui,manager-gui,manager-script,manager-jmx,manager-status" />
</tomcat-users>

------------------------------------------------------------
<?xml version='1.0' encoding='utf-8'?>
<tomcat-user>
   <role rolename="admin-gui" />
   <role rolename="manager" />
   <role rolename="manager-gui" />
   <role rolename="manager-script" />
   <role rolename="manager-jmx" />
   <role rolename="manager-status" />
   <user username="tomcat" password="" roles="admin-gui,manager-gui,manager-script,manager-jmx,manager-status" />
1
2
3
4
5
6
7
8
9
10
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="admin-gui" />
  <role rolename="manager" />
  <role rolename="manager-gui" />
  <role rolename="manager-script" />
  <role rolename="manager-jmx" />
  <role rolename="manager-status" />
  <user username="tomcat" password="s3cret" roles="admin-gui,manager-gui,manager-script,manager-jmx,manager-status" />
</tomcat-users>
------------------------------------------------------------

3. Web Browser를 위한 URL String Query
http://host-ip:port/manager/jmxproxy/?qry=*:*
------------------------------------------------------------
O<SPAN style="LINE-HEIGHT: normal; WHITE-SPACE: pre-wrap">K - Number of results: 106</SPAN><DIV><PRE style="LINE-HEIGHT: normal; WORD-WRAP: break-word; WHITE-SPACE: pre-wrap">Name: Catalina:type=ThreadPool,name="ajp-apr-8009"modelerType: org.apache.tomcat.util.modeler.BaseModelMBean
useSendfile: false
minSpareThreads: 10
 acceptorThreadPriority: 5
maxThreads: 200
sSLEnabled: false
sSLVerifyDepth: 10
 pollerThreadCount: 1
localPort: 8009
 connectionCount: 1
 currentThreadCount: 0
keepAliveTimeout: -1
threadPriority: 5
useComet: trues
SLCipherSuite: ALL
 soLinger: -1
sslEnabledProtocolsArray: Array[java.lang.String] of length 0
sendfileCount: 0
socketProperties: org.apache.tomcat.util.net.SocketProperties@556ca3d5
bindOnInit: true
backlog: 100
port: 8009
 usePolling: true
deferAccept: true
running: true
algorithm: SunX509
 pollTime: 2000
useCometTimeout: false
name: ajp-apr-8009
 sendfileSize: 1024
 maxHeaderCount: 100
 clientAuth: false
keepAliveCount: 0
tcpNoDelay: true
maxConnections: 8192
sSLVerifyClient: none
 maxKeepAliveRequests: 100
keystoreType: JKS
keystoreFile: /home/jboss/.keystore
 paused: false
sSLHonorCipherOrder: false
sSLProtocol: all
 sessionTimeout: 86400
 ciphersArray: Array[java.lang.String] of length 0
 sslProtocol: TLS
acceptorThreadCount: 1
 sendfileThreadCount: 1
soTimeout: -1
 currentThreadsBusy: 0
 daemon: true
sSLInsecureRenegotiation: false</PRE></DIV>
-----------------------------------------------------
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
O<SPAN style="LINE-HEIGHT: normal; WHITE-SPACE: pre-wrap">K - Number of results: 106</SPAN><DIV><PRE style="LINE-HEIGHT: normal; WORD-WRAP: break-word; WHITE-SPACE: pre-wrap">Name: Catalina:type=ThreadPool,name="ajp-apr-8009"
modelerType: org.apache.tomcat.util.modeler.BaseModelMBean
useSendfile: false
minSpareThreads: 10
acceptorThreadPriority: 5
maxThreads: 200
sSLEnabled: false
sSLVerifyDepth: 10
pollerThreadCount: 1
localPort: 8009
connectionCount: 1
currentThreadCount: 0
keepAliveTimeout: -1
threadPriority: 5
useComet: true
sSLCipherSuite: ALL
soLinger: -1
sslEnabledProtocolsArray: Array[java.lang.String] of length 0
sendfileCount: 0
socketProperties: org.apache.tomcat.util.net.SocketProperties@556ca3d5
bindOnInit: true
backlog: 100
port: 8009
usePolling: true
deferAccept: true
running: true
algorithm: SunX509
pollTime: 2000
useCometTimeout: false
name: ajp-apr-8009
sendfileSize: 1024
maxHeaderCount: 100
clientAuth: false
keepAliveCount: 0
tcpNoDelay: true
maxConnections: 8192
sSLVerifyClient: none
maxKeepAliveRequests: 100
keystoreType: JKS
keystoreFile: /home/jboss/.keystore
paused: false
sSLHonorCipherOrder: false
sSLProtocol: all
sessionTimeout: 86400
ciphersArray: Array[java.lang.String] of length 0
sslProtocol: TLS
acceptorThreadCount: 1
sendfileThreadCount: 1
soTimeout: -1
currentThreadsBusy: 0
daemon: true
sSLInsecureRenegotiation: false</PRE></DIV>


4. 위의 리스트내역 중 Name에 해당하는 부분을 URL의 Quer를 붙여넣으면 각 MBean에 대한 항목 확인 가능
예: http://host-ip:port/manager/jmxproxy/?qry=Catalina:type=DataSource,context=/host-manager,host=localhost,class=javax.sql.DataSource,name="jdbc/readPool"

2013년 2월 25일 월요일

[펌] RMI 사용시 -XX:+DisableExplicitGC 옵션 관련

원글 : http://logonjava.blogspot.kr/2010/07/java-distributed-gc-and.html
자바 프로그램에서 OutOfMemoryError 는 흔하게 발생하지만, 그 원인이 무척 다양하기 때문에 단순하게 메모리 부족으로 판단해서는 안된다.

에러 메시지에서 구분할 수 있는 세 가지는 1. heap memory가 부족한 경우, 2. perm area memory가 부족한 경우, 3. 새로운 thread를 생성할 수 없는 경우이다.

heap memory가 부족한 것은 JVM에 지정한 최대 heap 메모리 크기보다 더 큰 메모리 영역을 사용하려고 시도했기 때문인데 application이 memory leak을 발생시켜 사용 메모리가 점점 증가하는 경우라면 application의 leak을 해결하든지, 주기적으로 JVM을 재구동하든지 해야 한다. 그것이 아니라 순간적으로 큰 메모리를 사용할 가능성이 높은 applicaiton이라면 JVM의 최대 heap 크기를 늘려줘야 할 것이다.

이와 달리 perm area 부족의 경우는 조금 다른데 Sun(지금은 Oracle)의 HotSpot JVM에서는 permanent area 에 String 상수 풀이나 define된 클래스 정보들을 두고 있다.

보통의 경우 상수 풀이나 클래스 정보는 한번 load되면 unload할 일이 없지만, application의 특성에 따라 pluggable module 이 필요한 경우 이를 구현하기 위해 동적으로 ClassLoader를 생성하고 삭제하는 방법을 흔히 사용하는데, 이때 클래스 정보들이 적절히 unload되지 않으면 perm area에서도 memory leak이 생기게 된다.
즉, perm area에서의 memory leak은 ClassLoader 객체가 제대로 garbage collect 되지 않을 때 발생한다.

application에서 memory leak이 발생시키지 않은 경우에도 gc 옵션을 잘못 지정하여 발생할 수도 있는데, 흔히 발생했던 원인 중 하나는 JVM에서 CMS (Concurrent Mark and Sweep) gc 알고리즘을 지정한 경우이다.

CMS gc 알고리즘에서는 기본값으로는 perm area 에 대해 gc를 하지 않는다.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6329603

이 경우 해결책은 CMS 알고리즘을 쓰지 않거나 다음 옵션을 추가하는 것이다.

-XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled

최근에 이와 다른 이유로 perm area 에서 OutOfMemoryError가 나는 경우가 있어, heap dump를 분석해본 적이 있다. 뜻밖에도 remote 객체가 ClassLoader를 reference하고 있어서 ClassLoader가 gc되지 못한 경우였다.
RMI 혹은 EJB (JRMP)를 사용하는 application이었는데 gc가 안정적으로 실행되도록 -XX:+DisableExplicitGC 옵션을 켜놓았었다.

-XX:+DisableExplicitGC 옵션은 System.gc() 메소드를 호출해도 아무 일이 일어나지 않도록 한다.
이 때문에 분산 gc가 제대로 수행되지 않아서 ClassLoader가 gc되지 못하였고, 결국 perm area가 full이 났던 것이다.

자바의 분산 gc (distributed gc, 즉 원격 객체에 대한 gc) 알고리즘은 기본적으로 60초마다 System.gc() 메커니즘에 따라 full gc를 요청하게 된다.
이때, 더 이상 사용하지 않는 원격 객체에 대한 참조 count를 떨어뜨리고, 더 이상 원격 객체에 대한 참조가 없으면 unexport를 하게 된다.

이 간격을 늘리려면 기본값인 60,000(60초)을 3,6000,000(1시간) 정도로 바꿔주면 된다.

-Dsun.rmi.dgc.client.gcInterval=36000000
-Dsun.rmi.dgc.server.gcInterval=36000000

분산 gc가 발생할 때마다 full gc가 일어나는 것 때문에 시스템 성능이 급격히 떨어지는 것을 막기 위해 다음 요청이 접수되었다.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5025281

Sun에서는 JDK 1.6부터는 다음 JVM 옵션을 사용할 수 있도록 개선하였다. 또 dgc 간격 기본값을 1분에서 1시간으로 늘렸다.

-XX:+ExplicitGCInvokesConcurrent

이 옵션이 설정된 경우는 System.gc()가 호출되더라도 gc 알고리즘이 concurrent gc 인 경우 full gc가 일어나는 것이 아니라 concurrent gc 를 실행한다.

따라서, RMI나 EJB를 사용하는 경우의 HotSpot VM 튜닝은 다음을 권장한다.

1. -XX:+DisableExplicitGC 은 설정하지 않는 게 좋다.
2. JDK 1.5 이하일 경우에는 dgc interval을 늘려준다. 보통 1시간 정도면 괜찮다.

 -Dsun.rmi.dgc.client.gcInterval=36000000
 -Dsun.rmi.dgc.server.gcInterval=36000000

3. JDK 1.6 이상일 경우에는 다음 옵션만 켜주면 큰 문제가 없다. dgc interval은 기본값이 이미 1시간으로 변경되어 있으므로 수정할 필요가 없다.

-XX:+ExplicitGCInvokesConcurrent

2013년 2월 19일 화요일

윈도우즈에서 tail 쓰기

윈도우에서 유닉스처럼 tail 을 쓰기 위해서는

1. 윈도우용 tail 파일을 받는다 (비주얼스튜디오가있다면 sourceforge.net 에서 직접 컴파일 해봐도 .......64bit용은 없는듯..) \
http://tailforwin32.sourceforge.net/

2. 윈도우가 제공하는 툴킷에 포함되어있다. (베타버전인듯. Windows Server 2003; Windows XP만 된다고 하는데.....dll 들이 많아서 설치해보진 않음..)
http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en&displaylang=en#Instructions

즐겁게 일하자~

열정, 소신, 의지, 희망.........
열정, 소신, 의지, 희망..........

소리에 놀라지 않는 사자와 같이 그물에 걸리지 않는 바람과 같이 무소의 뿔처럼 혼자서 가라

[펌] 박명수 어록

공부 안하면 더울 때 더운데서 일하고 추울때 추운데서 일한다

시작이 반이다가 아니라 시작은 시작일뿐이다

세상은 넓고 할일은 많지 않다

늦었다고 생각할때는 이미 늦었다, 그러니 지금 당장 시작하자

교복을 줄일 수록 성적도 내려간다

남자친구를 만들고 싶으면 집에만 있지 말고 얼굴에 뭐라도 찍어 바르고 밖에 남자들이 많이 있는 모임 등에 자주 나가라, 인연을 만들려면 노력을 해야 한다

티끌 모아 봤자 티끌이다

살을 빼고 싶으면 줄넘기를 해서 뛰든지 운동을 해라
운동이 싫으면 바지 치수 큰 거를 사입든지 해라

가는말이 고우면 얕본다

즐길수 없으면 피하라
고생끝에 골병난다

나까지 나설 필요 없다

참을 인이 세번이면 호구
포기하면 편하다

안되면 말고

잘생긴 놈은 얼굴값을 하고 못생긴 놈은 꼴값을 한다

'내 너 그럴줄 알았다'_알았으면 제발미리 말을 해줘라

대문으로 가난이 찾아오면 사랑은 창문으로 도망간다

부모 욕 하는건 참아도 내 욕 하는건 못참는다
일찍 일어나는 새가 피곤하다

일찍 일어나는 벌레가 잡아먹힌다

효도는 셀프

어려운 길은 길이 아니다

개천에서 용난놈 사귀면 개천으로 빨려들어간다

새벽에 먹는 맥주와 치킨은 0칼로리

성형으로 이뻐진게 아니라 하기 전이 이뻤던거다

내일도 할 수 있는 일을 굳이 오늘 할 필요는 없다

남자는 애 아니면 개

성공은 1퍼센트의 재능과 99퍼센트의 빽

예술은 비싸고 인생은 더럽다

하나를 보고 열을 알면 무당

원수는 회사에서 만난다

티끌모아 티끌

헌신하면 헌신짝된다

동정할거면 돈으로 줘라

2013년 2월 8일 금요일

Jboss jsp hot-deploy 방법

대부분 WAS 의 기본 Production mode 정책은 jsp 에 대해 hot-deploy 되지 않는 것이다.
그러나 개발 편의를 위해 대부분 해당 설정을 지원해줘야한다..

Jboss  에서는 다음과 같이 가능하다 (추가 방법은 확인중)

 1) web.xml 의 시간을 최신으로 변경 (유닉스 touch 명령어 등..)
    - jsp 파일을 반영 후 web.xml 의 파일 시간을 최신으로 바꿔주면 jsp 재컴파일이 일어난다.

 2) web.xml 에 다음과 같은 항목 추가
   <init-param>
  <param-name>development</param-name>
  <param-value> true </param-value>
  </init-param>
   ==> WAS 자체를 develpment 모드로 띄우는 것이라 우선 다른 방법을 써야할 듯 하다.

2013년 1월 28일 월요일

JAVA 문법 요약

 
1.자바의 역사
      (1) 1991년 : sun 사의 green project 에서 james gosling 외
                       기술자들 oak라는 언어로 제작(가전기기에 사용할 목적)
      (2) 1997년 : jdk 1.1 발표
      (3) 1998년 : jdk 1.2 발표
      (4) 2000년 : jdk 1.3 발표
      (5) 2002년 : jdk 1.4 발표
      (6) 2002년 : jdk 1.5(5.0)발표
      (7) 2007년 : jdk 6발표
  2. java의 특징
       (1) 플랫폼(os)에 독립적 : 자바 가상머신(JVM: java virtual Machine)
             이 해당 플랫폼마다 따로 제공되어서 ,동일한 실행결과을 보장한다.
       (2) 객체 지향언어 : 재사용성, 프로그램 생산성이 향상
       (3) 멀티 쓰레드를 지원 : 동시 다발적인 작업을 수행할 수 있다.
       (4) 자동 메모리 관리  : JVM에 의해서 자동관리된다.
  
3. java의 실행 절차
        사용자의 .java 파일-> compile-> class 파일 (Byte code)->
                 JVM 실행 -> 결과 출력

4. 용어 정리
      (1) 객체(Object) : 모든 것이며 class 를 통해 만들어지는 구현물
      (2) 클래스(Class): 객체(Object)를 만들어 내는 틀 (설계도,  Blueprint)
      (3) 속성 (Field) : 객체의 속성, 성질, 클래스에 정의가 되어 있다.
           cf.) property, attribute, member variable, 전역변수 ....
      (4) 메소드(Method) : 객체가 할 수 있는 기능 (행위)
      (5) 생성자 (Construtor) : 객체가 만들어질때(초기화) 호출이 되는
                                           일종의 메소드와 같은 것
               -- 클래스 이름과 동일한 단어( 대문자로 시작한다.)
               -- 메소드와 비슷한 형태 () ,{}
               -- 반환타입이 없다.
               -- 하위(자식, sub)클래스의 객체가 생성되기 위해서는 먼저
                  내부적으로 상위(부모,super)클래스의
                  생성자가 호출되어서 부모의 객체가 먼저 생성되어야 한다.
                  (부모 없는 자식은 없다)
              -- 생성자가 하나도 없는 경우 컴파일러가 기본생성자를
                  만들어 준다.
               (기본 생성자의 접근 제한자는 클래스의 접근제한자와 동일)
              
5. OOP(Object Oriented Programming) 의 특징
      (1) 상속성 (inheritance) - Human, Superman, Xman
      (2) 다형성 (polymarphism)
      (3) 은닉성 ( Information Hiding)
      (4) 캡슐화 (Encopsulation)

6. 기본 자바 파일의 구조
      (1) package 선언
      (2) import 구문 (import java.lang.*;)
      (3) class 선언 (public class | class)
           {
              (4) 속성(field) 선언하거나 초기화
              (5) 생성자(객체의 초기화를 담당)
              (6) 메소드 선언
             public static void main(String [] args)
             {
              실행시에 제일 먼저 JVM이 호출하는 메소드
              }
          }

7. 자바의 주석
        (1) // 한줄짜리 주석
        (2) /*
             여러줄 주석
             라인 2~~~~~~~~~
              */
        (3) /**
             javadoc (API문서를 만들때 쓰인다)
             */

8. 자바의 변수
        (1) 변수 type에 따라
            <1> 기본형 (primitive type) 변수 (8개) - 실행의 효율성 때문
                                                  -존재이유 : 실행의 효율성 때문이다.
                                                   - 형변환 방향 ( 오른쪽으로 )
          byte(1) -> short(2) -> int(4) -> long(8) -> float(4) -> double(8)
                            |
                        char(2)
          boolean
           <2> 참조형(Reference type, 객체명) 변수
                       - 초기값 : null,실제로는 참조하는 객체의 주소값을 가진다.
                       - 형변환 방향 (위로)
                     Object
                         |
                     Human
                         |
                   Superman
        (2) 유효 범위에 따라
                 <1> 멤버 변수 (Member Variable = Field)
                      -초기화를 하지 않아도 된다.
                       Ex) int (자동으로 0으로 초기화가 된다.) -> 선언만 했다.
                 <2>메소드 지역변수(locla variable)
                      -반드시 초기화를 해야 한다.
                       Ex) int i = 10;

9. 제한자 ( modifier)
       (1) 정의
             -클래스, 인터페이스, 변수, 메소드, 생성자 앞에 붙여서 기능을
               제한 하는 keyword
       (2) 종류
           <1> 접근제한자
             public(제한이 없음) > protected(상속관계) >
                            defoult(같은 패키지 안) > private( 같은 클래스안)
  <2> 소유제한자 (static)
   - static 붙으면 클래스의 소유
   - static 없으면 객체의 소유
  <3> 수정제한자 (final)
   -붙으면 수정할 수 없게 만드는 제한자
   1) field : 상수가 된다.
   2) method : 재정의 (Overriding) 안됨
   3) class : 상속 안됨
  <4> 추상제한자 (abstract)
  <5> 기타
   - synchronized, transient, volatile, native.....................

10. Overloading 과 Overriding
 (1) 오버로딩(Overloading)
  <1> 정의
   - 메소드의 이름은 같은데, 인자의 개수나 type, 순서가 다른형태의 메소드로써 이름만 같지 별개의
      메소드인 것을 말한다.
  <2> 조건
   -인자 (paramerter)의 개수나 type, 순서가 달라야 한다
  <3> 종류
   - 생성자 오버로딩
   - 메소드 오버로딩
 (2) 오버라이딩(Overriding)
  <1> 정의
   - 상속관계가 있는 클래스에서 부모 클래스의 메소드 내용을 자식 클래스에서 재정의 하는 것
  <2> 조건
   - 반환타입이 같아야 한다.
   - 인자(parameter)의 개수나 type, 순서가 모두 같아야 한다.
   - 부모 클래스이 오버라이딩될 메소드의 접근 제한자보다  자식클래스에서 재정의하는 메소드의
      접근 제한자의 범위가 같거나 더 커야 한다.

11. this, super
 (1) this - 자기 자신(class)의 객체
 (2) super - 부모클래스의 객체

12. 식별자 (identifier)
 (1) 정의
  개발자가 임의로 만드는 패키지, 클래스, 메소드, 변수 등의 이름을 의미
 (2) 규칙(어기면 컴파일 에러 발생)
  <1> 식별자의 첫문자는 특수문자, 숫자여서는 안된다. ( _ , $는 예외)
  <2> 문자와 숫자, 특수문자( _ , $)로 조합할 수 있다.
  <3> 예약어를 사용하면 안된다.
  <4> 길이의 제한이 없다.
 (3) 관례
  <1> 의미있는 단어를 사용한다.
  <2> 클래스와 인터페이스의 첫문자는 대문자
  <3> 단어의 결합으로 되어있을 경우 다음 단어의 첫번째 글자를 대문자로 하거나 _ 로 연결한다.
   Ex) TestClass , getName , get_name
  <4> $ 문자 사용하지 않는다.
13. 연산자
 (1) 산술연산자
  +,-,*,/,%
 (2) 증감연산자
  ++, --
 (3) 대입연산자
  =
 (4) 산술 할당(대입) 연산자
  +=,-=,*=,/=,%=.......
 (5) 비트 연산자
  &,|,^,~
 (6)쉬프트 연산자
  <<,>>,>>>(부호보장 X)
 (7) 논리 연산자
  &&, ||, &,|,!
 (8) 삼항(조건) 연산자
  조건식? 참일때 : 거짓일때
 (9) instanceof 연산자
  - 형식 :
   Reference Type 변수 instanceof Class 명
  - 앞의 변수가 뒤의 클래스로 형변환 가능 한지 알아보는 연산자

14.  조건문 (Condition)
 (1) if(boolean 형) {body} 문
  (body 내용에 명령이 하나면(한문장)이면 {} 생략 가능)
 (2) if(boolean 형) {} else {}문
 (3) if(boolean 형) {}else if{} else {} 문
 (4) switch(값) {case : ...... default:} 문

15. 반복문
 (1) for (초기식; 조건식; 증감식){}
 (2) while(boolean) {}
 (3) do {} while(boolean);

16. 제어의 이동
 (1) break : 감싸고 있는 {}(블럭)을 나간다.
 (2) continue : continue 문 이후의 명령을 실행하지 않고 건너 뛴다.
 (3) return : 메소드를 호출한 곳으로 제어권을 넘긴다.

17. interface (인터페이스)
 (1) 정의 : 명세서 이다. (골격이다.)
   모든 메소드가 추상메소드, 모든 Field가 상수로 구성된것, 클래스에 다중 상속이 가능하다.

 (2) 특징
  <1> 인터페이스끼리 다중 상속이 가능하다.
   Ex) Inter1 extends Inter2, Inter3
  <2> 클래스에서 인터페이스를 다중 상속하는것이 가능
   Ex) class House implements Roof, Door
  <3> 형태
   - Field 에는 public static final 이 생략 가능
   - Method 에는 public abstract   생략 가능
  <4> 인터페이스를 구현(상속)하는 클래스에서는 반드시 메소드를 재정의 (Overriding)해야 한다.

18. abstract class(추상클래스)
 (1) 정의
  추상 메소드를 가질 수 있는 클래스
 (2) 특징
  <1> 추상클래스는 객체를 생성할 수 없다.
   (완벽한 설계도가 아니다.)
  <2> 하위 클래스가 추상 클래스가 아니면 반드시 추상 메소드를 구현(재정의) 해야 한다.
 (3) 추상 메소드 : 메소드의 body({ })가 없는, 선언만 되어 있는 메소드


19. 배열(Array)
 (1) 정의: 같은 타입(type)의 객체 또는 기본형 자료를 저장하는 저장소로써, 생성될 때 그 크기가
   고정되는 저장소
 (2) 생성
  <1> Type[] 변수명=new Type[저장소크기];
   ex) int[] i=new int[30]
         int []i=new int[30]
         int i[]=new int[30]
  <2> Type[] 변수명={value,value,value....};
   ex) String[] str={"1","2","3"}
         int[][] i={{1,2},{3,4,5}}

20. 예외처리
 (1)  예외(Exception)의 정의
  프로그램이 정상적으로 진행되지 못하게 하는 돌발상황
 (2) 계층도
                  Object
                      |
               Throwable
              |             |
            Error        Exception
                           |           |
         RuntimeException   CheckException(런타임셉션외)
 (3) 예외처리의 목적
  프로그램 실행시에 발생할 수 있는 상황들을 정해놓고, 해당 상황 발생시 적절한 조치를 취해서 프로그램이
  정상적으로 작동하도록 하는 것이다.
 (4) 예외처리의 특징
  <1> Exception은 메소드,생성자에서 발생한다.
   ex) Human() throws Exception{}
  <2> 발생시킬 때에는(던질 때에는) throws라는 예약어를 사용한다.
   ex) throw new JWJException();
  <3> 던져진 Exception은 바로 try{} catch하거나 throws라는 예약어를 사용해서 메소드를 호출한 곳으로
   떠넘길 수 있다.(또 던진다.)
   ex)void badMethod() throws IOException,Exception
  <4> 잡는 방법
    try{
     예외가 던져지는 구문
    }catch(예외클래스명 변수명){
      예외처리 구문
    }
  <5> catch절에서 두 개 이상의 Exception을 잡을 경우 반드시 하위 Exception부터 잡아야 한다.
   ex) try{
         }catch(JWJException e){
         }catch(Exception e){}
  <6> finally 절
   try절과 함께 쓰이며, catch 절의 실행유무와 상관없이 무조건 실행된다.
   (return문이 나와도 실행된다.)
  <7> 자동으로 throws되고, 잡지 않아도 되는 예외
   RuntimeException, Error
    -throws 안해도 되고, 해도 된다.
    -try catch 안해도 되고, 해도 된다.

21. 중첩 클래스 (Nested class)
 (1) 정의 : 클래스 안에 있는 클래스
 (2) 종류
  <1> static nestde class(static 붙은 class)
   (static 변수나 static 메소드에만 접근이 가능하다)
   Ex) Outer.InnerStatic is = new Outer.InnerStatic();
  <2> inner class(static 붙지 않은 class)
   Ex) Outer.Inner inner = out.new Inner();
  <3> Anonymous inner class
   이름이 없는 클래스, 기존의 클래스(인터페이스)를 클래스 내부에서 상속 받아서 새롭게
   정의 하는 클래스
   Ex) Anon a = new Anon() {};

22. 주요 클래스
 (1) Object ( 가장 상위 root class)
  - 객체는 서로 다르다.
  - equal(). hashCode(), toString()
 (2) String (불변 클래스 immutable)
  <1> 한번 생성된 객체의 내용을 연산이나 메소드의 사용에 의해 변화시킬 수 없다.(+wrapper)
  <2> 문자열 비교시 반드시 equals 메소드를 써야 한다.
 (3) StringBuffer ( 가변 클래스 mutable)
  - 한번 생성된 객체의 내용이 연산이나 메소드를 통해서 변화할 수 있다 (ex . append, insert...)
 (4) Math
  - 상수와 static 메소드만으로 구성, 수학적인 계산을 돕는 유틸리티 클래스
 (5) Date, Calendar, GregorianCalendar
  - 날짜를 구하거나, 더하거나 ,빼거나 등의 일을 할때에 필요한 클래스
 (6) SimpleDateFormat
  - 날짜타입을 원하는 대로 ("yyyy년 MM월 dd일")로 바꿀 수 있게 도와주는 클래스
 (7) DecimalFormat
  - 숫자를 원하는 형태로 바꿀 수 있게 도와주는 클래스

23. Collections Framework
 (1) hierachy (계층 구조도)
                       Collection    Map
                        |     |     |      |
                      set  List  Queue      SortedMap
                       |
                 SortedSet
 
 (2) interface
  <1> Collection : 컬렉션 계층구조의 root( 나열된 데이터들의 집합)
  <2> Set : 중복된 요소( element) 를 허용하지 않는다.  ex) 트럼프 카드
  <3> List : 순서가 있는 컬렉션 ( sequence라고도 한다.) 중복허용, 인데스로 각 요소에 접근 가능
  <4> Queue : 우선순위를 가지는 여러개의 요소를 가지고 있는 컬렉션  FIFO(First In First Out) ex) 스케쥴러
  <5> Map : key와  value 로 이루어진 것, 중복된 key 불가능

  // 순서가 있는(정렬이 되는 ) 계열
  <6> SortedSet : ascending(오름차순)의 순서로 요소를 가진다.
  <7> SortedMap : key값을 오름차순으로 가진다.
   ex) 사전 , 전화번호부
 
  // ETC
  <8> Enumeration : 각각의 요소를 나열된 형태로 가지고 있다.
  <9> Iterator : Enumeration와 같은기능, 또한remove(삭제)가 가능하다.

 (3) implementations (구현체들 class)
  <1> Set
   1)HashSet : TreeSet 보다 빠르다.
   2)TreeSet : SortedSet 에서 구현, 정렬
  <2> List
   1) ArrayList : LinkedList 보다 빠르다
   2) LinkedList :  List 의 부분적으로 요소를 추가하거나 바로 추가한 놈을 추적하거나
      삭제하거나 하는 일이  많을때 빠르다
      ( Queue 상속,  순환구조 - 그 사이에 삽입, 삭제시 빠르다.)
  <3> Map
   1) HashMap : 빠르다.  null key 값과  null value 값을 허용
   2) TreeMap : SortedMap 에서 구현, 정렬가능 (key)
   3) LinkedHashMap : 집어 넣는 순서로 정렬, 거의 HashMap 만큼 빠르다.

  <4> synchronized (동기화) 계열 (Multi Thread에 안전)
   - 삽입 삭제 등의 갱신이 발생하는 동안 다른 작업이 참조 할 수 없음
   1) Vector (List계열)  ArrayList와 유사
   2) Hashtable (Map 계열)  :HashMap과 유사하나, null key, null value 허용 안함.
 
 (4) Collections : 각종 Collection관련 유틸 클래스(뒤섞기, 정렬)

24. Thread
 (1) Process : 컴퓨터 내에서 실행중인 프로그램
 (2) Thread 란?
  - 한 프로그램내에서 동시에 두가지 일을 수행하는 것으로  프로세스보다 작은 업무 단위이며,
  프로세스의 resource(자원)를 공유하기 때문에 가볍다는 장점이 있다.
 (3) 생성(대상 target 을 만드는 법)
  <1> java.lang.Thread 를 상속받는 방법 (extends를 쓰기 때문에 다른 테이블을 상속 받을 수 없음)
  <2> java.lang.Runnable 을 구현하는 방법( 권장됨)
   - 실행 : start()호출하면 JVM이 자동으로 run() 메소드 실행 한다. (Thread의 LifeCycle.ppt참조)
 (4) 소멸
  run() 메소드의 실행이 끝나면 종료(terminated)된다.
 (5) Multi Thread 멀티 쓰레드
  2개이상의 Thread가 동시에 실행되는 것
 (6) 동기화 ( synchronized)
  synchronized 로 되어 있는 곳들은 실행중인 Thread가 대상 객체의 lock(monitor)을 소유하고 실행이 끝난 뒤
  unlock(monitor를 반환)해 주는 것.
  *한번에 하나의 Thread만 실행이 가능하다.
 (7) 우선순위 (priority)
  MIN_PRIORITY(1), NORM_PRIORITY(5), MAX_PRIORITY(10)


<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<J2SE 5.0 추가 기능 들>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1. Generics
  - 컴파일시 잘못된 데이터가 들어 가는 것을 방지
 (1) 특징
  <1> 타입 안정성을 갖춘 컬렉션을 만들 수 있다.
  <2> 컴파일 시점에 타입에 대한 검증을 한다.
 
 (2) 선언방법
  <1> E : 컬렉션에 저장하고 컬렉션에서 리턴할 타입의 원소의 타입. E는 Element(원소)
   K : key , V : value , O : Object , T : Type
  <2> class 나 interface 선언
   ex) public class ArrayList<E> extends AbstractList<E> {
     public boolean add(E o)
     }
  <3> 인스턴스 생성시
    ex) ArrayList<E> list = new ArrayList<E>();
  <4> 메소드 선언(호출)시
   1) 선언 : void list(ArrayList<E> list)
   2) 호출 : x.list(list);
 
 (3) Generics의 유형매개변수 (Type Parameter)
  <1> 사용방법
   1) 일반적인 선언
    public void setHuman(ArrayList<Human> list)
    public<T extends Human> void setHuman(ArrayList<T> list)
   2) wildcard를 사용
    public void setHuman(ArrayList<?> list)  //? all(모든것)
    public void setHuman(ArrayList<? extends Human> list) //super도 들어감(extends자리에, 자신이나 자신의 위)
  <2> 특징
    1) interface도 extends로 표현한다.
    2) 일반적으로 wildcard를 쓰지 않는 법을 선호한다.(인자값이 늘어날수록 쓰기 힘들어진다)
    public <T extends Human> void setHuman(ArrayList<T> list, ArrayList<T> list2)
    public void setHuman(ArrayList<? extends Human> list, ArrayList<? extends Human> list2)

2. 확장 for문 (Enhanced for loop)
 
 (1) 형식
  for(테이터형 접근 변수명 : 배열이나 컬렉션 변수명)
 
 (2) 특징
  Generics와 같이 쓰여서 효율적인 Collection 계열의 루핑이 가능하다.
  ex) ArrayList<Integer> list = new ArrayList<Integer>();
    for(Integer i : list)

3. Autoboxing / Unboxing
 
 (1) 정의
  <1> Autoboxing : primitive type 변수를 Wrapper class로 자동 변환해주는 것이다.
  <2> Unboxing : Autoboxing의 반대의 경우에 해당한다.
 
 (2) 특징
  오토박싱은 -128 ~ 127의 범위에 있는 정수값의 경우에만 같은 오브젝트의 리턴을 보장한다.
  (list에 add시 범위를 넘는건, 같은 오브젝트 타입의 return이 보장되지 않아서 다른 객체가 리턴된다.)

4. Typesafe enums (타입에 안전한 enum)
 
 (1) 기존의 열거형 타입은 상수 값만 같으면, 사실상 열거형 타입의 구분이 없어진다.
  ex)
  interface Num {
   public static final int ZERO = 0;
  }

  interface Language {
   public static final int JAVA = 0;
  }
 (2) if나 switch를 사용해서 분기작업을 할 수 있다.
 (3) ==나 equals() 모두 쓸 수 있다.
 (4) 열거 타입 그 자체가 타입이다.

5. Varargs (가변인수)
 
 (1) 여러개의 인수(parameter)를 배열이 아닌 "..." 로 처리할 수 있다.
  ex) void getString(String... names)
 
 (2) 메소드(생성자) 오버로딩시는 사용하지 않는 것이 좋다.
  ex) Human(Integer... i)
     Human (int i, int j)
     new Human(3, 4) = new Human(new Integer(3), new Integer(4))

6. static import
 
 (1) static class, static variable, enum등의 값을 사용할때 타이핑을 더 적게 해보자는 의도
  ex) import static java.lang.Math.*;
   import static java.lang.System.out;
 (2) 가독성이 떨어질 수 있기 때문에 static member를 아주 많이 쓰는 경우에만 활용한다.

7. Annotation(metadata)
 
 (1) "at" @ 표시와 어노테이션 이름으로 표현한다.
 
 (2) BuiltIn(내장) annotation
  <1> Override Annotation
    override가 수행되지 않으면 컴파일러에서 문제를 표시해준다.
  <2> Deprecated Annotation
  <3> SuppressWarning Annotation
    컴파일러가 warning(예를 들어 generics를 쓰지 않아서 나는)을 나지 않게 해준다.

8. StringBuilder
 
 (1) StringBuffer의 unsynchronized version이다.
 (2) 멀티 쓰레드 환경에 안전하지 않지만 StringBuffer에 비해서 속도면에서 월등하다.
 (3) StringBuffer와 동일한 메소드를 제공하기 때문에 기존의 StringBuffer를 이름만 바꿔서 쓸수가 있다.

9. Formatting
 
 (1) java.util.Formatter 클래스로써 제공한다.
 (2) String 클래스의 format()이나 System.out.printf()