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

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월 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월 22일 화요일

[자바상속컴포지션]Java Inheritance & Composition 상속과 컴포지션은 동전의 양면과 같이 유사하게 서로에게 관련이 있다. 상속은 마치 양파가 여러 껍질로 이루어진 것과 같이 계층화된 객체 컴포지션은 여러 재료(객체)가 한데 뭉쳐서 만들어진 죽 컴포지션은 개체들간의 'has a' 관계, 상속은 ‘is a’관계 상속과 컴포지션은 상호 배타적이지 않으며 개발자는 이 둘을 같이 사용한다. 다음 예제는 ‘is a’와 ‘has a’의 착각에는 나오게 되는 실수이다. 1. 원은 반지름 값을 갖는 하나의 점이다(a Circle is a Point with a radius.) 그래서 Circle은 Point를 상속 class Point { private double x, y; Point(double x, double y) { this.x = x; this.y = y; } double getX() { return x; } double getY() { return y; } } class Circle extends Point { private double radius; Circle(double x, double y, double radius) { super(x, y); this.radius = radius; } double getRadius() { return radius; } } 2. 원은 한 점과 반지름을 가지고 있다(a circle has a point and a radius) class Point { private double x, y; Point(double x, double y) { this.x = x; this.y = y; } //redundant code 로 인한 유지보수 어려움(코드의 재사용 실패) double getX() { return x; } double getY() { return y; } } class Circle { private Point p; private double radius; Circle(double x, double y, double radius) { p = new Point(x, y); this.radius = radius; } double getX() { return p.getX(); } double getY() { return p.getY(); } double getRadius() { return radius; } } [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecJava&wr_id=601 오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의) www.onjprogramming.co.kr [개강확정강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr) [주말] [10/26]C#,ASP.NET마스터 [10/26]Spring3.X, MyBatis, Hibernate실무과정 [10/27]JAVA&WEB프레임워크실무과정 [평일야간] [10/29]C#,ASP.NET마스터 [10/25]Spring3.X, MyBatis, Hibernate실무과정 [10/31]JAVA&WEB프레임워크실무과정 [주간] [11/4]Spring3.X, MyBatis, Hibernate실무과정 [기타 다른 강좌는 아래 해당 카테고리를 클릭해주세요] JAVA ORACLE iPhone/Android .NET 표준웹/HTML5 채용/취업무료교육 초보자(재학생)코스

[자바상속컴포지션]Java Inheritance & Composition

상속과 컴포지션은 동전의 양면과 같이 유사하게 서로에게 관련이 있다. 
상속은 마치 양파가 여러 껍질로 이루어진 것과 같이 계층화된 객체
컴포지션은 여러 재료(객체)가 한데 뭉쳐서 만들어진 죽
컴포지션은 개체들간의 'has a' 관계, 상속은 ‘is a’관계
상속과 컴포지션은 상호 배타적이지 않으며 개발자는 이 둘을 같이 사용한다.
다음 예제는 ‘is a’와 ‘has a’의 착각에는 나오게 되는 실수이다.

1. 원은 반지름 값을 갖는 하나의 점이다(a Circle is a Point with a radius.)
   그래서 Circle은 Point를 상속

   
   
class Point {
 private double x, y;
 Point(double x, double y) {
  this.x = x;
  this.y = y;
 }
 double getX() {
  return x;
 }
 double getY() {
  return y;
 }
}
class Circle extends Point {
 private double radius;
 Circle(double x, double y, double radius) {
  super(x, y);
  this.radius = radius;
 }
 double getRadius() {
  return radius;
 }
}
 
2. 원은 한 점과 반지름을 가지고 있다(a circle has a point and a radius)
 
class Point {
 private double x, y;
 Point(double x, double y) {
  this.x = x;
  this.y = y;
 }
 //redundant code 로 인한 유지보수 어려움(코드의 재사용 실패)
 double getX() {
  return x;
 }
 double getY() {
  return y;
 }
}
 
class Circle {
 private Point p;
 private double radius;
 Circle(double x, double y, double radius) {
  p = new Point(x, y);
  this.radius = radius;
 }
 double getX() {
  return p.getX();
 }
 double getY() {
  return p.getY();
 }
 double getRadius() {
  return radius;
 }
}

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


[기타 다른 강좌는 아래 해당 카테고리를 클릭해주세요]

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

(Java Framework, 자바교육,스트럿츠교육)Java Struts View

Struts에서의 VIEW 


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


Struts Framework에서 VIEW의 역할은 대부분 JSP가 수행 하며 커스텀태그,HTML,JSP의 조합으로 VIEW 를 만들어 낼 수 있습니다.

JSP기술은 개발자가 JSP안의 스크립틀릿에 비즈니스 로직을 마음대로 추가 할 수 있으므로 유지보스를 어렵게 하며 개발자가 JSP문법 뿐 아니라 커스텀태그의 사용법까지 알고 있어야 하는 단점이 있습니다. 또한 변경 후 다시 시작하는 경우 JSP 페이지를 다시 컴파일 해야 합니다.

Struts에서 사용 가능한 태그라이브러리는 HTML, Bean, Logic, Template, Nested, Tiles 6가지가 있습니다. 각 태그라이브러리는 서로 다른 역할을 하며 독립적으로 사용 가능 합니다. 또한 사용자가 새로운 커스텀 태그를 만들어 사용하는 것도 가능 합니다.

이전 로그인 예제(3)에서 사용자가 main.jsp에 접근 할 때 인증을 한 사용자인지의 여부를 검사하는 것을 커스텀 태그를 이용하여 만들어 봤습니다.

스트럿츠에서 제공하는 태그 라이브러리를 사용 하려면 web.xml에 등록해야 하는데 아래는 web.xml 파일의 내용 입니다.

<!-- Struts Tag Library Descriptors -->
        <taglib>
            <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
        </taglib>

다음으로 해야 할 일은 JSP 페이지에서 taglib 지시자를 추가 하는 것입니다.

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>


다음은 스트럿츠에서 제공 하는 커스텀 태그를 이용한 login.jsp 입니다.

<%@ page language="java" %>
<%@ page pageEncoding="euc-kr" %>
<!-- 최초 사용자가 접속하게 되는 페이지 입니다. -->
<!-- 아래는 import와 동일한 기능을 하는 태그로 태그 확장을 사용 할 수 있도록 합니다 -->
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/app.tld" prefix="login" %>

<!-- 인증이 안된 사용자는 login.jsp로 보내 버립니다. -->
<login:IsLogin/>

<html>
<head>
    <title><bean:message key="main.title" /></title>
    <html:base/>
</head>       
        <body>               
            <h3>반갑습니다.<bean:write name="user" property="id"/>님!</h3>                                       
                <ul>                       
                        <li>                           
                                <html:link forward="logoff">로그아웃</html:link>
                        </li>                       
                </ul>
        <body>
</html> 

2013년 8월 1일 목요일

java.util.TreeSet 클래스 – 예제

java.util.TreeSet 클래스 – 예제 
 
 
import java.awt.*;  import java.util.*;
public class TreeSetTest implements Comparator {
Set treeset;
public TreeSetTest() {
treeset = new TreeSet(this);
}
public void test() {
for(int i=0;i<5;i++) {
treeset.add(new Integer(i));
}
System.out.println("Sert Result : "+treeset);
}
public int compare(Object o1, Object o2) {
return ((Integer)o1).compareTo(o2);
}
public static void main(String[] args) {
TreeSetTest tst = new TreeSetTest();
tst.test();
}
}
 

(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);
  물론 그 클래스 내부에서는 클래스 이름을 지정할 필요가
  없다
 자신의 클래스의 모든 클래스변수(필드)와 클래스 메소드 
  를 사용할수 있다. 인스턴스 필드(변수)나 인스턴스 메소드
  는 사용할수 없다.

java interface polymorphism(인터페이스를 이용한 다형성)

앞의 예제의 Manager Class는 제외함.
인터페이스를 이용해 메소드를 사용하고 또 더불어 다형성을 제공할 수도 있다. 예를 들어 운전자는 영업팀 직원일 수도 있고 영업팀팀장일 수도 있다. 앞서 클래스의 다형성을 이야기 할 때 설명한 것과 비슷한 내용이지만 결국 운전자는 때에 따라서 여러 형태로 보여질 수 있다는 의미이다. 만약 운전자를 나타내는 인터페이스 SmallDriver 인터페이스가 영업팀직원일 수도 있고 영업팀팀장을 나타낼 수도 있다면 프로그래밍을 하는 사람의 입장에서는 보다 유연한 프로그래밍을 제공받을 수 있을 것이다. 


//인터페이스 선언
interface SmallDriver { 
  void driveSmallCar(); // 메소드 선언 
}

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;   
public String carName="소나타";
    public SalesEmployee(String newName,String newID,String newArea) {
        super(newName, newID);   
this.chargeArea = newArea;
    }
// SmallDrive 인터페이스의 메소드 구현 
    public void driveSmallCar() { 
          System.out.println("영업팀 직원 " + name + "은 " + carName + "를 운전한다.");
    }
    public void startJob() {
        System.out.println(super.name + "님이 " + this.chargeArea + " 지역으로 영업업무를 나갑니다...");
    }
}


//영업팀직원 클래스를 상속한 영업팀장 클래스
class SalesChief extends SalesEmployee implements SmallDriver{
      int salesTarget;  //영업팀 목표 매출액
  public String carName="그랜져";
      public SalesChief(String newName,String newID,String newArea, int newSalesTarget) {
          super(newName, newID, newArea); 
          this.salesTarget = newSalesTarget;
      }
  // SmallDrive 인터페이스의 메소드 구현 
      public void driveSmallCar() { 
          System.out.println("영업팀 팀장 " + name + "은 " + carName + "를 운전한다.");
      }
      //영업팀장의 업무는 더이상 확장이 안된다는 의미, 상속할수가 없다는 의미
      final public void startJob() {
          System.out.println(super.name + "님이 영업팀 직원을 관리한다...");
          System.out.println(super.name + "님이 관리하는 영업팀의 매출목표는 "+ this.salesTarget + "만원 입니다...");
      }
}


//Main Class
class InterfaceSample2 {
    public static void main(String[] args) {
        // 인터페이스가 클래스의 객체를 참조하도록...
        SmallDriver sm1 = new SalesEmployee("홍길동", "11111","서울");
        SmallDriver sm2 = new SalesChief("이순신", "22222", "개발부", 100000000);
        sm1.driveSmallCar();
sm2.driveSmallCar();

SalesEmployee se = new SalesEmployee("차두리","23456","독일");
se.gotoOffice();
se.startJob();
se.carName="티코";
se.driveSmallCar();
    }
}


추상메소드를 가지고 있고 이를 상속받거나 구현하는 클래스는 이 추상 메소드를 재정의하고 구현해야 한다는 점, 그리고 다형성을 구현하는 방법이라는 점, 메소드들이 동적으로 바인딩 된다는 점들은 비슷하다.
차이점
      - 인터페이스는 서로 연관성이 없는 클래스들에 의해 구현될 수 있고 따라서 수평적인 구현이 가능하지만 추상클래스의 경우 단일 상속 개념 하에 수직적인 구조로 상속을 해야만 한다.
    - 인터페이스에서는 메소드를 선언만 할 수 있으며 구현할 수 없다. 그리고 이 구현은 인터페이스를 구현하도록 설정된 클래스에서 가능하다. 하지만 추상클래스의 경우에는 추상 클래스 내부에서 메소드의 선언과 구현이 모두 가능하며 또한 이를 상속 받은 클래스에서도 재정의가 가능하다.

2013년 7월 28일 일요일

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)자바 리플렉션(JAVA Reflection)에 대해 ,

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


Runtime에 클래스를 전달받아서 임의의 method를 실행하는 시스템이 있다고 가정하면 이 때 전달되는 파라미터, return되는 파라미터 모두 개발당시에는 알지 못한다고 하자 이러한 시스템에는 임의의 클래스가 주어졌을 때, 그 클래스에 대한 정보, 다시 말해서 해당 클래스의 생성자 (constructor), 멤버변수, method, 슈퍼 클래스 , 상위 인터페이스에 대한 정보를 얻을 수 있는 기능이 필요하다 이렇게 임의의 클래스에 대한 정보를 얻을 수 있게 해 주는 API가 바로 reflection API이다. 

Ex) import java.lang.reflect.*;
    Object o;
    Class c = o.getClass();
    ……
    Method m = c.getMethod(“setText”, new Class[] {String.class} );
    ……


import java.lang.reflect.*;
import java.awt.*;
class ReflectionTest {

public static void main(String[] args) {
      Button b = new Button();
      getNameSuperClass(b);
}
static void getNameSuperClass(Object o) {
      Class c = o.getClass();
      String s = c.getName();
      String s1 = c.getSuperclass().toString();
      System.out.println(s + "\n" + s1);
  }
}
 
 

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)자바의 객체지향적 특징

******** 자바의 특성(객체지향적) ************

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


 

추상화(Abstraction) : 실제 사물을 명사화/동사화 시켜서 프로그램에 적용할수 있는 형태로 만드는 것
상속성(Inheritance) : 미리 만들어진 소스를 가지고 공유하며 재사용하고, 또한 특별한 부분에 대 해서는 다시 재정의해서 사용하는 것 자바에서 상속은 한 클래스를 확장하여 새로운 클래스를 만드는 것을 말한다. 이렇게 새로 만들어지는 클래스를 하위클래스(subclass)라고 부른다. 그리고 원래의 클래스는 상위클래스(superclass)라고 부른다.
다형성(Polymorphism) : 상속을 받은 것을 그대로 사용하지 않고 입맛에 맞게 바꾸어 줄 수 있도록 하는것이며 이 때문에 다형성 함수는 전달하는 변수의 타입을 고려하지 않게된다.
캡슐화(Encapsulation) : 캡슐화는 사용자로부터 객체 내부의 데이터를 감추는 것이다. 데이터를 변수로 나타내며, 클래스의 함수와 프로시저는 메소드(Method)라고 한다. 클래스가 다른 클래스의 데이터를 다루려면 메소드를 통해야 한다. 이러한 캡슐화는 객체 내부의 처리과정을 알 필요없이 그것을 다루는 메소드에 대해서만 알면 된다는 점에서 편리하다. 변수들(외부에서 임의로 조작되었을때 원하지 않는 결과가 나오는것들 또는 잘못된 결과가 나오는것들) 에대해서 외부로 부터 접근제한을 시키는 것이 바로 encapsulation, 즉 객체내부의 데이터와 메소드 항목을 정의할때 private로 지정하여 클래스 외부에서의 접근을 제한하는것.


다중 쓰레드를 지원한다.
- 프로세스는 실행중인 프로그램을 뜻하는 말입니다. 보통 프로세스가 운영 체제의
여 러 자원을 사용하는 기본 단의 입니다.
- 쓰레드(Thread)란 프로세스 내부에서 실행되는 일련의 명령 흐름을 뜻합니다.
프로세스내의 제어의 단일 순차 흐름을 의미하며, 때때로 수행 문맥
(execution context)또는 가벼운 프로세스(lightweight peocess)라함
- 프로세스가 실행되면서 하나의 흐름만을 갖는 것이 아니라 여러 개의 흐름으로
분기할 수 있으며 하나의 프로세스가 같은 시간에 여러 가지 일을 수행하기
위해서 여러 개의 스레드를 만들게 됩니다.
- 다중 쓰레드란 하나의 프로그램내에서 동시에 수행되며 서로 다른 작업들을
수행하는 복수개의 쓰레드들을 의미한다.


[예제]
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 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 Example {
public static void main(String args[]) {
Manager m = new Manager("이종철","12345","솔루션개발부");
m.gotoOffice();
m.startJob();
m.gotoHome();
Manager m1 = new Manager("홍길동","12346","고객관리부");
m1.gotoOffice();
m1.startJob();
m1.gotoHome();
}
}