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

2015년 1월 26일 월요일

[평일야간,주말주간야간]JAVA,Network&JSP&Spring,MyBatis,Hibernate-개인부담0~20%

[평일야간,주말주간야간]JAVA,Network&JSP&Spring,MyBatis,Hibernate-개인부담0~20%
 
소수 정예 과정!!
 
자세한 교육일정/상세 및 지원방법은 아래  URL에서 확인 바랍니다.





 

강좌명JAVA,Network&JSP&Spring,MyBatis(자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지)
오라클자바커뮤니티(www.oraclejavacommunity.co.kr) 추천 실전강좌
교재자체교재 or PDF 제공(교재비 25,000원 별도)
강좌 일정상단 URL 참조
강의 장소[A강의장]구로디지털단지역2번 출구 -> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 횡단보도 건너기 --> 우회전 후 구로호텔 직전 좌측길, 호텔 바로 뒤편 파트너스타워2차 301호
[약도보기]
수강절차- 강좌내용 확인
- 전화 또는 홈페이지(www.oraclejavacommunity.com)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료- 과정당 수강료 및 환급가능금액은 상단 URL에서 참조바랍니다.
* 휴강 :법정공휴일
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
- 상단 URL에서 확인 부탁드립니다.
문의사항02-851-4790 번으로 연락 부탁 드립니다.
교육개요본과정은 단기간에 자바기반 프로그래머를 양성하기 위한 과정이며, 프로그래밍 언어의 경험이 있는 분이지만 자바를 처음하시는 분들을 위해 짧은 기간에 현장에서 필요로 하는 기술들을 최적화된 교재 및 강사를 통해 배울 수 있도록 하는 과정 입니다.

자바의 기본적인 사항부터 JDBC 프로그래밍, 자바네트워크 프로그래밍, JSP의 기본이 되는 Servlet 그리고 JSP의 기본적인 문법과 Ajax, jQuery를 통해 화면 깜박임없이 웹페이지를 역동적으로 구성할 수 있도록 배우며, 최근 가장 많이 사용되는 JAVA기반의 프레임워크인 Spring, SQL Data Mapper까지 배울 수 있는 그야말로 단기간에 자바 개발자로 가시고자 하는 분들을 위한 최적의 과정 입니다.

많은 양이라고 생각될지 모르지겠만 강사님들이 주시는 과제와 팁을 적절히 수행하고 그날그날 수업에 대해 복습을 하시면서 따라 온다면 자기도 모르는 사이에 자바 개발자로 거듭나 있을 것입니다.

감사합니다.
교육목표- 자바 문법의 이해
- 객체지향 프로그램 개발의 이해
- 자바네트워크의 이해(소켓프로그래밍, 자바RMI 프로그래밍)
- 자바 웹 개발의 이해
- Ajax, jQUERY와 같은 웹 기술에 대한 이해
- Servlet/JSP 개발에 대한 이해
- Spring3.X/4 Framework에 대한 이해
- Spring3/4 @MVC에 대한 이해
- iBATIS/MyBatis에 대한 이해
- Spring Transaction에 대한 이해
- Spring, iBATIS/MyBatis, Hibernate 연동에 대한 이해
교육대상- 자바개발자로 전향을 원하는 개발자
- 자바 초보 개발자
- 학생 및 신입 개발자
선수학습- 프로그래밍 언어 기본
 



JAVA Basic자바 언어 소개
개발환경 설치(JDK7/8, Eclipse4.3 Kepler/Luna)
기본 문법(연산자, 변수, 상수, 제어문, 반복문)
Virtual Machine 소개
JVM 메모리 영역
클래스 패스(Class Path), 설정방법
Array 이론/실습
클래스와 객체(Class & Object)
Abstarct Data Type
상속(Inheritance)과 다형성
추상클래스(Abstract Class)와 다형성
인터페이스(Interface)와 다형성
연관(Aggregation & Composition)
오버로딩(OverLoading)과 오버라이딩(Overriding)
this/super/constructor
Package 만들기 이론/실습
Java에서 예외 처리 요령
사용자 예외 처리 방법
스트림(Stream) 입출력 관련 클래스, InputStream/OutputStream,
FileInputStream/FileOutputStream
Reader/Writer등 입출력 관련 클래스
표준 입출력/FILE 처리, 객체 직렬화 이론/실습
Thread 개요
Java에서의 Process
Thread 우선순위/동기화
Thread Joining/Interrupt
JAVA8 Lambda __EXPRESSION__
JAVA8 Functional Interface
JAVA8 double colon Operator
JAVA Network ProgrammingURL/HTTP URL
URLConnection,HttpURLConnection
URL을 다루는 예제 실습(Get/Post)

Client Socket과 Server Socket의 개요
Echo Server
MultiThread EchoServer
Socket을 이용한 예제 구현

Distributed Computing(java RMI)
Distributed Computing, Object 소개
Java RMI를 이용한 “Hello World” 제작
RMI 응용예제 실습
JDBC ProgrammingConnection, Statement, ResultSet, PreparedStatement
(DML 예제 실습)
Oracle의 function, procedure 다루기
DBCP, DataSource, Connection Pool
Servlet/JSPServlet의 개요
HelloWorld Servlet
Servlet Mapping, WebServlet Annotation
Servlet의 Request, Response
Servlet에서의 Session, Cookie 다루기
JSP 기본문법
JSP 내장 객체
Java Beans
JSP에서의 Session, Cookie 다루기
JSTL, EL
MVC Model의 이해
Ajax/jQUERYAjax 개발환경 구축
왜 Ajax 인가?
Ajax의 기본 구성
XMLHttpRequest 객체
innerHTML의 사용
DOM(Document Object Model) 다루기
Ajax MVC

- jQuery 개요, 다운로드, 설치
- $(document).ready() 메소드
- Selector
- $(“*"), $("#ID"), $("DIV"),$(".classname"), $("p > a"),
- $(“elementname.classname")
- 속성 선택자, 속성(attr)
- 입력양식 필터 선택자
- 위치와 관련된 필터 선택자
- jQuery 배열(Array) 관리
- jQuery 객체 확장
- 기본 필터링 메소드
- 특정 위치 문서 객체 선택
- 문서 객체에서 특정 태그를 선택하는 방법
- innerHTML 속성과 관련된 jQuery 메서드
- 문서객체 생성 , 제거
- jQuery Event
- 이벤트 관련 메소드(발생, 제거)
- 이벤트 자동 발생
- 마우스/키보드/윈도우/입력양식 이벤트
- jQuery 기본효과, 사용자지정효과
- jQuery, Ajax 관련 메소드
- XML 문서 다루기
- 입력양식 전송
Spring3/4 FrameworkJAVA Bean vs EJB vs Spring
J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.2, Tomcat7, Spring3.2, MAVEN, STS 다운로드 및 설치)
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
Dependency Pull, CDL(Contaxtualized Lookup)
Setter/Constructor/Method Injection
DL. DI 예제를 통한 이해
Spring 설정(XML, Annotation)
Spring AOP 란 ?Code, Advice, JoinPoint,PointCut
Aspect, Weaving, ProxyFactoryBean
Annotation기반 AOP(AspectJ)
Auto Scanning 컴포넌트 (@Component,@Repository,@Service,@Contoroller)
@Resource vs @Autowired
ProxyFactoryBean을 통한 AOP 구현
AOP NAMESPACE를 통한 AOP 구현
@AspectJ Annotation을 통한 AOP 구현
Spring JDBC(이론 및 실습예제)
Spring Web MVC (이론 및 실습예제)
Spring Controller
Spring MVC Interceptor
@Controller, @RequestMapping, @SessionAttributes, @ModelAttribute
Spring4 @MVC Multiple File Upload
Spring 표현언어 SpEL
Spring Tiles 연동
Spring3/4 Transaction 관리
@Transactional Annotation, XML설정방식, 프로그래밍적 트랜잭션 처리방법의 이해
Spring Interceptor
Spring Tile연동
Spring Scheduling(Quartz연동)

Spring3/4 를 이용한 게시판 작성
- 리스트보기,글쓰기,읽기,댓글,답변글처리
- @MVC, @Controller, @RequestParam, @SessionAttibutes, @ModelAttribute 매핑 적용
- 주입(DI)를 Annotatrion으로 변경
- Spring AOP를 적용하여 게시판 DML 로깅 하기
- 스프링 게시판에 MyBatis 적용하여 SQL문을 XML안으로
iBATIS/MyBatis개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해
SqlMapClient 이해
SQL의 실행(Insert/update/delete) 이해와 실습
Spring연동
HibernateHibernate 소개
SessionFactory 설정
1:1, 1:다 매핑
Session Interface
Hibernate DML
Spring, Hibernate 예제 프로그램 작성
Hibernate 설정을 Annotation으로...@Entity, @Table, @Id, @Column
Spring, Hinernate Transaction 실습
 

 

2013년 10월 29일 화요일

자바 추상 클래스와 추상 메쏘드(Java Abstract Class, Abstract Method), 추상클래스와다형성 Abstract

자바 추상 클래스와 추상 메쏘드(Java Abstract Class, Abstract Method), 추상클래스와다형성

Abstract 클래스

객체를 생성할 수 없다
어떠한 클래스를 만들기 위해 미리 정의해 둔 클래스의 틀.
 앞에서 작성한 Employee(직원)클래스와 직원의 하위 클래스를 예로 든다면 직원이라는 클래스는 프로그래머(Programmer), 디자이너(Designer) 등을 만들기 위해 작성된 클래스라고 할 수 있다. 사실 직원이라는 클래스는 실제 회사의 프로그램을 개발한다고 했을 때 사용해서는 안 되는 클래스라고 할 수 있다. 왜냐하면 A라는 회사에 직원 중 어느 부서에 해당되지 않고 자기 마음대로 회사를 출근하고 퇴근하는 직원은 존재하지 않을 것이기 때문이다. 하지만 Employee 라는 클래스가 존재하는 이상 일반 사용자에게 메뉴얼을 작성해 “Employee 클래스는 다른 특정직원 클래스를 만들기 위한 클래스입니다.”라고 하기 전에는 Employee의 본래의미를 모르고 Employee 의 객체를 생성하여 사용할 수 있다. 즉 다음과 같은 소스 코딩을 막을 수 없다.
         Employee e = new Employee("홍길동", “12345");        
         s1.gotoTheOffice();

만약 Employee 클래스는 사용하기 보다는 다른 클래스에 상속하여 새로운 직원 클래스를 만드는 것이 바람직하다는 의미를 소스 코드에 부여한다면 개발자의 Employee 클래스 개발 의도를 사용자가 쉽게 알 수 있게 될 것이다. 이 때 사용되는 키워드가 abstract 키워드이다. 이 키워드가 클래스에 붙으면 이 클래스는 추상클래스라는 의미이다
앞서 작성한 Emplopyee 클래스에는 없지만 이를 상속받은 모든 클래스에서 정의하고 재정의하여 사용하고 있는 startJob 이라는 메소드를 Employee에서 추상메소드로 선언하여 정의할 수 있다
상속의 개념으로만 본다면 이러한 추상클래스는 굳이 만들 필요가 없다. 추상클래스가 아니더라도 위와 같은 상속과 메소드의 재정의는 얼마든지 가능하기 때문이다. 하지만 수퍼타입(super type)을 이용한 다형성(Polymorphism)의 측면에서 추상클래스(Abstract Class)는 유용하게 쓰일 수 있다.

A라는 직원이 회사에 입사했는데 처음에는 디자인팀에 있다가 얼마 후 프로그램개발팀로 소속을 옮기게 되었다. 그러다가 경력을 쌓아 프로그램개발팀장으로 까지 진급하게 되었다. 이렇게 한 사람의 직원은 시간에 따라 때로는 상황에 따라 여러가지 모습으로, 여러가지 업무를 담당하게 된다. 바로 이런 것을 가능하도록 객체를 설계하는 것이 바로 다형성의 구현이다. 즉 실생활의 회사 직원처럼 상황과 시간에 따라 여러가지 모습을 지니는 다형성을 구현할 수 있게 되는 것이다. 모든 직원의 하위클래스들을 수퍼 타입(상위클래스)로 형변환하면 가능하다.
적어도 하나의 추상 메소드(abstract method)를 가진다.
추상 메소드란 메소드 이름은 정의되어 있는데 본체는 구현되어 있지 않은 것이다.
클래스가 추상 메소드를 가지면 그 클래스는 abstract 로 선언되어야 한다.
객체가 가지는 특성들을 추상화 했을 뿐 아직 구체화 시키지 못한 클래스 이므로 이 추상 클래스를 상속하는 하위클래스에서 구체화 시키도록 하는 것이다.
만약 어떤 추상 클래스를 상속한 클래스에서 상위 클래스의 추상 메소드를 완전히 구현하지 못했다면 하위 클래스 역시 추상 클래스 이다.
 
[추상 클래스를 이용한 다형성 구현 예제]
 
package onj;
//Employee.java
abstract class Employee {
  String name, id;
  public Employee(String name, String id) {
      this.name = name;   
      this.id = id;
  }
  public void gotoOffice() {
      System.out.println(name+"님 출근하였습니다...");
  }
  public void gotoHome() {
      System.out.println(name+"님 퇴근하였습니다...");
  }
  abstract public void startJob();
}
 
//Programmer.java
class Programmer extends Employee {  
  private int techGrade; //기술자 등급 1, 2, 3, 4
  public Programmer(String newName,String newID, int newTechGrade) {
         super(newName, newID);       this.techGrade = newTechGrade;
  }
  public void startJob() {
 System.out.println(super.name + " 님이 S/W개발업무를 시작합니다.");
  }
 public void dispGrade() {
 System.out.println(super.name + " 님 기술자 등급 : " + techGrade);
 }
}
 
//Designer.java
class Designer extends Employee {   
  private String majorTech; //주 사용기술
  public Designer(String newName,String newID, String newMajorTech) {
      super(newName, newID);      this.majorTech = newMajorTech;
  }
  public void startJob() {
      System.out.println(super.name + " 님이 디자인 업무를 시작 합니다.");
  }
 public void dispMajorTech() {
      System.out.println(super.name + " 님의 주 사용기술은 : " + majorTech );
 }
}

//Polymorphism.java
class PolymorphismTest {
  public static void main(String args[]) {          
    Employee p = new Programmer("오엔제이","028514790",1);
    Employee d = new Designer("오라클자바커뮤니티","028514790","오라클자바");
    p.gotoOffice(); p.startJob();
    p.gotoHome(); ((Programmer)p).dispGrade();
    d.gotoOffice(); d.startJob();
    d.gotoHome(); ((Designer)d).dispMajorTech();
  }
}

[결과]

오엔제이님 출근하였습니다...
오엔제이 님이 S/W개발업무를 시작합니다.
오엔제이님 퇴근하였습니다...
오엔제이 님 기술자 등급 : 1
오라클자바커뮤니티님 출근하였습니다...
오라클자바커뮤니티 님이 디자인 업무를 시작 합니다.
오라클자바커뮤니티님 퇴근하였습니다...
오라클자바커뮤니티 님의 주 사용기술은 : 오라클자바


[개강확정강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)

[주간]
  [11/4]Spring3.X, MyBatis, Hibernate실무과정
  [11/6]SQL초보에서실전전문가까지

[평일야간]
  [11/1]C#,ASP.NET마스터
  [11/5]iPhone 하이브리드 앱 개발 실무과정
  [11/7]JAVA&WEB프레임워크실무과정
  [11/8]Spring3.X, MyBatis, Hibernate실무과정
[주말]
  [11/2]C#,ASP.NET마스터
  [11/2]Spring3.X, MyBatis, Hibernate실무과정
  [11/2]JAVA&WEB프레임워크실무과정
  [11/9]안드로이드개발자과정
 


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월 6일 일요일

[자바1.7,JAVA7]파일시스템의 변화감시,모니터링, 자바7, 자바NIO

[자바1.7,JAVA7]파일시스템의 변화감시,모니터링, 자바7, 자바NIO, java.nio
 
아래 예제는 자바7, JAVA1.7의 NIO를 이용하여 데몬처럼 떠있으면서 파일시스템의 파일의 변화 등을 감지할 수 있는 예제 입니다. 많은 활용 바랍니다.
by 오라클자바커뮤니티, 오엔제이실무프로그래밍교육센터
 
import java.io.*;
import java.nio.file.*;
public class FileChange
{
   public static void main(String args[]) throws IOException, InterruptedException
   {
      monitoringDir("c:\\java");  
   }
   
   static void monitoringDir(String dir) throws IOException, InterruptedException
   {
    
       WatchService myWatchService = FileSystems.getDefault().newWatchService(); 
       
       //모니터링을 원하는 디렉토리 Path를 얻는다.
       Path path = Paths.get(dir); // Get the directory to be monitored       
      
       
       //모니터링 서비스를 할 path에 의해 파일로케이션을 등록
       WatchKey watchKey = path.register(myWatchService, 
            StandardWatchEventKinds.ENTRY_CREATE,
            StandardWatchEventKinds.ENTRY_MODIFY,
            StandardWatchEventKinds.ENTRY_DELETE); // Register the directory
       
       //무한루프
       while(true)
       {
       //변화가 감지되는 경우 이벤트 종류와 파일명을 출력
          for (WatchEvent event : watchKey.pollEvents())
          {
             System.out.println(event.kind() + ": "+ event.context()); 
          }
         
          
           //* Resets this watch key.
           //* @return  {@code true} if the watch key is valid and has been reset 
           //*          {@code false} if the watch key could not be reset because it is
           //*          no longer {@link #isValid valid}, 디렉토리등이 삭제되는 경우           
          if (!watchKey.reset())
          {
             break; // 디렉토리등이 삭제되는 경우
          }
       }
   }
}

[결과 c:\java 폴더의 a.java를 b.java로 수정 후]
 
ENTRY_DELETE: a.java
ENTRY_CREATE: b.java
ENTRY_MODIFY: b.java

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









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"); 
//--------------------------------------------------------------------------------