레이블이 자바SQL인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바SQL인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 28일 월요일

자바 익명 클래스(java annoymous class) 이름이 없이 포함된 클래스

자바 익명 클래스(java annoymous class)
 
이름이 없이 포함된 클래스(일단 new 해놓고 그 안에서 클래스 정의를 구현)
이름이 없다는 점을 제외하면 지역 클래스와 유사 하다.
형식 : new 클래스이름(인터페이스 이름) (…) {…}
제공된 클래스나 인터페이스의 익명 하위 클래스를 정의한 후 그 하위 클래스의 객체를 생성하고 그 참조 값을 반환 한다.
New 수식이 올 수 있는 곳 어디든지 사용 가능하다.
생성자를 정의 할 수 없다.
쓰레드나 리스너 제작할 때 많이 사용한다.

익명 클래스는 new 수식의 연장 이므로 반드시 세미콜론(;)을 붙여야 한다.
익명 클래스를 포함하고 있는 메소드의 지역 변수중 final로 선언된 변수만 참조 가능하다.
해당 클래스나 인터페이스를 정의하여 사용 할 때 여러 곳에서 사용되는 것이 아니라 단 한번만 정의해서 사용 하는 경우에 유용하다.

[예제]
 
interface MyRunnable
{    public void run();  }
class LocalClassExam
{  
    String str;
    LocalClassExam(String str) {
        this.str = str;
    }
   
    //getRunnable 메소드 안에 Command 클래스 정의, local class
    //int i를 final로 정의안하면 run()안에서 사용불가
    MyRunnable getRunnable(final int i) {
        //아래 new 다음에 인터이스가 와도 됨 물론 클래스도된다.
     return new MyRunnable() {     
            public void run() {
                System.out.println( str + ", " + i );  //로컬변수 i는 final 임
            }
        };      
    }
    public static void main(String[] args) {
     LocalClassExam obj = new LocalClassExam( "OnJOracleJava" );
        MyRunnable run1 = obj.getRunnable(1);
        run1.run();
        MyRunnable run2 = obj.getRunnable(2);
        run2.run();
    }
}
 
[결과]
 
OnJOracleJava, 1
OnJOracleJava, 2

자바 익명 클래스(java annoymous class) 이름이 없이 포함된 클래스

자바 익명 클래스(java annoymous class)
 
이름이 없이 포함된 클래스(일단 new 해놓고 그 안에서 클래스 정의를 구현)
이름이 없다는 점을 제외하면 지역 클래스와 유사 하다.
형식 : new 클래스이름(인터페이스 이름) (…) {…}
제공된 클래스나 인터페이스의 익명 하위 클래스를 정의한 후 그 하위 클래스의 객체를 생성하고 그 참조 값을 반환 한다.
New 수식이 올 수 있는 곳 어디든지 사용 가능하다.
생성자를 정의 할 수 없다.
쓰레드나 리스너 제작할 때 많이 사용한다.

익명 클래스는 new 수식의 연장 이므로 반드시 세미콜론(;)을 붙여야 한다.
익명 클래스를 포함하고 있는 메소드의 지역 변수중 final로 선언된 변수만 참조 가능하다.
해당 클래스나 인터페이스를 정의하여 사용 할 때 여러 곳에서 사용되는 것이 아니라 단 한번만 정의해서 사용 하는 경우에 유용하다.

[예제]
 
interface MyRunnable
{    public void run();  }
class LocalClassExam
{  
    String str;
    LocalClassExam(String str) {
        this.str = str;
    }
   
    //getRunnable 메소드 안에 Command 클래스 정의, local class
    //int i를 final로 정의안하면 run()안에서 사용불가
    MyRunnable getRunnable(final int i) {
        //아래 new 다음에 인터이스가 와도 됨 물론 클래스도된다.
     return new MyRunnable() {     
            public void run() {
                System.out.println( str + ", " + i );  //로컬변수 i는 final 임
            }
        };      
    }
    public static void main(String[] args) {
     LocalClassExam obj = new LocalClassExam( "OnJOracleJava" );
        MyRunnable run1 = obj.getRunnable(1);
        run1.run();
        MyRunnable run2 = obj.getRunnable(2);
        run2.run();
    }
}
 
[결과]
 
OnJOracleJava, 1
OnJOracleJava, 2

2013년 10월 27일 일요일

[JAVA다향성재정의]자바 다형성(java polymorphism), 메소드재정의, 다중정의(method overrding, method overloading)

[JAVA다향성재정의]자바 다형성(java polymorphism), 메소드재정의, 다중정의(method overrding, method overloading)
 
1. 다형성이란?
 
서로 다른 객체가 같은 메시지에 대하여 서로 다른 방법으로 응답할 수 있는 기능을 이야기 한다.
의미(semantics)는 하나지만 실제 형태는 여러 가지가 될 수 있다는 말이다. 예를 들면, "열다"는 우리는 충분히 이해할 수 있다. 그러나, 실제적으로 "여는 형태"는 많다. 창문을 여는 형태, 강의실 문을 여는 형태, 현관 문을 여는 형태 등 의미는 하나지만 실제적인 형태는 상당히 많을 수 있는 것이다. 
다형성은 프로그램에서 특별한 연산자나 키워드가 있는 것이 아니며 객체지향 프로그래밍 언어에서 "오버로딩 (overloading)", "오버라이딩 (overriding)"의 형태로 나타난다. 
상위 클래스에 정의된 메소드와 동일한 형태의 메소드를 하위 클래스에 정의
동적 메소드 바인딩에 기반한다.
동적 메소드 바인딩에는 어떤 메소드를 호출할 지 컴파일 시 지정하지 않고 실행  시에 동적으로 결정된다.
코드에는 호출할 주소가 아닌, 어떤 메소드를 호출해야 하는지 전체 이름이 적혀있고 JVM은 이걸 보고 힙영역의 객체를 뒤져 적절한 메소드를 호출한다.
그러므로 어느 객체의 어느 메소드가 호출될 지 컴파일 시에는 알 수 없고 단지 타입 정보에만 의존하여 에러 체킹을 한다.
상위 클래스의 일부 메서드가 하위 클래스에 적합하지 않을 경우 하위 클래스에서 해당 메서드만 재정의
추상클래스 등에서 상속받는 모든 하위클래스에서 반드시  정의해야되는 메서드에 대해 그 프로토타입 만을 추상 메서드로 정의하고 이를 상속하는 클래스에서 메서드 재정의
재사용 가능한 강력한 인터페이스 구축
메서드 오버라이딩되면 Super 클래스의 메서드가 가려지게되고 이 경우 super를 사용하면 Super클래스의 메서드를 사용
 
2. method overriding(메서드 재정의) 규약

인스턴스 메서드일 것(static붙어 있는 메소드는 안된다.)
메서드의 이름, 매개변수개구, 매개변수타입, 리턴형이 일치 할 것
메서드의 접근 제어자가 public 또는 protected 일것
protected : 하위 클래스에서 호출하거나, 오버라이드 할 수 있는 접근제어자. 하위 클래스가 아닌 다른 클래스는 호출하지 못한다.
private 일 경우 재정의 할 수 있다.
 
3. 메소드 중복정의, 다중정의(method overloading)

동일한 클래스 내에서 같은 이름의 메소드를 중복  정의하여 다형성을 지원
메서드 이름은 동일하나 매개변수의 TYPE, 매개변수의 개수가 다를 것
 
4. 메소드 재정의 (method overriding)

상속 관계에 있는 클래스간에 메소드를 중복 정의하여 다형성을 지원
즉, 메소드 오버라이딩을 이용하면 하위 클래스에서 동일 이름의 메소드를 새롭게 정의 가능
매개변수의 형이나 매개변수의 수 모두 동일해야 함

5. 다형성의 개념이 적용되는 곳
 
상속(Inheritance)
중복(다중)정의(Overloading)
재정의(Overriding)
Upcasting(상위클래스로 형변환)
Abstract의 상속과 Interface의 구현
 

[예제]
상속과 메소드 재정의를 이용한 다형성
 
class DrawObj {
 void draw() {}
}
class Circle extends DrawObj {
 void draw() {
  System.out.println("원을 그립니다.");
 }
}
class Line extends DrawObj {
 void draw() {
  System.out.println("선을 그립니다.");
 }
}
......
......
......
DrawObj[] objs = new DrawObj[10];
Objs[0] = new Circle();
Objs[1] = new Line();
Objs[2] = new PolyLine();
Objs[3] = new Rectangle();
. . .
Objs[9] = new Line();
//각 draw메소드가 Circle, Line..에 따라 다르게 표현된다.
for(int i = 0; i < objs.length; i++)
    objs[i].draw();

2013년 10월 21일 월요일

자바객체복제(cloneable 예제) 간단히 만든 java clone 예제 입니다.

자바객체복제(cloneable 예제)

간단히 만든  java clone 예제 입니다. 따라해 보세요 
package onj;
class Person extends Object implements Cloneable  {
String name;   //인스턴스변수
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Person p = new Person();
p.name = "홍길동";
Person p2 = (Person)p.clone();
System.out.println("p2.name" + p2.name);
}

2013년 8월 2일 금요일

Java Template Method 패턴 예제 , java design pattern

Java Template Method 패턴 예제   


Template Method Pattern
 

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

상위클래스 쪽에 템플릿이 되는 메소드가 정의되어 있고 , 그 메소드의 정의내에는 추상메소드가 사용되너 상위클래스만 보면 추상메소드가 어떤식으로 호출되는지 알수있지만 최종적으로 어떤 처리를 하는지 모른다.
 하위클래스에서 어떠한 처리를 하는지에 관계없이 큰 틀은 상위클래스가 결정한데로 처리된다. 실제로 어떤일을 하는지는 하위클래스의 구현된 내용을 봐야 한다.
 상위클래스의 템플릿 메소드에 알고리즘이 기술되어 있으므로 하위클래스에서는 알고리즘을 일일이 기술할 필요가 없다. (개개의 하위클래스에 일일이 알고리즘을 기술한다면 수정사항이 발생되면 일일이 개별 하위클래스를 수정해야 한다.)


// AbstractDisplay.java
public abstract class AbstractDisplay { 
    public abstract void open();       
    public abstract void print();       
    public abstract void close();       
    public final void display() {     
        open();                           
        for (int i = 0; i < 5; i++) {     
            print();                   
        }
        close();                           
    }
}

// GreetingDisplay.java
public class GreetingDisplay extends AbstractDisplay { 
    private String s;                               
    public GreetingDisplay(String s) {    this.s =s;              }
    public void open() {                         
        System.out.println("hello " + s);                 
    }
    public void print() {                           
        System.out.println("your name is " + s);                     
    }
    public void close() {                         
        System.out.println("bye~ " + s);               
    }
}
// StringDisplay.java
public class StringDisplay extends AbstractDisplay {   
    private String string;                             
    private int width;                                 
    public StringDisplay(String string) {             
        this.string = string;                         
        this.width = string.getBytes().length;         
    }
    public void open() {    printLine();    }
    public void print() {  System.out.println("|" + string + "|");    }
    public void close() {  printLine();      }
    private void printLine() {                   
        System.out.print("+");                   
        for (int i = 0; i < width; i++) {  System.out.print("-");      }
        System.out.println("+");               
    }
}
// Main.java
public class Main {
    public static void main(String[] args) {
        AbstractDisplay d1 = new GreetingDisplay("이종철");                 
        AbstractDisplay d2 = new StringDisplay("Hello, world.");   
        AbstractDisplay d3 = new StringDisplay("안녕하세요~");   
        d1.display();                                               
        d2.display();                                               
        d3.display();                                               
    }
}  

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)); 
    } 
  } 


(Static Member, Field)클래스멤버 - 클래스변수(필드)/클래스메소드

클래스필드(변수)
 클래스의 인스턴스가 아니라 그것이 정의된 클래스와  연관된다.
 static 한정자는 이 변수(필드)가 클래스필드임을 의미
 상수를 정의하는것이 클래스필드의 일반적인 사용이다.
  public static final double PI=3.14159;
  모든 클래스 필드가 상수인것은 아니다. Static만 기술하고 
  final은 빠질수도 있다.
 정적필드의 복사본은 오직 한 개 존재하며 전역변수
 같은 클래스 내부에서는 PI로 지칭되며 클래스 외부에서
  해당 변수(필드)를 유일하게 지칭하기 위해서는 클래스.PI 
   
 클래스메소드
 static 한정자로 선언된다. 
  public static double radiansToDegree(double rads)
- 객체가 아니라 클래스와 연관
  클래스의 외부에서 메소드를 호출하기 위해서는 클래스.메
  소드 형태로 가리킨다.
  double d = Circle.radiansToDegree(2.0);
  물론 그 클래스 내부에서는 클래스 이름을 지정할 필요가
  없다
 자신의 클래스의 모든 클래스변수(필드)와 클래스 메소드 
  를 사용할수 있다. 인스턴스 필드(변수)나 인스턴스 메소드
  는 사용할수 없다.

2013년 7월 28일 일요일

[오엔제이프로그래밍,오라클,SQL,튜닝 실무교육,오라클마스터과정]오라클 프로세스(Oracle Process)란

Oracle 프로세스 구조는 다중 작업이 발생하는 방법과 다중 작업이 수행되는 방식을 정의 하므로 매우 중요합니다. 


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



A.단일 프로세스 Oracle Instance :단일 사용자 Oracle은 하나의 프로세스가 모든 Oracle Code를
실행하는 시스템입니다. Oracle의 일부분과 Client응용프로그램을 분리하여 실행하는데 다른
프로세스를
사용하지 않습니다.대신 Oracle의 모든 코드와 단일사용자의 데이터베이스 응용 프로그램은 단일
프로세스에 의해 실행됩니다.

B.다중 프로세스 Oracle Instance : 다중사용자 Oracle은 여러 개의 프로세스가 Oracle의 각기
다른 부분을 실행하고 접속한 각사용자들은 개별 프로세스를 실행합니다.

C.다중 사용자 환경에서의 Oracle 프로세스
1. 데이터베이스 기록자(DBWR)
  -  DataBase Buffer의 내용을 데이터 파일에 기록하는 역할을 하며 DataBase Buffer Cache를
관리하는 Oracle BackGround 프로세스임
  -  DataBase Buffer Cache에 있는 내용이 수정되면 해당 버퍼는 'Dirty'로 표시되는데 이
Dirty Buffer를 Disk에 기록하여 Buffer Cache를 깨끗한 상태로 유지하는 역할을 함
  -  LRU 알고리즘에 의해 최근에 사용된 데이터블록을 메모리에 유지합니다.
  -  Buffer Cache는 Multi Latch를 자지는데 래치는 공유 데이터구조를 보호하는 자동내부
잠금입니다. DB_BLOCK_LRU_LATCHES라는 Parameter는 시스템에 구성되는 래치수
    와 기본적으로 CPU에 설정되는 Latch 수를 제어합니다.
  -  서버프로세스가 Buffer를 Dirty목록으로 이동시킨후 Dirty목록이 임계길이에 도달했음을
발견하면 Server 프로세스는 DBWR에 신호를 보냅니다.
  -  체크포인트가 발생하면 LGWR(로그기록자)는 DBWR에 신호를 보냅니다. 즉 Check Point가
발생하면 LGWR는 디스크에 기록되어야 하는 수정된 Buffer 목록을
    지정합니다. DBWR는 디스크에 지정된 Buffer의 내용을 기록합니다.

2.  로그기록자(LGWR)
- Redo Log Buffer를 디스크에 있는 Redo Log File에 등록합니다.
- 사용자 프로세스가 Transaction을 Commit할때의 Commit Record및 매3초 마다의 Redo Log
 buffer, DBWR가 수정된 버퍼를 디스크에 기록할때의 Redo Buffer의 내용등을 기록합니다.

- 사용자가 Commit명령을 발생시키면 LGWR는 Commit Record를 즉시 Redo Log Buffer에 넣지만
해당 데이터 버퍼의 변경은 변경사항을 데이터 파일에 기록하는 것이
  더 효율적일때까지 지연됩니다.

3 체크포인트(CKPT)
- Check Point가 발생하면 Oracle은 모든 DataFile의 Header를 갱신하여 체크포인트임을
나타내야 합니다. 보통 LGWR가 이러한 작업을 수행하지만 체크포인트가 시스템 Performance를
저하 시킨다면 CKPT를 활성화하여 체크포인트 수행작업을 LGWR가 수행하는 다른 작업과 분리할
수 있습니다.
-  체크포인트가 모든 응용프로그램에 꼭 필요한 것은 아니며 DataFile의 수가 많아 Check
Point중에 LGWR프로세스 성능이 저하되면 CKPT프로세스를 활성화 할수있다.
- 초기화 Parameter CHECK_POINT_PROCESS는 CKPT프로세스를 활성화 하거나 비활성화 합니다.

4. 시스템모니터(SMON)
- 인스턴스 시작시에 인스턴스의 복구를 수행, 더 이상 사용하지 않는 임시 Segment를 삭제하며
사용 가능한 빈영역을 더 큰 블록으로 만들기위해 인법한 빈 확장영역을 하나로 통합합니다.

5. 프로세스모니터(PMON)
- 사용자 프로세스에 장애가 발생하면 프로세스 복구를 수행,Cache를 비우고 해당 프로세스가
사용한 자원을 해제하며,활성 Transaction의 Table상태를 재설정하고 Lock을 해제하며 Active
Process목록에서 ID를 제거한다.
- 주기적으로 Dispatch와 서버 프로세스의 상태를 점검하고 활동중이 아니면 재시작합니다. 
 
6. 복구자(RECO)
- 분산 Transaction을 포함한 장애를 자동으로 해결하는 분산 Option과 함께 사용되는 프로세스,
시스템이 분산 트랜잭션을 허용하고 DISTRIBUTED_TRANSACTIONS가 0보다 클때만 존재합니다.

7. 아카이브(ARCH)
- Online Redo Log File이 꽉차면 이를 지정된 저장장소에 저장,Redo Log가 Archive Mode에서
운영되고 자동 Archiving기능이 활성화 되어 있을 때만 존재합니다.

8. 잠금(LcKn)
- 병렬서버 옵션에서 최대 10개 까지의 잠금Process(LCK0~LCK10)가 인스텀스의 Lock을 제공합니다.
그러나 대부분의 병렬서버 시스템에서는 하나의 LCK프로세스(LCK0)만
  으로도 충분합니다.

9. 스냅샷갱신(SNPn)
- 분산 옵션에서 최대 10갸 까지의 스냅샷갱신프로세스(SNP0~SNP10)가 자동으로 Table SnapShot을
화면에 다시 표시합니다.

10. 디스패쳐(Dnnn)
- 디스패쳐 프로세스를 사용하면 사용자 프로세스는 제한된 수의 서버 프로세스를 공유할 수
있습니다. 디스패쳐가 없다면 각 사용자 프로세스는 하나의 전용(Dedicated)서
  버 프로세스를 필요로 합니다. 그러나 Multi Thread Server에서는 동일한 수의 사용자에
대해 더 적은 수의 공유서버 프로세스를 필요로 합니다.
- 단일 DataBase Instance에 대해 다중 Dispatcher 프로세스를 생성할 수 있습니다. Oracle을
사용하는 시스템의 Network Protocol에 대해 적어도 하나의 디스페처가 생성되어야 합니다. DBA는
프로세스당 접속수에 대한 OS의 한계에 따라 가장 적합한수의 디스패처를 시작해야 하며
인스턴스가 실행되는 동안 디스패처 프로세스를 추가또는 삭제할수 있다.

- 인스턴스가 시작되면 Listener는 사용자를 Oracle과 접속시키는 통신경로를 설정하며,
각 디스패처는 리스너에 접속 요구사항을 수신할 수 있는 주소를 부여합니다.
사용자 프로세스가 접속을 요구하면 리스너는 요구사항을 점검하고 사용자가 디스패처를 사용할 수
있을지에 대해 결정합니다. 사용할 수 있을 경우 리스너는 로드할 양이 가장적은 디스패처 주소를
돌려주며 사용자 프로세스는 디스패처에 직접 접속됩니다.