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

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

[JAVA TIP]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)

[JAVA TIP]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)
 
예제를 보시면 이해가 되리라 생각 합니다.
참고하시구요, 열공 하세요.
 
//
//  @Java Tip
//  @author 오라클자바커뮤니티, 오엔제이프로그래밍
//  @Desc : java.util.Arrays 클래스의 sort메소드를 이용한 정렬
// 
package onj;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

public class ArraySortExam {
 public static void main(String[] args) {
  String[] myArray = { "c", "a", "b" };
  // 일단 그냥 출력 해보자. c, a, b 순으로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // Ascending Sort, 오름차순 정렬
  Arrays.sort(myArray);
  // a, b, c로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // 이번에는 내림차순(Descending) 졍렬
  Arrays.sort(myArray, Collections.reverseOrder());
  // c, b, a로 출력
  for (String s : myArray) {
   System.out.println(s);
  } 

2013년 10월 19일 토요일

JAVA JNDI를 이용한 DNS 서비스 구현 JNDI란 자바로 만들어진 프로그램이 Naming 및 Directory 서비스에 접근할 수 있도록 제공되는 API 입니다.

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

 JNDI란 자바로 만들어진 프로그램이 Naming 및 Directory 서비스에 접근할 수 있도록 제공되는 API 입니다.
 
즉 자바 응용 프로그램이 어느 위치에 있든지 필요한 자바 객체들을 검색할 수 있는 것입니다. 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 서비스를 통해 네이밍 서비스를 받을 수 있도록 지원 했는데 아래는 그 예제 입니다.
 
아래예제는 www.onjprogramming.co.kr에 대한 DNS 서비스를 받아 오는 예제 입니다.
 

import java.util.Hashtable;
import javax.naming.directory.*;
import javax.naming.NamingEnumeration;
public class JNDIExample {
 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("www.onjprogramming.co.kr");
   
   //질의 결과 출력
   NamingEnumeration ne = attribute.getAll();
   System.out.println("www.onjprogramming.co.kr --> ");
   while(ne.hasMoreElements()) {
    System.out.println(ne.next());
   }
  }
  catch(Exception e) {
   e.printStackTrace();
  }
  
 }
}
 
[결과]
java.sun.com --> 
A: 209.249.116.141

2013년 8월 8일 목요일

[오라클자바커뮤니티, 자바교육]스트럿츠에서의 파일 업로드 Example 입니다.(struts file upload)

스트럿츠에서의 파일 업로드 Example 입니다.(struts file upload)


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



스트럿츠의 폼에서 File을 인식하기 못하기 때문에

org.apache.struts.upload.FormFile 클래스를 사용하여야 합니다.

제가 작업하던중 스트럿츠의 파일 업로드에 사용한 소스입니다.

궁금하신 점은 답글 남겨주시거나 메일 보내주시면 대답해 드리겠습니다. ^^


///////////////// image_insert.jsp/////////////////////////////////////


<%@ page contentType="text/html;charset=EUC-KR" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>


<html:form action="/ImageInsert" enctype="multipart/form-data" >
  <table>
    <TR bgcolor=FFFFFF>
                      <TD height="30" bgcolor='#E6EBF0'>* 이미지(대)</TD>
                      <TD colspan="2">
                        <html:file property="image_path[0]" size="30"/>       
                      </TD>
                    </TR>
                    <TR bgcolor=FFFFFF>
                      <TD height="30" bgcolor='#E6EBF0'>* 이미지(중)</TD>
                      <TD colspan="2">
                        <html:file property="image_path[1]" size="30"/>               
                      </TD>
                    </TR>
                    <TR bgcolor=FFFFFF>
                      <TD height="30" bgcolor='#E6EBF0'>* 이미지(소)</TD>
                      <TD colspan="2">
                        <html:file property="image_path[2]" size="30"/>               
                      </TD>
                    </TR>
  </table>
</form:html>

///////////////////struts-config.xml///////////////////////////////////

<form-beans>
  <form-bean name="imageinsertForm" type="ImageInsertForm"/>
</form-beans>

<action-mappings>
  <action         
                path="/ImageInsert"
                type="ImageInsertAction"
            name="imageinsertForm"                       
            validate="false"
            input="/image_insert.jsp"
        />

///////////////////ImageInsertForm.java///////////////////////////////

import org.apache.struts.upload.FormFile;
public class ImageInsertForm  extends ActionForm
{

    private FormFile[] image_path = new FormFile[3];
   
    public FormFile[] getImage_path() {
                return image_path;
        }
        /**
        * @param image_path The image_path to set.
        */
        public void setImage_path(FormFile[] image_path) {
                this.image_path = image_path;
        }
}       

////////////////////ImageInsertAction.java/////////////////////////////

import org.apache.struts.upload.FormFile;

public class GoodsInsertAction extends BaseAction
{
        public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
        {
                  FormFile image_path[] = ((ImageInsertForm)form).getImage_path();
                  ImageDAO imageDAO = new ImageDAO();
                  imageDAO.imageInsert( image_path );
                 
                  return (mapping.findForward( "image_insert_success" ));
        }
}

/////////////////////////// GoodsFile.java////////////////////////////
/**
 * @author Administrator
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class GoodsFile
{
        private String fileName = null;
        private String tempFileName = null;

        public String getFileName() {
                return fileName;
        }
       
       
        public String getTempFileName() {
                return tempFileName;
        }
       


        public void setFileName(String fileName) {
                this.fileName = fileName;
        }



        public void setTempFileName(String tempFileName) {
                this.tempFileName = tempFileName;
        }
}

////////////////////ImageDAO.java///////////////////////////////////

import org.apache.struts.upload.FormFile;

public class ImageDAO
{

    public  void imageInsert( FormFile[] image_path )
    {
        Connection con=null;
        PreparedStatement pstmt=null;
        ResultSet rs = null;
        String sql = "";
        GoodsFile goodsFile[] = new GoodsFile[ 3 ];
        String path = "D:\\upload";

        try
        {
                for( int i = 0 ; i < 3 ; i++ )
                {
                        goodsFile[ i ] = FileUploadUtil.doFileUpload( image_path[ i ] , gcode , Integer.toString( ( i + 1 ) ) );
                }

                con = DriverManager.getConnection(ConnectionPoolManager.URL_PREFIX+"oraclejava");
               
                sql = "INSERT INTO IMAGES( IMAGE_PATH1 , IMAGE_PATH2 , IMAGE_PATH3 ) VALUES(  :IMAGE_PATH1 , :IMAGE_PATH2 , :IMAGE_PATH3 );
                pstmt = con.prepareStatement(sql);
                pstmt.setString( 1 , goodsFile[ 1 ].getFileName()  );
                    pstmt.setString( 2 , goodsFile[ 2 ].getFileName() );
                    pstmt.setString( 3 , goodsFile[ 3 ].getFileName() );
                pstmt.executeUpdate();
 
                }
        catch( Exception e )
        {
                return null;
        }
        finally
        {
                    try
                {

                    if ( rs != null )
                        rs.close();
                    if ( pstmt != null )
                        pstmt.close();
                    if ( con != null )
                        con.close();
                }
                catch ( Exception ignore )
                {
               
        }         
    }
}


///////////////////////FileUploadUtil.java/////////////////////////////
ublic class FileUploadUtil
{
        public static GoodsFile doFileUpload(FormFile fileList  )
        throws FileNotFoundException, IOException
        {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                InputStream stream = fileList.getInputStream();

                               

                //파일을 업로드할 절대 경로를 지정해야 한다.
                String path = "D:\\upload\";
                OutputStream bos = new FileOutputStream( path + fileList.getFileName()  );
                int bytesRead = 0;
                byte[] buffer = new byte[8192];
                while ((bytesRead = stream.read(buffer, 0, 8192)) != -1)
                {
                        bos.write(buffer, 0, bytesRead);
                }
                bos.close();
                stream.close();

        GoodsFile boardFile = new GoodsFile();
        boardFile.setFileName(fileList.getFileName());
        boardFile.setTempFileName(fileList.getFileName() );

        return boardFile;
}
[출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecStruts&wr_id=64

자바 AWT에 관하여

이번강좌에서는  AWT(Abstract Windows Toolkit) 프로그래밍에 대해 알아 보겠습니다.

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





AWT (Abstract Window Toolkit) 프로그래밍

- 윈도우 프로그래밍을 위한 UI 컴포넌트와 보조라이브러리를 모아놓은 툴 킷을 말합니다.
- 모든 윈도우 Component는 Component Class(자바 AWT의 모든 Component들이 가져야 하는 속성과 메소드를 가지고 있슴)로 부터 상속 을 받습니다.
- 이들 Component는 두가지로 구분되는데 다른 Component를 자신안에 둘수 있는 컨테이너, 또 다른 하나는 컨테이너 역할을 할수 없는 단순한 Component 가 있습니다.
- 관련 클래스는 Java.awt Package안에 포함되어 있습니다.
- 일정하게 정해진 모양이 없다는것은 장점 인듯하나 Component의 정렬등 기타 문제점으로 인해 현재는 Swing을 주로 사용 합니다.
- OS마다 사용하는 Window창, Font등이 다르므로 자바에서는 AWT를 제공하며 , 실행될때 각 OS에서 적합한 Component로 대체 됩니다. 현재 OS 의 각 Component를 Peer Component라고 한다.
- AWT 패키지의 각 Component가 생성 되거나 임의의 Container 또는 하위 Class에 등록 되어서 표시 되어야 할 때 해당 Component의 addNotify 메소드가 호출되며 여기 에서는 다시 java.awt.Toolkit의 createButton과 같은 메소드를 사용하여 현재 OS에 상응하는 Peer Component를 생성 합니다.


AWT Component의 종류
1. Window : 경계표시, 타이틀바등이 없는 단순한 사각형 윈도우 Component 자신안에 다른 Component를 담으면서 동시에 자신은 독립적인 윈도우를 생성
2. Frame : 경계표시와 타이틀바를 가지는 윈도우 Component(Window Class를 상속 받음) , 프레임은 실질적으로 사용되는 가장 기본적인 윈도우로 우리가 윈도우라 부르는 것은 보통 이 프레임을 말함
3. Button : 버튼을 표시하는 Component
4. Canvas : 빈 사각형 영역을 나타내는 Component(주로 그래픽이나 이미지를 표현 하는데 사용)
5.CheckBox : 선택된 상태와 선택되지 않은 상태 두가지를 가지는 Component(그룹 화 또는 개별로 존재 가능)
6. Choice : 흔히 팝업메뉴라고 불리는것, 여러요소중 하나를 선택
7.Dialog : 대화상자 윈도우, Frame위에서 작은 윈도우를 하나더 띄움
8.FileDialog : 파일을 선택할수 있는 파일대화상자
9.Label : 문자열을 나타내는데 사용되는 Component
10. List : 여러 개의 텍스트 목록을 나타내는Component(목록에서 하나또는 여러개 선택가능)
11. Panel : 다른 Component를 배치하는데 사용되는 간단한 Container Component, 판넬Panel은 윈도우(프레임) 안에 부착된 여러 컴포넌트들을 비슷한 기능끼리 함께 모아두는 컨테이너 입니다. 이런 점에서, Window 와 그 부속 컨테이너들은 독립된 윈도우를 구성하는 반면, 판넬은 독립적인 창 구실은 할 수 없고, 오로지 기존 윈도우의 한 컴포넌트로서만 사용 됩니다.
12. ScrollBar : 사용자가 어떤 영역안에서 값을 선택할수 있게 해 줍니다.
13. ScrollPane : 다른 Component를 담고서 스크롤바를 움직임에 따라 자동으로 다른 Component의 위치를 변경시켜주는 Component, 스크롤 부착창ScrollPane은 수평 및 수직 스크롤바를 부착하기 위한 창입니다.
14. TextField : 한줄로 된 Text입력 Component
15. TextArea : 여러줄 입력이 가능한 텍스트 입력 Component

종류는 아래와 같습니다.


GUI 프로그램의 구조



아래는 AWT를 이용한 윈도우를 띄우는 샘플 입니다.

import java.awt.*;
public class HelloWindow1 extends Frame {
public HelloWindow1(String title) {
super(title);
}
public static void main(String args[]) {
HelloWindow1 frame = new HelloWindow1("AWT Sample1"); frame.setSize(400,400);
frame.setVisible(true);
}
public void paint(Graphics g) {
g.drawString("HelloWindow1", 150, 150);
}
}

[결과]




2013년 8월 3일 토요일

Explain Plan - 오라클힌트, Oracle Hint-실행계획 SQL연산(INLIST ITERATOR)

실행계획 SQL연산(INLIST ITERATOR)

구로디지털 오엔제이프로그래밍실무교육센터


인덱스 컬럼이 IN-LIST구에 나타나는 경우의 ROW 연산 입니다. INLIST ITERATOR IN-LIST의 인수 만큼 반복연산을 수행 합니다.

SQL> desc emptest;
 이름                                      ?      유형
 ------------------ -------- --------------------------
 EMPNO                                              NUMBER
 DEPTNO                                             NUMBER
 ENAME                                              VARCHAR2(46)
 ADDR                                               VARCHAR2(44)
 SAL                                                NUMBER

SQL> select count(*)  from emptest;

  COUNT(*)
----------
   2500000

SQL> select index_name, table_name from user_indexes 
where table_name like 'EMPTEST';

INDEX_NAME                     TABLE_NAME                     
------------------------------ ------------------------------
IDX_EMPTEST_ADDR               EMPTEST                      
IDX_EMPTEST_DEPTNO             EMPTEST

ADDR 컬럼으로 인덱스가 있다. Addr 컬럼을 이용해 보자.

SQL> select empno, ename
  2  from emptest
  3  where addr in ('서울1','서울10001');

     EMPNO ENAME
---------- ----------------------------------------------
         1 홍길동1
     10001 홍길동10001

   : 00:00:00.00

Execution Plan
----------------------------------------------------------
|   0 | SELECT STATEMENT
|   1 |  INLIST ITERATOR            
|   2 |   TABLE ACCESS BY INDEX ROWID| EMPTEST
|*  3 |    INDEX RANGE SCAN          | IDX_EMPTEST_ADDR

위의 INLIST ITERATOR를 나타내게 하기 위해 넣은 힌트 구문이며 힌트 구문을 사용하지 않는 다면 아래와 같은 실행 계획이 수립됩니다.


SQL> select  empno, ename
  2  from emptest
  3  where addr in ('서울1','서울10003');

     EMPNO ENAME
---------- ----------------------------------------------
         1 홍길동1
     10003 홍길동10003

   : 00:00:00.00


--------------------------------------------------------------------
|   0 | SELECT STATEMENT
|   1 |  INLIST ITERATOR            
|   2 |   TABLE ACCESS BY INDEX ROWID| EMPTEST
|*  3 |    INDEX RANGE SCAN          | IDX_EMPTEST_ADDR |