레이블이 JAVA인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JAVA인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 16일 금요일

오라클 Optimizer Mode Setting 방법

오라클 Optimizer Mode Setting 방법

대한민국오라클학원/오라클학원/오라클교육/오라클강의/구로 오라클/가산오라클/오라클강


--------------------------
1.        Instance 수준의 셋팅 방법
--------------------------


오라클자바커뮤니티에서 설립한  개발자중심! 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr 


-        DB의 설정 파일(initSID.ora or spfileSID.ora)에 전체적으로 적용이 되도록 정의하는 방법이며 다음과 같이 기술하며 OPTIMIZER MODE는 REUL, CHOOSE, ALL_ROOWS, FIRST_ROWS와 같은 종류가 있습니다. CHOOSE인 경우 한테이블이라도 Analyzed되어 있는 경우엔 비용기반 접근 방식을 이용하는 것이며 RULE인 경우 규칙기반 접근 방식을 사용, ALL_ROWS인 경우 비용기반 옵티마이저의 한 방법이며 모든 ROW들을 처리한다고 할 때 그 비용을 최소화 하는 방법으로 실행계획을 수립하며,  FIRST_ROWS인 경우엔 최초 ROW를 추출하는데 드는 비용을 최소화 하도록 실행 계획을 구성하는 것입니다.

-        예) OPTIMIZER_MODE=FIRST_ROWS

-        만약 initSID or spfileSID.ora에 아무 내용도 정의하지 않은 경우 기본적으로 CHOOSE 방식이 됩니다.

-------------------------
2.        Session 수준의 셋팅 방법
-------------------------

-        alter session이라는 명령을 이용하면 현재 접속된 세션 레벨에서 옵티마이저 모드를 정의할 수 있습니다.

-        예) alter session set optimizer_goal=rule 앞과 같이 정의하면 해당 세션이 끝나기 전까지는 규칙 기반(,RULE-BASED) 옵티마이저 모드를 이용하게 됩니다.

--------------------------
3.        Statement 수준의 셋팅 방법
--------------------------

-        힌트(Hint) 구문을 이용한다면 매 SQL 문장마다 서로 다른 옵티마이저 모드를 적용할 수 있습니다.

-        예) SELECT /*+ FIRST_ROWS */
                          ENAME,
                          SAL,
                          JOB
              FROM EMP
              WHERE SAL > (SELECT MAX(SAL)
                                    FROM  EMP
                                    WHERE DEPTNO = 10)

2013년 8월 13일 화요일

오라클실행계획 해석

실행계획 해석하는 방법입니다. ORACLE TUNING을 위한 가장 기본적인 입니다.

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  

실행계획은 해당 SQL을 수행하기 위한 절차이며 옵티마이저에 의해 만들어 집니다. 해석을 위해서는 Row Source Operartors Tree 또는 Row Source Level을 이용하여 해석하는데 아래 예를 들어보도록 하죠.

1. Row Source Operators Tree는 Serial Execution에 대한 Tree를 보여주는 것인데 실행계획은 Row Source로 구성되며 각각의 Row Source들을 Tree 형태로 구성하여 해석을 하는 것을 말합니다.

SQL> select ename, dname
2 from emp e, dept d
3 where e.deptno = d.deptno;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=252)
1 0 HASH JOIN (Cost=5 Card=14 Bytes=252)
2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=44)
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=98)

Row Source Parent Key(0,1,2,3)
Row Source Key(0,1,1)
각각의 행을 Row Source 또는 Access Operation 이라 한다.

위 실행계획을 도식화 하기 위해서는 Row Source Key와 Row Source Parent Key를 알고 있으면 되는데 Row Source Key 1번은 Parent가 0번이며, 2번/3번은 1번이다. 이를 도식화하여 해것을 하는 것이다. (해석은 밑에서 위로, 좌에서 우측으로 진행을 하면 된다)

2.Row Source Level을 통한 해석

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=252)
1 0 HASH JOIN (Cost=5 Card=14 Bytes=252)
2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=44)
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=98)

Level 1
Level 2
Level 3

가장 안쪽의 Level 3부터 해석을 하며 같은 레벨의 경우 위쪽부터 해석을 하면 된다.

DEPT 테이블을 FULL Scan한 후 DEP 테이블을 FULL Scan하여 HASH Join 후 원하는 데이터를 추출하는 실행 계획이다.

다음의 예를 보도록 하자.

SQL> select ename, dname
2 from emp e, dept d
3* where trim(e.deptno) = trim(d.deptno);

ENAME DNAME
---------- --------------
CLARK ACCOUNTING
KING ACCOUNTING
MILLER ACCOUNTING
SMITH RESEARCH
……

14 개의 행이 선택되었습니다.



Execution Plan
---------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: RULE
1 0 MERGE JOIN
2 1 SORT (JOIN)
3 2 TABLE ACCESS (FULL) OF 'DEPT'
4 1 SORT (JOIN)
5 4 TABLE ACCESS (FULL) OF 'EMP'

위 실행계획에 대한 해석은

Level 4 : DEPT 테이블을 FULL SCAN + EMP 테이블을 FULL SCAN
Level 3 : SORT(JOIN) + SORT(JOIN)  DEPT 테이블을 SORT한것과 EMP 테이블을 SORT한 두개의 집합이 된다.
Level 2 : MERGE JOIN  Level 3에서 만들어진 두개의 집합을 Merge
Level 1 : SELECT STATEMENT  Merge Join을 수행하여 선택된 결과를 추출

[오라클자바community강좌]JAva Sort 알고리즘(자바 셸정렬)

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터

(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  
www.onjprogramming.co.kr


셸정렬(Shell Sort) 이란 버블정렬의 경우 데이터가 제 위치에서 멀리 떨어져 있으면 여러 번 교환이 필요하게 된다.이것이 버블정렬의 취약점으로서 인접한 데이터만 비교하기 때문에 발생하게 된다.
 이러한 문제를 해결하기 위해 멀리 있는 레코드들 끼리도 비교가 가능하게 효율을 높인 정렬 방법이 고안자인 셸(Donald L.Shell)의 이름을 딴 셸 정렬 이다.
 원리는 주어진 입력 리스트를 적당한 매개변수의 값만큼 서로 떨어진 레코드들과 비교하여 교환하는 과정을 매개변수 값을 바꾸어 가면서 되풀이 하는 것이다.(매개변수의 값은 줄어들면서 1이되면 종료한다.)이때 떨어져 있는 레코드들은 하나의 부분리스트를 구성하여 보통 다른방법(삽입정렬)에 의해 개별적으로 정렬된다


 O(log n) 수행시간이 O(n2)보다 우수함은 자명하다. 그러나 일반적으로 O(n2)은 알고리즘이 간단하고 프로그래밍이 용이 한 반면 O(log n) 의 알고리즘은 복잡하다. 따라서 n이 작은 경우 O(n2)의 알고리즘이 오히려 효과적이다. 셸 정렬은 이러한 수행시간의 효율성을 잘 반영한 정렬기법으로서 레코드 집단을 작은 부분으로 나눈 후 작은 부분집단을 O(n2) 인 삽입 정렬 등으로 빠르게 정렬한다.
 셸정렬의 속도는 Bubble Sort, Selection Sort, Insertion Sort등에 비해 상당히 빠르다. 난수상태의 10000개를 정렬하는 경우 Bubble Sort에 비해 200배, Selection Sort에 비해 110배, Insertion Sort에 비해 80배 ?(N2)의 효율을 나타내는 알고리즘(Quick Sort, Heap Sort, Merge Sort)에 비해 다소 떨어지나 “코드의 간결함, 추가적인 메모리(스택)를 사용하지 않음” 등을 가만하면 별은 무의미 하다.



import java.util.Random;
class ShellSort {
//셸 정렬
int[] sort(int a[]) {
int inc=1;
//증분 inc에 대해 가능한 큰 br> for(int i=inc; i<a.length; i++) {
int temp = a[i];
int j = i;
//j가 증분치보다 크거나 같고 우측이 작으면 바꿈(삽입정렬)
while(j&nb경우란면 아래의 수식에 의해 계속 1이 리턴
inc = inc/3 + 1;
}
return a;
    }

public static void main(String[] args){
int&emp = new int[10000];
long startTime, elapsedTime, counter;

ShellSort mySort = new ShellSort(); 
//----------------- 난수 발생시킴
Random r = new Random();
for(int i=0; i<10000; i++) {
nansu[i] = r.nextInt(10000);
}
//-----------------------------------

//------------------------------------------------------------------------------
//우선 난수를 정렬하고, 정렬된 상태(최선의상황)을 다시 정렬시킴
//------------------------------------------------------------------------------
counter=0;
sortedArray = mySort.sort(nansu);
startTime = System.currentTimeMillis();
do {
 counter++;
 temp = mySort.sort(sortedArray);
  } while (System.currentTimeMillis() - startTime < 1000);
elapsedTime = (System.currentTimeMillis()- startTime) / counter;
System.out.println("[최선의 상황 수행시간] " + elapsedTime + "ms");
//-------------------------------------------------------------------------------

//-------------------------------------------------------------------------------
//반쯤 정열후 ...
//-------------------------------------------------------------------------------
counter=0;
halfSortedArray = sortedArray;
for(int i=0; i<5000; i++) {
halfSortedArray[i] = r.nextInt()*10000;
}
startTime = System.currentTimeMilli.currentTimeMillis()- startTime) / counter;
System.out.println("[반쯤 정렬 수행시간] " + elapsedTime + "ms");
//------------------------------------------------------------------------------- <.length;i++) {
reverseArray[sortedArray.length-i-1] = sortedArray[i];
}
startTime = System.currentTimeMillis();
do {
 counter++;
 temp = mySort.sort(reverseArray)置嬋챨?] " + elapsedTime + "ms");
//-------------------------------------------------------------------------------- 
}
}? 

JAVA Sort 알고리즘(자바 셸정렬)

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  
www.onjprogramming.co.kr


셸정렬(Shell Sort) 이란 버블정렬의 경우 데이터가 제 위치에서 멀리 떨어져 있으면 여러 번 교환이 필요하게 된다.이것이 버블정렬의 취약점으로서 인접한 데이터만 비교하기 때문에 발생하게 된다.
 이러한 문제를 해결하기 위해 멀리 있는 레코드들 끼리도 비교가 가능하게 효율을 높인 정렬 방법이 고안자인 셸(Donald L.Shell)의 이름을 딴 셸 정렬 이다.
 원리는 주어진 입력 리스트를 적당한 매개변수의 값만큼 서로 떨어진 레코드들과 비교하여 교환하는 과정을 매개변수 값을 바꾸어 가면서 되풀이 하는 것이다.(매개변수의 값은 줄어들면서 1이되면 종료한다.)이때 떨어져 있는 레코드들은 하나의 부분리스트를 구성하여 보통 다른방법(삽입정렬)에 의해 개별적으로 정렬된다


 O(log n) 수행시간이 O(n2)보다 우수함은 자명하다. 그러나 일반적으로 O(n2)은 알고리즘이 간단하고 프로그래밍이 용이 한 반면 O(log n) 의 알고리즘은 복잡하다. 따라서 n이 작은 경우 O(n2)의 알고리즘이 오히려 효과적이다. 셸 정렬은 이러한 수행시간의 효율성을 잘 반영한 정렬기법으로서 레코드 집단을 작은 부분으로 나눈 후 작은 부분집단을 O(n2) 인 삽입 정렬 등으로 빠르게 정렬한다.
 셸정렬의 속도는 Bubble Sort, Selection Sort, Insertion Sort등에 비해 상당히 빠르다. 난수상태의 10000개를 정렬하는 경우 Bubble Sort에 비해 200배, Selection Sort에 비해 110배, Insertion Sort에 비해 80배 ?(N2)의 효율을 나타내는 알고리즘(Quick Sort, Heap Sort, Merge Sort)에 비해 다소 떨어지나 “코드의 간결함, 추가적인 메모리(스택)를 사용하지 않음” 등을 가만하면 별은 무의미 하다.



import java.util.Random;
class ShellSort {
//셸 정렬
int[] sort(int a[]) {
int inc=1;
//증분 inc에 대해 가능한 큰 br> for(int i=inc; i<a.length; i++) {
int temp = a[i];
int j = i;
//j가 증분치보다 크거나 같고 우측이 작으면 바꿈(삽입정렬)
while(j&nb경우란면 아래의 수식에 의해 계속 1이 리턴
inc = inc/3 + 1;
}
return a;
    }

public static void main(String[] args){
int&emp = new int[10000];
long startTime, elapsedTime, counter;

ShellSort mySort = new ShellSort(); 
//----------------- 난수 발생시킴
Random r = new Random();
for(int i=0; i<10000; i++) {
nansu[i] = r.nextInt(10000);
}
//-----------------------------------

//------------------------------------------------------------------------------
//우선 난수를 정렬하고, 정렬된 상태(최선의상황)을 다시 정렬시킴
//------------------------------------------------------------------------------
counter=0;
sortedArray = mySort.sort(nansu);
startTime = System.currentTimeMillis();
do {
 counter++;
 temp = mySort.sort(sortedArray);
  } while (System.currentTimeMillis() - startTime < 1000);
elapsedTime = (System.currentTimeMillis()- startTime) / counter;
System.out.println("[최선의 상황 수행시간] " + elapsedTime + "ms");
//-------------------------------------------------------------------------------

//-------------------------------------------------------------------------------
//반쯤 정열후 ...
//-------------------------------------------------------------------------------
counter=0;
halfSortedArray = sortedArray;
for(int i=0; i<5000; i++) {
halfSortedArray[i] = r.nextInt()*10000;
}
startTime = System.currentTimeMilli.currentTimeMillis()- startTime) / counter;
System.out.println("[반쯤 정렬 수행시간] " + elapsedTime + "ms");
//------------------------------------------------------------------------------- <.length;i++) {
reverseArray[sortedArray.length-i-1] = sortedArray[i];
}
startTime = System.currentTimeMillis();
do {
 counter++;
 temp = mySort.sort(reverseArray)置嬋챨?] " + elapsedTime + "ms");
//--------------------------------------------------------------------------------
}
}? 

[오라클자바강좌]JAVA Sort 알고리즘(퀵정렬-재귀호출이용) 예제 입니다. JAVA강좌

java,java교육,java강좌,oraclejava,javaoracle,오라클자바,자바,자바교육,자바강좌,구로디지털자바,구로디지털오라클,오라클자바교육


퀵 정렬(Quick Sort) 이란 주어진 입력리스트를 특정한 키(Control Key, Pivot)로 분리하여 왼쪽에는 키 값보다 작은 값, 우측에는 키 값보다 큰 값을 갖는 서브 리스트로 분리한다. 그런 다음 각각의 서브리스트에서도 같은 방법을 반복적으로 수행하여 정렬하는 방법이다. 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  

다음의 예제를 보자... 

import java.util.Random; 
class QuickSort3{ 
//퀵 정렬(재귀방법) 
int[] qsort(int a[]) { 
//low와 high 값을 parameter로 던지자. 
quicksort(0, a.length-1, a); 
return a; 


void quicksort(int low, int high, int[] a) { 
if (low < high){ 
//서브리스트로 분할 
int pivot = split(low, high, a); 
//생성된 pivot값을 기준으로 재귀호출 
quicksort(low, pivot-1, a); 
quicksort(pivot+1, high, a); 



//pivot 값이 제위치에 정렬되도록 위치를 계산하고  
//입력된 레코드를 재배열 
private int split(int low, int high, int[] a) { 
int avg = (low + high)/2;  //pivot위치를 찾는다. 
exchange(low, avg, a); 
int last = low; 
for(int i=low+1; i<=high; i++) { 
//i값이 pivot값(low위치 값) 보다 
//작으면 바꾼다. 
//last를 1증가후 i위치값과 low위치값을 바꿈 
if (a[i] < a[low]){  
last++; 
exchange(last, i, a); 


exchange(low, last, a); 
return last; 


private void exchange(int low, int high, int[] a) { 
int temp = a[low]; 
a[low] = a[high]; 
a[high] = temp; 



public static void main(String[] args){ 
int nansu[] = new int[10000]; 
int[] sortedArray = new int[10000]; 
int[] halfSortedArray = new int[10000]; 
int[] reverseArray = new int[10000]; 
int[] temp = new int[10000]; 
long startTime, elapsedTime, counter; 

QuickSort3 mySort = new QuickSort3();  
//----------------- 난수 발생시킴 
Random r = new Random(); 
for(int i=0; i<10000; i++) { 
nansu[i] = r.nextInt(100000); 

//----------------------------------- 

//------------------------------------------------------------------------------ 
//난수를 정렬 
//------------------------------------------------------------------------------ 
counter=0; 
startTime = System.currentTimeMillis(); 
do { 
 counter++; 
 sortedArray = mySort.qsort(nansu); 
} while (System.currentTimeMillis() - startTime < 1000); 
elapsedTime = (System.currentTimeMillis()- startTime) / counter; 
System.out.println("[난수일때의 수행시간] " + elapsedTime + "ms"); 

//------------------------------------------------------------------------------ 
// 정렬된 상태(최선의상황)을 다시 정렬시킴 
//------------------------------------------------------------------------------ 
counter=0; 
startTime = System.currentTimeMillis(); 
do { 
 counter++; 
 temp = mySort.qsort(sortedArray); 
  } while (System.currentTimeMillis() - startTime < 1000); 
elapsedTime = (System.currentTimeMillis()- startTime) / counter; 
System.out.println("[최선의 상황 수행시간] " + elapsedTime + "ms"); 
//------------------------------------------------------------------------------- 

//------------------------------------------------------------------------------- 
//반쯤 정열후 ... 
//------------------------------------------------------------------------------- 
counter=0; 
halfSortedArray = sortedArray; 
for(int i=0; i<5000; i++) { 
halfSortedArray[i] = r.nextInt()*10000; 

startTime = System.currentTimeMillis(); 
do { 
 counter++; 
 temp = mySort.qsort(halfSortedArray); 
  } while (System.currentTimeMillis() - startTime < 1000); 
elapsedTime = (System.currentTimeMillis()- startTime) / counter; 
System.out.println("[반쯤 정렬 수행시간] " + elapsedTime + "ms"); 
//------------------------------------------------------------------------------- 

//------------------------------------------------------------------------------- 
//역순상태 
//------------------------------------------------------------------------------- 
counter=0; 
for(int i=0;i<sortedArray.length;i++) { 
reverseArray[sortedArray.length-i-1] = sortedArray[i]; 

startTime = System.currentTimeMillis(); 
do { 
 counter++; 
 temp = mySort.qsort(reverseArray); 
  } while (System.currentTimeMillis() - startTime < 1000); 
elapsedTime = (System.currentTimeMillis()- startTime) / counter; 
System.out.println("[역순 상태 수행시간] " + elapsedTime + "ms"); 
//--------------------------------------------------------------------------------  




[ORACLEJAVA커뮤니티]자바 팩토리얼 예제 참고 하세요~

[ORACLEJAVA커뮤니티]자바 팩토리얼 예제 참고 하세요~

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터

(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  


/* 인수로 숫자를 입력받아 그 수까지의 팩토리얼을 계산하는 프로그램 */ 
public class FactorialFor { 
public static void main(String[] args) { 
long fact=1; 
if (args.length<1) { 
System.out.println("Usage : java Factirial Number"); 
System.exit(1); 

for(int i=Integer.parseInt(args[0]);i>=1;i--) { 
for(int j=1;j<=i;j++) { 
fact *= j; 

System.out.println(i+"! = " + fact); 
fact = 1; 







/* 인수로 숫자를 입력받아 그 수까지의 팩토리얼을 계산하는 프로그램 */ 
public class FactorialWhile { 
public static void main(String[] args) { 
long fact=1; 
if (args.length<1) { 
System.out.println("Usage : java Factirial Number"); 
System.exit(1); 

int i = Integer.parseInt(args[0]); int j=1; 
while(i>=1) { 
while(j<=i) { 
fact *= j; j++; 

System.out.println(i+"! = " + fact); 
fact = 1; i--; j=1; 













public class FactorialDoWhile { 
public static void main(String[] args) { 
long fact=1; 
if (args.length<1) { 
System.out.println("Usage : java Factirial Number"); 
System.exit(1); 

int i = Integer.parseInt(args[0]); int j=1; 
do { 
do { 
fact *= j; j++; 
} while(j<=i); 
System.out.println(i+"! = " + fact); 
fact = 1; i--; j=1; 
} while(i>=1); 

}  

2013년 8월 8일 목요일

스트럿츠 예제 Constants.java [오라클자바닷넷커뮤니티강좌교육]

package oraclejavanew;

public class Constants {
        /**
        * 로그인한 사용자의 LoginForm이 저장될 세션 범위의 Attriute 이름
        */
        public static final String USER_KEY = "user";
       
        /**
        * 로그인한 사용자의 선택 상품을 보관할  세션 범위의 CART
        */
        public static final String CART_KEY = "cart";
       
        /**
        * 로그인한 사용자의 선택 상품을 보관할  세션 범위의 CART(MAP에서 빠져니온 ArrayList)
        * ArrayList안에는 CartItem이 있다.
        */
        public static final String CART_LIST = "cartlist";
       
        /**
        * 로그인한 사용자의 배송지를 보관할  세션 범위의 BAESONGJI
        */
        public static final String BAESONGJI_KEY = "baesongji";
       
        /**
        * 카드 결재시 승인 후 결과 페이지
        */
        public static final String CARD_RESULT_PAGE = "resultpage";
       
        /**
        * 주문번호 생성시 오류 발생한 경우 이동할 페이지
        */
        public static final String ORDER_NO_ERROR = "ordernoerror";
       
       
        /**
        * 무통장 주문완료 후  결과 페이지, 이곳에서 PayAction을 부름...
        */
        public static final String MU_RESULT_PAGE = "muresultpage";
       
       
        /**
        * 로그인한 사용자의 배송지를 보관할  세션 범위의 BAESONGJI
        * ArrayList안에 BaesongjiItem이 들어가 있다.
        *
        */
        public static final String BAESONGJI_LIST = "baesongjilist";
       
       
                     
        /**
        * ActionForward에서 사용되는 값       
        */
        public static final String LOGINOK      = "loginok";
        public static final String LOGIN        = "login";
        public static final String CARTOK      = "cartok";
        public static final String ORDERPAGE    = "orderpage";
        public static final String ORDERMOD    = "ordermod";
        public static final String ORDERCONFIRM = "orderconfirm";
        public static final String LOGOFFOK    = "logoffok";
        public static final String MAIN        = "main";       
        public static final String SHOPINGEND  = "shopingend"; 
        public static final String BADACTION    = "badaction";
       
        public static final String CART      = "/oraclejava/goods/cart.jsp";
        public static final String ORDER      = "/oraclejava/goods/order.jsp";
                       
}

2013년 8월 2일 금요일

JAVA AWT TabedPane 예제 - Tab

//일반 응용 프로그램에서의 Tab control을 자바에서 만들어 보는 겁니다.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class TabbedPane {
        public static void main(String[] args) {
                JTabbedPane tp = new JTabbedPane();
                String tabs[] = {"첫번째탭","두번째탭","세번째탭"};
               
                for(int i=0;i<tabs.length; i++) {
                        JLabel label = new JLabel(i+"번째 컴포넌트",JLabel.CENTER);
                        label.setBackground(SystemColor.control);
                        label.setOpaque(true);
                        tp.addTab(tabs[i], null, null, tabs[i]+"에 대한 툴팁");                       
                }

                tp.setSelectedIndex(0);

                JFrame f = new JFrame();
                f.getContentPane().add(tp, "Center");
                f.setSize(400, 500);
                f.setVisible(true);
        }
}

간단한 JAVA Swing Button 예제

import java.awt.*;
import javax.swing.*;

public class SwingButtonTest {
        public void Test() {
        JFrame f = new JFrame("Swing 테스트"); //frame을 생성하고,
        JPanel p = new JPanel();              // panel을 생성합니다.
        JButton b = new JButton("예");        //그리고 button을...
        p.add(b);                                      // button을 panel에 추가합니다
        b.setToolTipText("이건 튤팁입니다.");
        f.getContentPane().add(p);
        f.pack();
        f.setVisible(true);
        }
public static void main(String args[]) {
        new SwingButtonTest().Test();
}
}

JAVA BufferedReader/BufferedWriter – 예제

import java.io.*;
public class BufferedWriterSample {
public static void main(String[] args) throws Exception {
File imsiFile = File.createTempFile("imsi",".tmp");
imsiFile.deleteOnExit();
FileWriter fw = new FileWriter(imsiFile);
BufferedWriter bw = new BufferedWriter(fw);
for(int i=0; i<args.length; i++) {
bw.write(args[i]);
bw.newLine();    }
bw.close();
System.out.println(imsiFile+" 에 썼습니다...");
FileReader fr = new FileReader(imsiFile);
BufferedReader br = new BufferedReader(fr);
System.out.println(imsiFile+"에서 읽습니다...");
for(String readLine;(readLine=br.readLine())!=null;) {
System.out.println(readLine);
}
br.close();
}
}

2013년 8월 1일 목요일

java.util.TreeMap 클래스 – 예제

java.util.TreeMap 클래스 – 예제


import java.util.*; 

public class MapTest { 
  public static void main(String args[]) { 
    TreeMap tm = new TreeMap(); 
    tm.put("홍길동", new Integer(8949)); 
    tm.put("김삿갓", new Integer(2848)); 
    tm.put("이몽룡", new Integer(9088)); 
    System.out.println("맵 크기 :" + tm.size()); 
    String str = "홍길동"; 
    if (tm.containsKey(str)) { 
      System.out.println(str + " 호출번호 : " + tm.get(str)); 
    } 
  } 


자바인터페이스(java interface)

자바와 다중상속
      - 다중 상속이라는 것은 말 그대로 하나의 클래스가 여러개의 수평적 상위클래스를 갖는 것이다. 
      - 다중 상속은 사용이 어렵고 오류를 범하기 쉬울 뿐 아니라 만약 사용한다고 하더라도 문법이 복잡해져 객체지향 기술 중에서도 많이 사용되지 않는 기능이다. 물론 다중 상속을 이용하면 하나의 클래스가 여러가지 일을 할 수 있는 기능을 제공할 수 있고 덕분에 유연한 프로그래밍이 가능해진다는 장점이 있다. 
      - C++과 같은 언어는 이러한 다중상속을 지원하지만 Java는 다중상속을 지원하는 것을 포기했다. 자바를 만든 이유는 작고 단순하고 안전한 프로그램을 만들자는 것이었다. 다중상속은 이러한 프로그램의 안정성을 저해하는 요소가 될 수 있기에 다중상속을 포기하게 된 것이다. 
      - 하지만 여전히 여러가지 기능을 가지는 클래스의 존재는 객체지향언어인 자바에서는 자주 필요하게 된다. 여러가지 기능을 가진 유연한 클래스를 만들기 위해 다중상속만을 지원하는 자바는 또 다른 방법을 고안해야 했다. 이것이 바로 인터페이스이다.


인테페이스
      - 인터페이스라는 단어는 두개의 장치 및 시스템을 결합하고 있는 소프트웨어 또는 하드웨어라는 의미이다.
- 상수와 추상메소드의 집합
 - 인터페이스를 사용할려면 클래스에서 구현해야 한다.(implements)
 - 클래스가 인터페이스를 구현하게 되면 인터페이스 내에 정의된 상수는 상속된 것 처럼 직접 사용할수 있다.
 - 인터페이스의 모든 메소드는 abstract가 생략되었다고 해도 암시적으로 abstract이다.
 - 메소드의 구현을 갖지 않으며, 몸체부분은 세미콜론으로 대체된다.
 - 오직 abstract 메소드만을 포함할수 있으며 클래스 메소드는 abstract가 될수 없으므로 인터페이스의 모든 메소드는 인스턴스 메소드 이다. 



      - 직원 중 운전을 할 수 있는 직원이 있으며 이 직원은 회사에서 보유하고 있는 차량을 사용할 수 있다. 만약 모든 직원이 자동차 면허를 가지고 있다면 Employee 클래스에서 자동차 면허에 대한 필드와 메소드를 만들면 되지만 모든 직원이 자동차 면허를 가지고 있을리는 없을 것이다. 때문에 다중 상속이 지원되지 않는 자바에서 자동자 면허를 가지고 있는 직원 클래스를 따로 만들고 그 클래스를 이용해 면허를 가진 영업팀 직원, 면허를 가진 Manager, 면허를 가진영업팀장 이라는 식의 클래스를 만들어야 구현이 가능하다.


Employee 클래스와 DriverEmployee 클래스가 서로 큰 연관성이 없으며 운전을 할 줄 아는 직원을 만들기 위해DriverEmployee 클래스를 따로 만들고 각 팀 직원들도 운전하는 직원을 따로 만들어야 한다면 프로그램 개발 시 일관성이 없고 복잡해 진다. 이런 문제를 해결하기 위해 운전하는 직원을 클래스로 따로 만드는 대신 운전이라는 인터페이스를 만들어 필요할 때 사용할 수 있으면 위와 같은 문제점을 해결할 수 있을 것이다. 

인터페이스는 모양은 클래스와 비슷하지만 다른 점이 있다. 클래스는 필드와 메소드로 구성되어 있고 또 그 메소드는 자신이 할 일을 구현하고 있다. 하지만 인터페이스는 선언만을 하게 된다. 만약에 2종 운전 면허에 대한 인터페이스 SmallDriver를 작성한다면 다음과 같다.
      public interface SmallDriver { 
          void driveSmallCar(); // 메소드 선언 
          int maxSmall = 5; // 필드(상수) 
      } 
클래스는 필드로 기본자료형, 클래스 등이 올 수 있지만 인터페이스는 int, double 등의 기본 자료형만이 필드로 사용될 수 있다. 또한 각 필드는 반드시 초기화가 되어야 한다. 초기화가 되어야 하는 이유는 인터페이스의 필드는 암시적으로 final과 static이 설정되어 있기 때문이다.
      int maxSmall = 5   static final int maxSmall = 5;


인터페이스는 메소드를 선언만 하고 구현하지는 않는다. 그리고 인터페이스의 모든 메소드는 접근지정이 기본적으로 public으로 설정된다. 그리고 모든 메소드는 추상메소드이다. 즉 위에서 void driveSmallCar();라고 선언하고 있는데 암시적으로 설정되는 public과 abstract 키워드를 추가하면 다음과. 같이 선언되어 있는 것과 같다.
      public abstract void driveSmallCar();
앞에서 만든 SmallDriver 인터페이스를 상속한 1종 운전면허 인터페이스 BigDriver를 만든다면 다음과 같다.
      public interface BigDriver extends SmallDriver { 
          void driveBigCar(); 
          void driveSmallCar(); // 다시 선언하는 경우 
          int maxBig = 15; 
      } 


상위 인터페이스에서 선언된 메소드를 하위클래스에서 동일한 명칭으로 선언한 경우 경우에 따라 두가지로 나눌 수 있다. 
첫째는 상위 인터페이스의 메소드와 하위 인터페이스의 메소드 선언이 완전히 동일한 경우이다. 상위 인터페이스의 메소드만 유효한 것으로 인정하고 컴파일 에러는 발생하지 않는다.
둘째는 상위 인터페이스의 메소드와 하위 인터페이스의 메소드가 가지는 매개변수의 갯수가 서로 틀린 경우인데 이 경우는 각각 서로 다른 메소드가 선언된 것으로 간주한다. 즉 메소드가 오버로딩 된 것으로 인식하는 것이다.
하지만 위 두가지의 경우에 해당되지 않고 이름과 매개변수가 같은데 반환형만 다른 경우는 컴파일 에러가 발생하게 된다
예를 들어 SmallDriver에 선언되어 있는 상수 maxSmall을 BigDriver에서 다시 선언한다면? 이 경우 메소드는 하나만 인정하지만 상수의 경우는 범위 규칙에 의해서 SmallDriver의 maxSmall과 BigDriver의 maxSmall을 서로 다른 것으로 인식하여 두개의 상수가 선언된 것으로 인정한다. 사용시에는 상수의 위치에 따라 인터페이스명.상수명의 형태로 사용해야 한다.


인터페이스에서  선언된 메소드의 구현은 인터페이스를 구현하도록 허락된 클래스에서 구현하게 된다. 인터페이스를 상속받는 클래스는 컴파일러에게 "나는 A 라는 클래스인데 인터페이스 B를 완성해서 도구로 사용할꺼야"라고 알려준다. 
      public class A implements B {
만약 영업팀 직원이 운전을 하는것을 구현할려고 하면 기존의 영업팀직원 클래스가 driveSmallCar()를 구현해야 하며 그렇게 하기 위해서는 interface를 implement한다고 클래스에 표시해야 한다.


//인터페이스 선언
interface SmallDriver { 
  void driveSmallCar(); // 메소드 선언 
  int maxSmall = 5; // 필드(상수) 
}
//직원 Class
abstract class Employee {
    String name;    String id;
  //생성자
    public Employee(String name1, String id1) {
name = name1;        id = id1;
    }
    public void gotoOffice() { System.out.println(name+"님 출근하였습니다..."); }
    public void gotoHome() {  System.out.println(name+"님 퇴근하였습니다..."); }
    public String toString() { return "직원의 이름은 " + name + "이다.";    }
    abstract public void startJob();
}

//직원클래스를 상속한 영업팀직원 클래스
class SalesEmployee extends Employee implements SmallDriver{
    //영업담당지역, 차종류 메소드내에서만 변수에 접근이 가능하다.


    private String chargeArea, carName;
    public SalesEmployee(String newName,String newID,String newArea,String carName) {
        //super는 상위클래스의 생성자를 의미
        super(newName, newID); this.chargeArea = newArea; this.carName    = carName;
    }
// SmallDrive 인터페이스의 메소드 구현 
    public void driveSmallCar() { 
System.out.println("영업팀 직원 " + name + "은 " + this.carName + "를 운전한다.");
    }
    public void startJob() {
        System.out.println(super.name + "님이 " + this.chargeArea + " 지역으로 영업업무를 나갑니다...");
    }
}
//Main Class
class InterfaceSample1 {
    public static void main(String[] args) {
        // 인터페이스가 클래스의 객체를 참조하도록...
        SmallDriver sm1 = new SalesEmployee("홍길동", "11111","서울", "아반테");       
        // 인터페이스의 메소드 사용
        sm1.driveSmallCar();
    }
}

자바 상속(JAVA EXTENDS), 자바실무강좌,오라클실무강좌,OnJ,ORACLEJAVA

상속 개념 이해 바랍니다.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의) 



상속은 한 클래스를 확장하여 새로운 클래스를 만드는 것을 말한다. 이렇게 새로 만들어지는 클래스를 하위클래스(SubClass)라고 부른다. 그리고 원래의 클래스는 상위클래스(SuperClass)라고 부른다. 하위클래스는 상위클래스에서 정의한 메쏘드와 변수들을 그대로 가지고 있을 수 있다. (물론 이것도 접근변경자를 통해 조절이 가능하다) 여기에 추가로 하위 클래스 자체적으로 정의된 메쏘드와 변수들을 가질 수 있다. 어떤 클래스에 대해서, 상속받는 하위 클래스는 여러 개가 될수 있다. 

이미 만들어놓은 클래스를 기반으로 원하는 기능이 추가된 새로운 클래스를 쉽게 만들어낼 수 있다

자바의 모든 클래스는 상속의 대상이 되는 상위클래스(SuperClass)가 반드시 하나 존재한다
프로그램의 재사용성과 확장성을 높인다.

class Employee {
    String name;    String id;
  //생성자
    public Employee(String name1, String id1) {
        name = name1;    id = id1;
    }
    public void gotoOffice() {
        System.out.println(name+"님 출근하였습니다...");
    }
    public void gotoHome() {
        System.out.println(name+"님 퇴근하였습니다...");
    }
}



Employee Class를 상속한 Manager Class가 있다….
//직원클래스를 상속한 일반관리자 Class
class Manager extends Employee {
    String chargeDept;
    public Manager(String newName,String newID,String newDept) {
        //super는 상위클래스의 생성자를 의미
        super(newName, newID);
        this.chargeDept = newDept;
    }

    public void startJob() {
        System.out.println(this.chargeDept + " " + super.name + "님이 관리업무를 시작합니다...");
    }
}


Employee Class를 상속한 SalesEmployee Class가 있다….
//직원클래스를 상속한 영업팀직원 클래스
class SalesEmployee extends Employee {
    //영업담당지역, 메소드내에서만 변수에 접근이 가능하다.
    private String chargeArea;
    public SalesEmployee(String newName,String newID,String newArea) {
        //super는 상위클래스의 생성자를 의미
        super(newName, newID); 
        this.chargeArea = newArea;
    }
    public void startJob() {
        System.out.println(super.name + "님이 “ + this.chargeArea + “ 지역으로 영업업무를 나갑니다...");   
    }
}



상속을 위해서는 extends keyword를 사용한다.  (class a extends b  b로 부터 상속을 받음)
extends키워드를 이용해 클래스를 상속받으면 상속받은 클래스는 상위클래스의 필드와 메소드를 상속받는다.
      (예) 앞의 Manager Class instance화 했다면
        Manager m = new Manager(“홍길동”, “12345”,”관리부”);
        String id = m.id;
        m.gotoOffice();
      등과 같이 사용이 가능하다… 물론 m.startJob() 처럼 자신의 Method를 사용이 가능하다.
하위클래스는 객체를 생성할 때 상위클래스의 객체를 먼저 생성해야 한다. 하위클래스는 크게 상위클래스 객체부와 자기 자신의 객체부로 나눌 수 있다. 즉 new 키워드를 사용하여 하위클래스를 생성하면 상위클래스의 부분과 하위클래스 고유의 부분이 나뉘어 생성된다는 것이다. 이때 상위클래스 부분을 super라고 한다. 그리고 상위클래스 객체부를 생성하기 위해 사용하는 것이 바로 상위클래스 생성자 super()이다. 
      (예) 만약 Manager Class에서 super(newName, newID)를 생략하면 다음과 같은 에러가 난다.  생략시에는 default로 super() 이 삽입되는데ㅡ Employee에는 파라미터가 없는 생성자가 선언되지 않았기때문에 ….
      Example.java:22: cannot resolve symbol        symbol  : constructor Employee  ()
        location: class Employee        public Manager(String newName,String newID,String newDept) {


하위클래스에서 상위클래스의 멤버를 호출하고자 할때는 .(점) 연산자를 사용하여 나타낼 수 있다. 
      (예) Manager Class에서 super.name
      public void startJob() {
            System.out.println(this.chargeDept +” “+ super.name + "님이 직원관리 업무 를 시작합니다...");   
    }

       


이제 SaleEmployee(영업부직원)을 상속한(확장한) SalesChief(영업팀장) Class를 만들어보자.
영업팀장 Class는 영업부직원과 같이 id,이름,영업담당 지역을 가지면서 자신만의 속성을 가진다.
      //영업팀직원 클래스를 상속한 영업팀장 클래스
      class SalesChief extends SalesEmployee {
      int salesTarget;  //영업팀 목표 매출액
      public SalesChief(String newName,String newID,String newArea, int newSalesTarget) {
          //super는 상위클래스의 생성자를 의미
          super(newName, newID, newArea); 
          this.salesTarget = newSalesTarget;
      }
      //영업팀장의 업무는 더이상 확장이 안된다는 의미, 상속할수가 없다는 의미
      final public void startJob() {
          System.out.println(super.name + "님이 영업팀 직원을 관리한다...");
          System.out.println(super.name + "님이 관리하는 영업팀의 매출목표는 "+ this.salesTarget + "만원 입니다...");
      }
      }


SalesChief Class의 경우 SalesEmployee의 startJob() 메소드를 재정의(Override) 했다.
메소드의 재정의라고 하는 것은 상속의 관계에 있는 클래스들 사이에서 상위클래스에 있는 메소드를 하위클래스에서 다시 정의하여 사용하는 것을 말한다. 이 경우 하위클래스의 메소드는 상위클래스의 메소드와 이름도, 매개변수 타입도, 그리고 반환형도 같다. 하지만 내부적으로 하는 일은 다르다. 
만약 SalesChief Class의 startJob 메소드에서 다음과 같이 정의한다면,,,
      public void startJob() {
          System.out.println(super.chargeArea); 
          System.out.println(super.name + "님이 영업팀 직원을 관리한다...");
    System.out.println(super.name + "님이 관리하는 영업팀의 매출목표는 "+ this.salesTarget + "만원 입니다...");
      }
      아래와 같은 오류발생…
      Example.java:59: chargeArea has private access in SalesEmployee
      System.out.println(super.chargeArea); 
객체지향 언어에서는 정보의 은닉(캡슐화,Encapsulation) 을 위해서 위와 같은 접근지정을 할 수 있다. 즉 SaleEmployee의 자료중 정보 은닉의 필요가 있는 필드나 메소드는 접근지정자를 사용해 접근을 제한할 수 있는 것이다.
       


현재 작성한 클래스나 클래스의 멤버를 다른 클래스에게 상속시키고자 하지 않을경우엔 final 키워드를 사용한다.예를 들어 한 회사에 영업팀장은 그 만의 고유한 업무를 가지고 영업팀장의 업무를 관리하는 또 다른 개체가 없을 때는 영업팀장을 상속하여 더 확장된 기능을 가진 클래스를 만들 필요가 없을 것이다. 이럴 경우 final 키워드를 사용한다. 
메소드의 경우도 이와 같이 상속을 완전히 금지하는 경우가 있는데 이러한 메소드도 final이라는 키워드와 같이 사용하게 되고 종단 메소드(final method)라고 부른다. 


-------------------------------


/* Class의 상속에 관한 예제 Example1.*/
//직원 Class
class Employee {
    String name;
    String id;

  //생성자
    public Employee(String name1, String id1) {
        name = name1;
        id = id1;
    }

    public void gotoOffice() {
        System.out.println(name+"님 출근하였습니다...");
    }

    public void gotoHome() {
        System.out.println(name+"님 퇴근하였습니다...");
    }
}


//직원클래스를 상속한 일반관리자 Class
class Manager extends Employee {
    String chargeDept;
    public Manager(String newName,String newID,String newDept) {
        //super는 상위클래스의 생성자를 의미
        super(newName, newID);    this.chargeDept = newDept;
    }
    public void startJob() {
        System.out.println(this.chargeDept + " " + super.name + "님이 일을 시작합니다...");
    }
}
//직원클래스를 상속한 영업팀직원 클래스
class SalesEmployee extends Employee {
    //영업담당지역, 메소드내에서만 변수에 접근이 가능하다.
    private String chargeArea;
    public SalesEmployee(String newName,String newID,String newArea) {
        //super는 상위클래스의 생성자를 의미
        super(newName, newID);      this.chargeArea = newArea;
    }
    public void startJob() {
        System.out.println(super.name + "님이 " + this.chargeArea + " 지역으로 영업업무를 나갑니다...");
    }
}


//영업팀직원 클래스를 상속한 영업팀장 클래스
class SalesChief extends SalesEmployee {
      int salesTarget;  //영업팀 목표 매출액
      public SalesChief(String newName,String newID,String newArea, int newSalesTarget) {
              super(newName, newID, newArea);  this.salesTarget = newSalesTarget;
      }
      public void startJob() {
          System.out.println(super.name + "님이 영업팀 직원을 관리한다...");
          System.out.println(super.name + "님이 관리하는 영업팀의 매출목표는 "+ this.salesTarget + "만원 입니다...");
      }
}
//Main Class
class Example {
    public static void main(String args[]) {
        Manager m = new Manager("이종철","12345","솔루션개발");
        m.gotoOffice();        m.startJob();        m.gotoHome();
        SalesEmployee se = new SalesEmployee("차두리","23456","서울");
        se.gotoOffice();        se.startJob();        se.gotoHome();
        SalesChief sc = new SalesChief("홍길동","34567","전국",9000);
        sc.gotoOffice();        sc.startJob();        sc.gotoHome();
    }
}


JAVA, JAR EXAMPLE(자바 JAR, 자바실무교육, 오라클자바실무, 오엔제이프로그래밍)

JAR 명령어는 UNIX TAR와 비슷해서 공부하기도 쉽습니다.

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의) 


Jar c|t|u|x[f][m][M][0][v] [jar파일의이름] [menifest] [-C directory] [files]
  Jar –I[jar]
  - 처음 Option의 첫번째 문자(기본적인 연산을 지정)
  c : 새로운 Jar Archive를 생성, 마지막인자로 입력파일등을 표시, 새롭게 생성된 JAR File 
      은 첫번째 엔트리로 META-INF/MENIFEST.MF 파일을 가지며 이파일은 JAR File의 
      내용을 나열하며 각각의 파일에 대한 메시지 요약을 포함한다.
  t : Jar Archive의 내용을 나열한다. 
  u : Jar Archive 파일의 내용을 갱신, 커맨드라인에 나열된 파일은 이 아카이브에 추가된다. 
      m 옵션과 같이 사용된 경우에는 지정된 메니페스트 정보를 Jar File 에 추가한다.
 x : JAR Archive의 내용을 추출한다.
 - 한정자 옵션(4개의 명령지정문 뒤에서 연산에 관한 자세한 정보를 제공)
 f: jar가  Command Line의 지정된 이름의 JAR File에 대해 수행되는 것임을 나타낸다. 
    지정되지 않으면 표준입력으로 JAR File을 읽고 표준출력으로 JAR File을 쓴다.
m : 메니페스트 템플릿이 코맨드라인에 지정되었음을 JAR 명령에게 알린다.,(c,u Option과
    함께사용)


M : jar가 기본 메니페스트 파일을 생성하지 않도록 함(c, u와 함께 사용)
v : 여러 가지 출력을 내보내도록 함
0 : jar가 압축 없이 파일을 JAR 아카이브에 저장 하도록 함 

첫번째 옵션이 f를 포함한다면 jar파일의 이름을 기술하며, m을 포함한다면 menifest파일이름을 기술한다. 만약 첫번째 Option이 f,m을 모두 포함한다면 이와 동일한 순서로 나열해야 한다. Files에는 JAR Archive에 포함시킬 파일을 나열한다.

** 추가옵션
-C Directory : Jar가 다음파일및 디렉토리를 처리하는중에 지정된 dir을 바꾸도록 한다. –C Option은 몇개라도 사용이 가능하며, 다음 –C Option이 올때까지 유효하다.
-I jarfile : c,t,u,x 대신 사용, Jar File의 파일구조등의 인덱스를 산출하도록, META-INF/INDEX.LIST 파일에 저장
 추후 자바인터프리터나 애플릿뷰어등이 알고리즘의 최적화하고 불필요한 Jar File을 다운로드 하지 않기 위해서 이 인덱스 정보를 이용활수 있다.



jar cvf hello.jar HelloWorld*.class
jar cf hello.jar HelloWorld*.class -> 위의 것과 동일하나 화면에 출력이 나타나지 않는다.
jar cmf myMenifest test.jar HelloWorld.class -> test.jar File을 만들면서 myMenifest 라는 파일의 내용을 MENIFEST.MF File에 첨가한다.
Jar ufm test.jar myMenifest -> 이미 만들어져 있는 test.jar File의 MENIFEST.MF File을 myMenifest 를 참조하여 갱신한다.
Jar umf myMenifest test.jar

D:\자바프로그래밍\예제>jar tvf hello.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
D:\자바프로그래밍\예제>jar tf test.jar
META-INF/
META-INF/MANIFEST.MF
HelloWorld.class


D:\자바프로그래밍\예제>jar uf test.jar HelloWorld1.class

D:\자바프로그래밍\예제>jar uf test.jar HelloWorld2.class

D:\자바프로그래밍>jar cvf sample.jar -C 예제/  .  sample.jar file은 예제 dir에 생김

D:\자바프로그래밍\예제>jar tvf test.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
  391 Fri Jun 28 17:35:00 KST 2002 HelloWorld1.class
  354 Fri Jun 28 17:35:00 KST 2002 HelloWorld2.class

2013년 7월 29일 월요일

JAVA JNDI를 이용한 DNS 서비스 구현(JAVA JNDI DNS)

JNDI를 이용한 DNS 서비스 구현


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)



즉 자바 응용 프로그램이 어느 위치에 있든지 필요한 자바 객체들을 검색할 수 있는 것입니다. EJB 환경에서는 JNDI를 이용해 EJB Home 객체를 얻어낸 후 이를 이용해 Java Beans 객체를 생성하거나 접근하게 됩니다.

JNDI DNS(Domain Name System), COS(Common Object Services) 등의 네이밍 서비스 표준과 LDAP(Lightweight Directory Access Protocol), NDS(NetWare Directory Service), NIS(Netware Information System) API를 제공 합니다.

참고로 JDK1.4 부터는 JNDI 서비스 프로바이더에 DNS Service Provoder를 제공하여 DNS 서비스를 통해 네이밍 서비스를 받을 수 있도록 지원 했는데 아래는 그 예제 입니다.

/*
 * Created on 2005. 1. 9
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author 이종철
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
import java.util.Hashtable;
import javax.naming.directory.*;
import javax.naming.NamingEnumeration;


public class SimpleDNS {

             public static void main(String[] args) {
                           Hashtable h = new Hashtable();
                           h.put("java.naming.factory.initial","com.sun.jndi.dns.DnsContextFactory");
                           h.put("java.naming.provider.url","dns://ns.dacom.co.kr");
                          
                           try {
                                        //DirContext 초기화
                                        DirContext context = new InitialDirContext(h);
                                       
                                        //DNS질의 결과를 받아 오자...
                                        Attributes attribute = context.getAttributes("onjprogramming.co.kr");
                                       
                                        //질의 결과 출력
                                        NamingEnumeration ne = attribute.getAll();
                                        System.out.println("onjprogramming.co.kr --> ");
                                        while(ne.hasMoreElements()) {
                                                     System.out.println(ne.next());
                                        }
                           }
                           catch(Exception e) {
                                        e.printStackTrace();
                           }
                          
             }
}

[결과]
onjprogramming.co.kr -->
NS: ns1.gabia.co.kr., ns.gabia.net., ns.gabia.co.kr.


[출처]오라클자바커뮤니티



www.oraclejavacommunity.cop.kr

자바 스윙(JAVA Swing)의 HTMLEditorKit을 이용한 웹 페이지 파싱

Swing을 이용한 웹페이지 파싱



오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)



JDK의 swing 패키지에는 html을 파싱 하는 기능이 포함되어 있는데 이기능을 적절히 이용하면 웹 페이지에서 원하는 내용을 추출 할 수 있을 것입니다.

 다음의 예제를 보시면 html Tag중에서 원하는 태그의 내용을 간단히 파싱하는 것을 확인 할 수 있으니 참고 하시기 바랍니다

[OnjWebParser .java]

import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTML;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.HttpURLConnection;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.parser.ParserDelegator;
/**
 *
 * @author 이종철(오라클자바커뮤니티, 오엔제이프로그래밍 실무학원) * TODO To change the template for this generated type comment go to
 *
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class OnjWebParser {
 // 파서는 콜백 형식으로 되어 있다. 각 태그가 들어 올때 적절한 메소드가 호출됨
 private class CallbackHandler extends HTMLEditorKit.ParserCallback {
  // 태그가 시작할 때 호출 되는 메소드
  public void handleStartTag(HTML.Tag tag, MutableAttributeSet a, int pos) {
   // <A href 인 경우... A태그를 찾는다...
   if (tag == HTML.Tag.A) {
    System.out
      .println(a
        .getAttribute(javax.swing.text.html.HTML.Attribute.HREF));
   }
  }
  // 텍스트가 들어올때 호출되는 메소드
  public void handleText(char[] data, int pos) {
   System.out.println(data);
  }
 }
 public void parse(String str) {
  String content = null;
  try {
   // 입력받은 URL에 연결하여 InputStream을 통해 읽은 후 파싱 한다.
   URL url = new URL(str);
   HttpURLConnection con = (HttpURLConnection) url.openConnection();
   InputStreamReader reader = new InputStreamReader(
     con.getInputStream(), "euc-kr");
   new ParserDelegator().parse(reader, new CallbackHandler(), true);
   con.disconnect();
  }
  catch (Exception e) {
   e.printStackTrace();
  }
 }
 public static void main(String[] args) {

  OnjWebParser parser = new OnjWebParser();
 }
}

[결과]
오엔제이프로그래밍실무학원
./
javascript:goMenu01();
ㆍHOMEㆍ

mailto:webmaster@onjprogramming.co.kr
COMTACT USㆍ

javascript:goMenu63();
SITEMAP
javascript:fn_loginok()

ID저장
javascript:fn_loginok()
javascript:fn_loginok()
../member/mem-join.html
../member/mem-idpw.html
today Hit
126
교육센터회원
5919
커뮤니티회원
9433
/onj/curri/curri-master.html?command=1625
#tabs-1
JAVA
#tabs-2
ORACLE
#tabs-3
iPhone/Android
#tabs-4
.NET
#tabs-5
표준웹/HTML5
#tabs-6
채용/취업무료교육
#tabs-7
초보자(재학생)코스
../curri/curri-master.html?command=1645
JAVA&WEB프레임워크실무과정

14일
98시간

08-09
../curri/curri-master.html?command=1673
Spring3.X, MyBatis, Hibernate실무과정

5일
35시간

08-09
../curri/curri-master.html?command=1677
JAVA,JSP 초보에서 실무까지


18일
56시간

07-31
../curri/curri-master.html?command=1626
자바초보에서안드로이드까지

18일
54시간

08-01
../curri/curri-master.html?command=1667
JAVA&WEB프레임워크실무과정

33일
99시간

08-08
../curri/curri-master.html?command=1674
Spring3.X, MyBatis, Hibernate실무과정

12일
36시간

08-08
../curri/curri-master.html?command=1676
(개발과정)Ajax,jQuery,MyBatis&Spring3.X개발자과정

14일
42시간

08-09
../curri/curri-master.html?command=1627
자바초보에서안드로이드까지

8일
56시간

08-03
../curri/curri-master.html?command=1646
JAVA&WEB프레임워크실무과정

14일
98시간

08-03
../curri/curri-master.html?command=1661
Spring3.X, MyBatis, Hibernate실무과정

5일
35시간

08-10
../curri/curri-master.html?command=1662
MiPlatform, XPlatform 실무강좌

5일
35시간

08-10
../curri/curri-master.html?command=1675
(개발과정)Ajax,jQuery,MyBatis&Spring3.X개발자과정

6일
42시간

08-10
../curri/curri-master.html?command=1379
SQL초보에서실전전문가까지


8일
56시간

07-31
../curri/curri-master.html?command=1642
오라클 마스터


18일
54시간

07-29
../curri/curri-master.html?command=1583
SQL초보에서실전전문가까지

18일
54시간

08-07
../curri/curri-master.html?command=1666
SQL초보에서실전전문가까지

8일
56시간

08-03
../curri/curri-master.html?command=1637
오라클 마스터

8일
56시간

08-10
../curri/curri-master.html?command=1640
Android Developer 코스

5일
40시간

08-09
../curri/curri-master.html?command=1638
Android Developer 코스


14일
42시간

07-31
../curri/curri-master.html?command=1626
자바초보에서안드로이드까지

18일
54시간

08-01
../curri/curri-master.html?command=1332
iPhone 하이브리드 앱 개발 실무과정

14일
42시간

08-09
../curri/curri-master.html?command=1627
자바초보에서안드로이드까지

8일
56시간

08-03
../curri/curri-master.html?command=1216
iPhone 하이브리드 앱 개발 실무과정

6일
42시간

08-10
../curri/curri-master.html?command=1639
Android Developer 코스

6일
42시간

08-10
../curri/curri-master.html?command=1547
C#,ASP.NET마스터

8일
56시간

08-08
../curri/curri-master.html?command=1671
C#,ASP.NET마스터

18일
56시간

08-08
../curri/curri-master.html?command=1650
C#,ASP.NET마스터

8일
56시간

08-03
../curri/curri-master.html?command=1635
웹퍼블리싱 마스터

5일
40시간

08-09
../curri/curri-master.html?command=1625
[채용확정교육]오라클자바개발자4개월과정

80일
560시간

08-16
../curri/curri-master.html?command=1632
웹퍼블리싱 마스터

14일
42시간

08-08
../curri/curri-master.html?command=1630
HTML5, CSS3,Ajax, jQuery마스터과정

14일
42시간

08-09
../curri/curri-master.html?command=1631
HTML5, CSS3,Ajax, jQuery마스터과정


6일
42시간

00-00
../curri/curri-master.html?command=1633
웹퍼블리싱 마스터

6일
42시간

08-03
../curri/curri-master.html?command=1662
MiPlatform, XPlatform 실무강좌

5일
35시간

08-10
../curri/curri-master.html?command=1625
[채용확정교육]오라클자바개발자4개월과정

80일
560시간

08-16
../curri/curri-master.html?command=1547
C#,ASP.NET마스터

8일
56시간

08-08
../curri/curri-master.html?command=1671
C#,ASP.NET마스터

18일
56시간

08-08
../curri/curri-master.html?command=1650
C#,ASP.NET마스터

8일
56시간

08-03
../curri/curri-master.html?command=1642
 오라클 마스터

07-29
../curri/curri-master.html?command=1677
 JAVA,JSP 초보에서 실무까


07-31
../curri/curri-master.html?command=1626
 자바초보에서안드로이드까


08-01
../curri/curri-master.html?command=1650
 C#,ASP.NET마스터

08-03
../curri/curri-master.html?command=1646
 JAVA&WEB프레임워크실무과


08-03
../curri/curri-master.html?command=1583
 SQL초보에서실전전문가까지

08-07
/onj/curri/m-curri-master.html
../curri/curri-master.html?command=1631
 HTML5, CSS3,Ajax, jQuery


00-00
../curri/curri-master.html?command=1379
 SQL초보에서실전전문가까지

07-31
../curri/curri-master.html?command=1638
 Android Developer 코스

07-31
../curri/curri-master.html?command=1627
 자바초보에서안드로이드까


08-03
../curri/curri-master.html?command=1633
 웹퍼블리싱 마스터

08-03
../curri/curri-master.html?command=1547
 C#,ASP.NET마스터

08-08
#tabsub-1
NOTICE
#tabsub-2
구인구직
../notice/notice-content.html?num=1221&page=
오엔제이 프로그래밍 실무학원 소개
2013-07-20
../notice/notice-content.html?num=1064&page=
(전액무료)개발잘하는 신입 무료로 뽑기 프로젝트(미취업자취업무료교육)

2013-06-15
../notice/notice-content.html?num=1233&page=
[평일주간개강확정 7월15일] 채용확정자교육 16기
2013-07-12
../notice/notice-content.html?num=1232&page=
[평일야간개강확정7월19일] iPhone 하이브리드 앱 개발 실무과정
2013-07-08
../notice/notice-content.html?num=1230&page=
[평일주간개강확정] 7/8]Spring3.X, MyBatis, Hibernate실무과정
2013-06-27
../notice/notice-content.html?num=1229&page=
[평일야간개강확정 7/11]SQL초보에서실전전문가까지
2013-07-01
../notice/notice-content.html?num=1228&page=
[평일야간개강확정 6/25] C#,ASP.NET마스터
2013-06-20
../recruit/recruit-view.html?num=330&page=
2013-07-18
../recruit/recruit-view.html?num=329&page=
2013-07-13
../recruit/recruit-view.html?num=328&page=
2013-06-23
../recruit/recruit-view.html?num=327&page=
2013-06-12
../recruit/recruit-view.html?num=326&page=
2013-06-11
../recruit/recruit-view.html?num=325&page=
[오엔제이시스템즈]정규직 구인
2013-06-01
../recruit/recruit-view.html?num=316&page=
LG U+ 업무시스템개발
2013-04-22
사업자등록번호 :144-90-00505
통신판매업신고번호
 :2013-서울구로-0458
대표이사 :이종철
주소
 :서울 구로구 구로3동 222-8 코오롱디지털타워빌란트2차 803호 오엔제이 프로그래밍실무학원
전화 :02)851-4790
SI사업관련
 :02)851-4790
팩스
 :0505-719-4790
Copyright ⓒ

#
onjprogramming.co.kr

All Rights Reserved.

http://cafe.daum.net/fordeveloper2
../curri/m-curri-calendar.html
../recruit/recruit-01.html
javascript:window.external.AddFavorite('http://www.onjprogramming.co.kr/' ,
'오엔제이 프로그래밍실무학원');

[출처]오라클자바커뮤니티
www.oraclejavacommunity.co.kr