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

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

[자바 상수 객체, Java Constant Object] 상수 객체란 final변수와 같이...

[자바 상수 객체, Java Constant Object]
 
상수 객체란 final변수와 같이 객체의 내용을 변경 할수 없는 객체를 말한다.
 
객체의 내용을 외부에서 수정하지 못하게 하기 위해서는 인스턴스 변수는 모두 final로 선언하거나, private으로 선언한다.
 
인스턴스 변수를 수정하는 메쏘드는 외부에서 접근하지 못하게 private으로 선언
예) String, Integer 등은 그 내용을 수정 할 수 없도록 위와 같이 만들어져 있다.
 
final로 선언된 변수가 참조형 일 경우에는 그 변수의 참조 값을 바꿀 수는 없으나 그 변수가 참조하고 있는 객체나 배열의 내용은 수정 가능하다.

[예제, ConstObjectTest.java]
 
package onj;
class ConstClass
{
    final int v1;
    private int v2;
    
    ConstClass( int value1, int value2 )
    {
        v1 = value1;
        v2 = value2;
    }
    int getV2()
    {
        return v2;
    }
}
class NonConstClass
{
    int v=999;
}
class ConstObjectTest
{
    public static void main( String[] args )
    {
        ConstClass obj = new ConstClass(1, 2);
        
        System.out.println( "obj.v1 = " + obj.v1 );
        System.out.println( "obj.getV2() = " + obj.getV2() );
        // obj.v1 = 3;  // 오류: 화이널 변수이므로 대입 불가
        // obj.v2 = 4;  // 오류: private 변수이므로 접근 불가
        final NonConstClass obj2 = new NonConstClass();
        // obj2 = new NonConstClass(); // 오류: 화이널 참조 변수이므로 수정 불가
     // 화이널 참조값을 통하여 객체의 내용 수정 가능하다,
        obj2.v = 3;            
    }
}
 
[결과]
 
obj.v1 = 1
obj.getV2() = 2