본문 바로가기

IT/자바

업캐스팅 다움캐스팅2

  1. //클래스 Point2D로 Point3D가 이 클래스를 상속 했으므로 이 클래스는 자동으로 부모(상위) 클래스 
  2. class Point2D{ 
  3.    public void disp(){ 
  4.       System.out.println("Point2D의 disp()"); 
  5. //클래스 Point3D이며 여기서 Point2D 상속했으므로 Point2D의 자식(하위) 클래스 
  6. class Point3D extends Point2D{ 
  7.    private String name; 
  8.    // 부모 클래스가 가진 메소드를 재정의 함. 
  9.    public void disp(){ 
  10.       System.out.println("Point3D의 disp()"); 
  11.    // 신규로 생성된 get 메소드 
  12.    public String getName(){ 
  13.       return this.name; 
  14.    // 신규로 생성된 set 메소드 
  15.    public void setName ( String name ) { 
  16.       this.name = name; 
  17. //이 클래스는 main 메소드가 있는 클래스로 실행시 진입점이 있는 클래스 
  18. public class Test { 
  19.    public static void main( String[] args ) { 
  20.       //1번 
  21.       Point2D p2 = new Point2D(); 
  22.       Point2D p2_1 = p2; 
  23.       p2_1.disp(); 
  24.       // 당연히 Point3D 에만 있는 메소드 이므로 없으니 에러 
  25.       System.out.println( p2_1.getName() ); // 에러 
  26.       //2번(업캐스팅) 
  27.       Point3D p3 = new Point3D(); 
  28.       // Point2D를 상속한 하위 클래스인 Point3D를 Point2D가 reference 했으므로 
  29.       Point2D p2_2 = p3; 
  30.       p2_2.disp(); 
  31.       // 서로 동일한 메소드는 가지고 있지만 그렇지 않는 get/set 메소드는 캐스팅되면서 
  32.       // 사용할 수 없게 됨. 업캐스팅의 특징 
  33.       System.out.println( p2_2.getName() ); // 에러 
  34.       //3번(다운캐스팅) 
  35.       Point2D p2_3 = new Point3D(); 
  36.       // Point2D를 상속한 하위 클래스인 Point3D를 Point2D가 reference 했으므로 
  37.       Point3D p3_1 = (Point3D) p2_3; 
  38.       p3_1.disp(); 
  39.       // 위에서 (Point3D) p2_3 는 캐스팅으로 하위 자식인 클래스로 변경. 
  40.       // 즉, Point2D 에서 없는 get/set 메소드 사용 가능 
  41.       // 결론적으로 Point2D가 자기고 있지 않은 메소드 사용 가능하단 걸 알게 됨. 
  42.       System.out.println( p3_1.getName() ); // 정상 
  43.       //4번 
  44.       // 자동으로 Point2D 로 캐스팅 됨. 상위 클래스는 하위 클래스가 가지는 
  45.       // 특수성(메소드를 추가 할 수 있다) 때문에 어쩔수 없이 하위 클래스로 
  46.       // 인스턴스화 한다 해도 없는 메소드는 get/set 메소드를 만들어 낼 수 
  47.       // 없기 때문 
  48.       Point2D p2_4 = new Point3D(); 
  49.       p2_4.disp(); 
  50.       // 위 설명때문에 getName() 메소드를 호출 할 수 없음 
  51.       System.out.println( p2_4.getName() ); // 에러