레이블이 구로디지털자바인 게시물을 표시합니다. 모든 게시물 표시
레이블이 구로디지털자바인 게시물을 표시합니다. 모든 게시물 표시

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일 목요일

자바의 연산자

이번 강좌에서는 자바에서의 연산자를 배워보도록 하겠습니다.

대부분 언어를 공부해 보신 분들은 수도 없이 많이 보셨던 부분입니다. 잘 모르셔도 됩니다. 뒤에 공부하시다 보면 저절로 아시는 것도 있을 것이며 나중에 원하는 일을 하시다가 다시 아시게 되는 경우도 있을 겁니다. 그러나 기본이 없으면 오래가지 못합니다. 간단히 공부해 두시기 바랍니다.



자바에서 연산자는

산술연산자(Arithmetic Operator) --> 단항연산자(++,--), 이항연산자(+,-,*,/)

관계연산자(Relational Operator) -->>, >=, <, ><=, ==, != >

논리연산자(Logical Operator) -->&&, ||, &, |, !

비트연산자(Bitwise Operator) -->&, |, ^, ~, >>, >>>, <><

조건연산자(Conditional Operator) --> ?(삼항연산자)

할당연산자(Assignment Operator) --> +=, -=, *=, /=, &=, ^=, |=, <><=, >>=, >>>=

등으로 나누어 볼 수 있습니다.



연산자의 우선 순위는 괄호를 치시면 되니까 별다르게 고려 하지 않겠습니다.



1. ++, --, !, ~, instanceof

단항 연산자이다.
! : 논리형 자료형(boolean)의 부정
~ : 정수형 자료에 대한 보수 연산
++, -- : 단항 연산자, 변수의 앞쪽에 붙는 경우와 뒤쪽에 붙는 경우의 동작 형태가 다르다.
앞에 붙은 경우 : 연산이 수행된 다음 값
뒤에 붙는 경우 : 연산이 수행되기 전의 값



아래의 예제를 실습해 보세요~

[예제]

public class Op1 {
public static void main(String[] args) {
int a = 8;
//이진수 형태로 출력 합니다.(0이 아닌것 부터 출력)
System.out.println(Integer.toBinaryString(a));
a= ~a; //보수 연산, 1은0으로 0은 1로
System.out.println(Integer.toBinaryString(a));

a = 8;
a = a++;
System.out.println("a = " +a);

a = a++ +1;
System.out.println("a++ +1 = " +a);

}
}




[결과]

1000(앞 부분에 있는 0000~ 은 출력하지 않는다...)
11111111111111111111111111110111
a = 8
a++ +1 = 9



2. <><, >>, >>>

비트연산에 관련된 연산자(Shift 연산자) 입니다.
<>< 연산자는 좌측 쉬프트 이므로 2를 곱하는 효과가 있습니다.
>> 연산자는 우측 쉬프트 이므로 2로 나누는 효과가 있습니다.
<><, >> 연산자인 경우 부호를 고려 한다는것을 명심하세요~
당연히 부호를 고려하므로 왼쪽을 해당 부호 비트로 채웁니다.

>>> 연산자인 경우 왼쪽을 0으로 채웁니다. 부호를 고려하지 않습니다.
양수인 경우 >>, >>> 연산자는 같은 효과 이지만 음수인 경우 다른 결과가 나타 납니다.

[예제]

public class ShiftTest {
public static void main(String[] args) {
int a=-64;
System.out.println("<><");
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a<><1));
System.out.println(Integer.toBinaryString(a<><2));
System.out.println(">>");
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>1));
System.out.println(Integer.toBinaryString(a>>2));
System.out.println(">>>");
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>>1));
System.out.println(Integer.toBinaryString(a>>>2));
}
}



[결과]

<><
11111111111111111111111111000000
11111111111111111111111110000000
11111111111111111111111100000000
>>
11111111111111111111111111000000
11111111111111111111111111100000
11111111111111111111111111110000
>>>
11111111111111111111111111000000
1111111111111111111111111100000
111111111111111111111111110000



3.<, >, >=, <=, ==, !=

관계 연산자들 이며 연산의 결과로 boolean 값을 리턴 합니다.
이 연산자의 대상은 기본형 데이터에 한정되며 객체에 대해서는 쓰이지 못 합니다.
예)System.out.println(5 > 7);
==, != 또한 관계 연산자 이나 위의 것 보다 우선 순위가 낮다. 연산자의 두 항이 같은지 다른지에 따라 boolean 값을 돌려 줍니다.
==, != 연산자는 객체에 대해 사용이 가능한데 그 기준은 객체가 같은 메모리 영역에 있는지 아닌지로서 평가 합니다.



4.&, ^, |, &&, ||

& : 비트 AND
^ : 비트 XOR
| : 비트 OR
&& : ‘&’와 같이 AND 연산을 하지만 대상은 boolean
|| : ‘|’와 같이 OR 연산을 하지만 대상은 boolean



5. ?

조건연산자 이며 형식은 아래와 같습니다.
형식 : (조건) ? (참 일때의 식) : (거짓 일때의 식)
if 문등을 몇줄에 걸쳐 써야 하는것을 간략하게 기술 할 수 있도록 해 줍니다.
[예]
int i=2;
int result = i<5 ? i+10 : i/2; >
System.out.println(result);



6. =, op=

할당 연산자 이며 우선 순위가 가장 낮습니다.
Op= 연산자는 다음과 같은 것들이 있습니다.
+=, -=, *=, /=, &=, ^=, |=, <><=, >>=, >>>=

[오라클자바커뮤니티, JAVAORACLE교육]자바 JVM의 메모리 구죠, 자바교육

JAVA JVM의 메모리 구조


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




JVM 의 실행 메모리 영역

메쏘드(method) 영역 : 클래스의 메소드에 대한 바이트코드, 전역변수(클래스 변수)
힙(heap) 영역 : 객체를 저장할때 사용하는 메모리
스택(stack) 영역 : 지역변수,함수의 인자,함수의 리턴값,리턴 번지
레지스터(registers) : 가상 머신의 현재 상태를 보여줌, 현재 실행되고 있는 메소드의 실행 포인터를 저장
실행 풀(Runtime Constant Pool) : 숫자 리터럴과 상수 필드 포함, 메소드 영역으로 부터 할당 받는다.


JVM 의 실행 메모리 영역 ]


메소드 내에서 객체 참조형으로 선언된 변수인 경우(String s = new String("abc") 일때의 s) 지역변수로서 스택에 위치하며 힙에 저장되어 있는 객체에 대한 참조값을 가지게 됩니다.
객체 참조형 변수의 값이 null 이라는 의미는 아무것도 참조하고 있지 않다는 의미 입니다.
New 연산자는 힙(heap) 메모리에 객체를 만들고 그 객체의 참조값을 반환 합니다.(Hello h = new Hello()) ---> Memory Heap에 Hello 클래스의 인스턴스(객체)를 만들고 그것을 스택에 있는 h라는 변수가 참조하도록 합니다. C에서의 포인터 변수와 유사 합니다.)
객체 참조 변수의 경우 대입, 메소드 호출시의 인자, 반환형 등으로 사용 될 때 참조 값만 전달 될 뿐, 객체 자체가 복제되어 전달되는 것은 아닙니다.
아래의 예제를 참고하세요

class C
{
public static void
main(String[] args)
{
int i = 3;
f(i);
}
static void f(int arg)
{
int i = 10;
double f = 3.14
}
}


이상 JVN의 메모리 영역에 대해 살펴 보았습니다.







[오라클자바커뮤니티]Struts Validation Rule 강좌, oraclejavanew.kr

Struts Validation Rule 


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




Validator Framework에는 두개의 설정 파일(validation.xml, validator-rules.xml)이 있습니다. 

===================================================
1.        validation-rules.xml
===================================================

애플리케이션에서 사용하는 전체적인 검증 규칙을 포함, 애플리케이션에 독립적이므로 다른 스트럿츠 애플리케이션에서 사용 가능 합니다.

기본적인 규칙을 수정하거나 확장하는 경우에만 이 파일을 수정 합니다.

파일의 구성을 살펴보면 ROOT ELEMENT인 <form-validation>은 한 개 이상의 global 요소를 필요로 합니다.

<!ELEMENT form-validation (global+)>
<!ELEMENT global (validator+) >

각각의 validator는 유일한 한가지의 검증 규칙을 나타냅니다. 다음은 required 규칙에 대한 선언 부분 입니다. 또한 validator 요소는 자바스크립트를 지원합니다.

<validator name="required"
        classname="org.apache.struts.validator.FieldChecks"
        method="validateRequired"
        methodParams="java.lang.Object,
                      org.apache.commons.validator.ValidatorAction,
                      org.apache.commons.validator.Field,
                      org.apache.struts.action.ActionMessages,
                      javax.servlet.http.HttpServletRequest"
        msg="errors.required"/>

    name : 규칙의 논리적인 이름
    classname : 검증 로직을 포함하는 클래스
    method : 검증 로직을 포함하는 메소드
    methodParams : 메소드의 매개 변수
    msg : 리소스 번들의 키값
depends : 명시된 규칙 이전에 호출 해야 하는 검증 규칙
jsFunctionName : 자바스크립트 함수를 명시,
기본적으로 Validator의 실제 이름을 주로 사용 합니다.


<intRange>규칙을 보면 depends 부분이 기술 되어 있는데 참고 바랍니다. 즉 정수 값의 범위를 체크하기 이전에 정수형인지 체크가 이루어져야 한다는 것 입니다.

<validator name="intRange"
            classname="org.apache.struts.validator.FieldChecks"
            method="validateIntRange"
            methodParams="java.lang.Object,
                      org.apache.commons.validator.ValidatorAction,
                        org.apache.commons.validator.Field,
                      org.apache.struts.action.ActionMessages,
                      javax.servlet.http.HttpServletRequest"
            depends="integer"
            msg="errors.range"/>

다음은 Validator Framework의 기본적인 리소스 번들의 키 입니다.

# Struts Validator Error Messages
  errors.required={0} is required.
  errors.minlength={0} can not be less than {1} characters.
  errors.maxlength={0} can not be greater than {1} characters.
  errors.invalid={0} is invalid.

  errors.byte={0} must be a byte.
  errors.short={0} must be a short.
  errors.integer={0} must be an integer.
  errors.long={0} must be a long.
  errors.float={0} must be a float.
  errors.double={0} must be a double.

  errors.date={0} is not a date.
  errors.range={0} is not in the range {1} through {2}.
  errors.creditcard={0} is an invalid credit card number.
  errors.email={0} is an invalid e-mail address.

-----------------------------------------
다음은 GenericValidator의 기본 검증 규칙 입니다.
-----------------------------------------

Table 4.1: Common Validator Rules
Rule Name(s)                        Description                                 
required            The field is required. It must be present for the  form to be valid.     
minlength          The field must have at least the number of characters as the
specified minimum length.
maxlength          The field must have no more characters than the specified
maximum length.
intrange, floatrange,
doublerange        The field must equal a numeric value between the min and max variables.
byte, short, integer, 
long, float, double  The field must parse to one of these standard  Java types (rules names
equate to the expected Java type).
mask              The field must match the specified regular expression (Perl 5 style).
date                The field must parse to a date. The optional variable datePattern
specifies the date pattern
(see java.text.SimpleDateFormat in the Java-Docs to learn how to
create the date patterns).
You can also pass a strict variable equal to
creditCard          The field must be a valid credit card number. None


==============================================
2.        validation.xml
==============================================


이 파일은 애플리케이션에 종속적이며 특정한 ActionForm에서 사용하는 validation-rules.xml 파일의 검증 규칙을 나타냅니다. 그러므로 ActionForm 안에서는 검증을 위한 별다른 소스의 변경이 필요 없다는 이야기가 되며 validation.xml 파일에서 검증 로직은 ActionForm 한 개 이상과 연동 됩니다.

XML 형식은 다음과 같습니다.

<!ELEMENT form-validation (global*, formset+) >
<!ELEMENT global (constsnts*) >
<!ELEMENT formset (constant*, form+) >

Constants 요소는 자바 프로그래밍에서 상수를 선언하는 것과 매우 유사 합니다.

<global>
<constant>
<constant-name>phone</constant-name>
<constant-value>^\(?(\d{3})\)?[-| ]?(\d{3})[-
| ]?(\d{4})$</constant-value>
</constant>
<constant>
<constant-name>zip</constant-name>
<constant-value>^\d{5}(-\d{4})?$</constant-value>
</constant>
</global>

다음은 간단한 validation..xml 파일 입니다.

<form-validation>
<global>
<constant>
<constant-name>phone</constant-name>
<constant-value>^\(?(\d{3})\)?[-| ]?(\d{3})[-
| ]?(\d{4})$</constant-value>
</constant>
</global>
<formset>
<form name="checkoutForm">
<field
property="phone"
depends="required,mask">
<arg0 key="registrationForm.firstname.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>${phone}</var-value>
</var>
</field>
</form>
</formset>
</form-validation>


<!ELEMENT formset (constant*, form+) >

한편 <formset> 이라는 요소는 <constant>와  <form> 이라는 두개의 요소를 포함 할 수 있는데 <constant> 요소는 <global> 섹션의 <constant>와 유사하여 생략도 가능 하지만 form 요소는 한번 이상 나타나야 합니다. (<formset> 요소는 국제화를 위한 language와 country를 지원 합니다.)

<form>요소는 하나 이상의 <field>를 포함할 수 있으며 XML 형식은 다음과 같습니다.

<!ELEMENT form (field+)>

<field> 요소는 검증을 해야 할 자바빈의 특정 프로퍼티와 일치해야 하며 스트럿츠 애플리케이션에서의 자바 빈은 결국 ActionForm을 의미 합니다.

다음은 field의 속성 입니다.

property :    자바빈(혹은 ActionForm)에서 검증해야 할 프로퍼티 이름
depends :    field 요소에 적용 할 검증 규칙의 목록, 각 검증 규칙은 여러 개가 올 수 있으며 이럴경우 콤마로 구분, 검증이 이루어 지기 위해서는 모든 규칙을 만족 시켜야 합니다.
page :      자바빈이 대응 할 페이지, 자바빈은 page 속성이 속해 있는 form과 대응
indexedListProperty : 리스트를 읽어 가면서 필드를 검증 하는 경우에 이용


field 요소는 다음과 같이 여러 가지 요소를 포함 합니다.

<!ELEMENT field (msg?, arg0?, arg1?, arg2?, arg3?, var*)>

<msg> 요소는 리소스 번들의 키 값이며 이 값을 기본 메시지 대신 이용 할 수 있습니다. 즉 검증이 잘못된 경우 이 메시지의 값이 출력 됩니다. msg를 사용하지 않으면 기본적으로 등록된 메시지가 출력 됩니다.  아래와 같은 메시지…

errors.required={0} is required.
  errors.minlength={0} can not be less than {1} characters.
  errors.maxlength={0} can not be greater than {1} characters.
  errors.invalid={0} is invalid.

또한 msg는 3개의 속성이 있는데…다음과 같습니다.

name : msg요소가 사용할 검증 규칙, 반드시 validation-rules.xml 파일이나 global 섹션에 명시한 규칙 이어야 합니다.

key : 검증 실패 시 ActionError에 추가 할 수 있는 리소스 번들의 키값, resource 속성을 false로 할 경우 리소스 번들을 사용하지 않고 key 속성에 문자열을 직접 넣을 수 있습니다.

아래의 예를 참고 하세요~

<field property="phone" depends="required,mask">
<msg name="mask" key="phone.invalidformat"/>
<arg0 key="registrationForm.firstname.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>${phone}</var-value>
</var>
</field>


------------------------
Validator 플러그 인
------------------------

Validator Framework을 사용하기 위해서는 struts-config.xml에서 PlugIn 설정을 해야 합니다.

<plug-in>
className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEBINF/
validator.xml"/>
</plug-in>

스트럿츠 애플리케이션이 구동 할 때 ValidatorPlugIn 클래스의 init() 메소드가 호출되며 이 메소드가 실행 하면서 XML 파일의 Validator 리소스 들을 메모리에 적재 합니다. 

[오라클자바커뮤니티]Struts Validator 프레임워크 소개

Struts Validator 프레임워크 소개 


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


스트럿츠의 Validator 프레임워크는 특별한 검증 로직을 개발자가 프로그래밍 하지 않고 애플리케이션의 Validation Rule을 이용하여 설정 할 수 있게 해 줍니다.(사용자가 필수입력 항목에 값을 넣었는지, 값이 지정된 범위에 맞게 되어 있는지, 이메일 주소 형식이 올바른지, 우편번호 형식이 맞는지…)  마치 닷넷 프레임워크의 Validation Control과 같은 기능을 수행 합니다.  (값을 꼭 넣으세요, 나이는 0 ~99 사이 입니다, 전화번호 형식이 잘못 되었군요, E-Mail 주소 형식이 잘못 되었군요와 같은 오류를 출력 할 수 있겠죠^^)

ActionForm에서 개개 프로퍼티에 대해 분리된 검증 로직을 구현하기 위해서는 에러 발견시 수동으로 ActionErrors를 만들고 ActionErros 컬렉션에 추가하는 별도의 작업을 개발자가 해 주어야 합니다.

이러한 방식의 문제점은 애플리케이션 전체에 걸쳐 많은 검증 로직을 포함하는 각각의 ActionForm 내부에 코딩을 해야 한다는 것 입니다. 값이 꼭 입력되어야 하는 “필수입력” 이라는 것만 생각 해 보아도 이것을 개개 프로퍼티(속성) 마다 , 그리고 모든 ActionForm에 대해 기술 한다는 것은 상당한 낭비라고 생각합니다. 물론 이러한 형태는 유지 보수도 어렵게 하는 단점도 있습니다.

Validator Framework는 현재 Jakarta Comons 프로젝트의 한 부분으로 스트럿츠 메인 배포판에 포함되어 있습니다. 물론 Commons 다운로드 페이지에서도 다운 받을 수 있습니다.
(http://jakarta.apache.org/commons)

Validator Framework에는 고유한 기능들을 위한 몇 개의 패키지가 필요한데 그 중 Jakarta ORO 패지지가 가장 중요 합니다. 정규 표현식, 치환, 텍스트 분리 등의 기능을 포함하고 있습니다. 스트럿츠에서 필요로 하는 패키지는 스트럿츠의 배포판에 포함되어 있는데 commons-validator.jar와 commons-oro.jar 파일을 /WEB-INF/lib 폴더에 추가 해야 합니다. 

Validator 프레임워크는 프로그래밍이 아닌 선언을 통해 사용자의 입력 값을 검증 하는 것으로 이것은 결국 소스 외부의 어떤 검증 규칙이 있다는 것을 의미 합니다. 즉 validation-rule.xml과 validation.xml 이라는 두 개의 설정 파일을 필요로 합니다.

---------------------------------
Validator Framework에 관해
---------------------------------

- 일종의 프레임웍 컴포넌트 입니다.
- XML 파일을 통해 설정 하며, 이 파일을 통해 폼의 필드에 대한 Validation 조건을 기술 합니다.
- 날짜나 정수형과 같은 기본 데이터 타입을 위한 Validator가 제공 됩니다.
- 우편번호나 전화번호 같은 패턴 기반 검증도 가능 합니다.
- 멀티 페이지와 지역화된 검증이 지원 됩니다.
- 리소스의 최적 사용 :: JavaScript 검증 기능을 제공 하거나 서버 측의 검증을 보장 가능
- 유지보수를 한곳에서 :: 클라이언트와 서버측 검증 모두를 동일한 Configuration으로부터 생성 가능
- 확장성 :: 사용자 정의 검증은 정규 표현식이나 자바 코드를 통해 가능
- 스트럿츠와의 통합 :: 기본적으로 검증은 스트럿츠의 메시지 번들을 공유
 

--------------------------------------
Validator를 구성하는 Component
--------------------------------------

- Validator
       
기본적인 공통의 타입을 다루며 required mask, minLength, maxLength, range, native types, date, email, credit card등을 포함 합니다.

- Resource Bundle
       
        지역화된 메시지와 라벨을 제공

- XML Configuration (File)

        검증 룰에 대한 정의
       
- JSP Tag

        주어진 폼 이름과 액션 경로를 통한 JavaScript 검증을 발생 시킵니다.       

- ValidatorForm
       
자동적으로 폼빈 이름에 기반한 프로퍼티들을 검증 합니다.
(실행 시점에 ActionMapping 파라미터를 통해 validate() 메소드로 보내어진)

- ValidatorActionForm

        자동적으로 액션 경로에 기반한 프로퍼티들을 검증 합니다.
(실행 시점에 ActionMapping 파라미터를 통해 validate() 메소드로 보내어진)

2013년 7월 28일 일요일

[오라클,SQL실무,SQL튜닝,PL/SQLSQL초보에서실전전문가까지]오라클인스턴스(Oracle Instance란? )

오라클인스턴스(Oracle Instance)란?

DataBase가 시작될때 Oracle은 시스템글로벌영역(SGA)
이라는 메모리 영역을 할당하여 하나 이상의 Oracle Process를 시작합니다.
SGA와 Process를 합쳐 DataBase Instance라고 합니다. 

Instance의 memory와 process들은 database의 data를 효율적으로 관리하기 위해서 사용되며 관련 database에 대하여 하나의 user 또는 여러 user들에 의해서 이용된다.

[SGA ---> DataBase Buffer Cache, Redo Log Buffer, Share Pool등으로 구성]
자세한 부분별 설명은 다은 강좌에 이어 집니다.

Instance를 시작한다음 인스턴스에 DataBase를 Mount합니다.
다중 인스턴스가 동시에 자신의 물리적 DataBase를 Access하면서
동일한 Computer에서 실행될수 있습니다. 

Oracle병렬서버를 사용하면 다중인스턴스에 단일 데이터베이스를
마운트할수있습니다.

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)JAVA Jar 사용법

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클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