2008. 8. 11. 17:37

Part 4. 상속 II 생성자, 레퍼런스 형변환

상속에서의 생성자의 특징
1. 생성자는 상속되지 않는 유일한 멤버함수이다.
2. 자동 호출되는 생성자는 전달인자 없는 디폴트 생성자 형태이다.
3. 슈퍼 클래스 생성자가 먼저 실행되고 서브 클래스의 생성자가 실행된다.

===================================================================================
package training;
class Point2D {
 int x, y;
 public Point2D(int x, int y) {
  super();
  this.x = x;
  this.y = y;
 }
 public Point2D(){
  System.out.println("Point2D의 전달인자가 없는 생성자 ");
 }
 public void prn(){
  System.out.println(x + "," + y );
 }
}
class Point3D extends Point2D {                
 int z;
 public Point3D(int x, int y, int z) {
  super(x, y);
  this.z = z;
 }
 public Point3D(){
  System.out.println("Point3D의 전달인자가 없는 생성자 ");
 }
 public void prn(){
  System.out.println(x + "," + y + "," + z);
 }
}
public class Ex01 {
 public static void main(String[] args) {
  Point2D p2d=new Point2D(10,20);
  p2d.prn();
  Point3D p3d=new Point3D(10,20,30);
  p3d.prn();
  new Point3D();
 }
}
// 디폴트생성자
// 1. 전달인자가 없는 형태
// 2. 프로그래머가 전달인자 있는 생성자를 만들어 주면 더 이상 제공해 주지 않는다.
// 3. 상속관계에서는 서브클래스의 생성자가 슈퍼클래스의 디폴트 생성자를 자동 호출하고 있다.
// 해결방법
// 1. 슈퍼클래스에 전달인자 없는 생성자를 만든다.
// 2. 서브클래스에 생성자를 만들어서 슈퍼클래스의 생성자를 명시적으로 호출
===================================================================================
레퍼런스 변수들 사이의 형변환은 상속관계에서만 가능하다.
상속관계에 있는 클래스 사이의 형변환은 업캐스팅과 다운캐스팅이 있다.
업캐스팅 : 서브 클래스의 레퍼런스 값이 슈퍼 클래스의 레퍼런스 변수에 저장되면서
슈퍼 클래스 형으로 변환 되는것
업캐스팅은 암시적이 형변환이 이루어진다.
참조 가능한 영역이 축소 된다.
다운캐스팅 : 서브클래스로 형변환하는 것. 참조 가능한 영역이 확대되는 것을 의미하며
명시적 형변환이 필요하다.
===================================================================================
package training;
class Parent{
 public void parentPrn(){
  System.out.println("Parent 클래스의 parentPrn() 메소드");
 }
}
class Child extends Parent{
 // 오버라이딩
 public void parentPrn(){
  System.out.println("Child 클래스의 parentPrn() 메소드 오버라이드 ");
 }
 public void childPrn(){
  System.out.println("Child 클래스의 childPrn() 메소드");
 }
}
public class Ex02 {
 public static void main(String[] args) {
  Parent p=new Child(); // 업캐스팅
  p.parentPrn(); // 부모로부터 상속받은 것만 접근 가능
  // Child 객체는 자신의 메소드도 호출 되어야만 한다.
  // p.childPrn(); // 불가능
  Child c=(Child)p; // 다운캐스팅 : 명시적으로 캐스팅 해 줘야 함.
  c.childPrn();
 }
}
// 상속 관계에 있으므로 Child는 Parent의 멤버를 가져다 사용할 수 있음
//Child c=new Child();
//c.parentPrn(); // 부모로부터 상속 받은 것
//c.childPrn(); // 자신의 것
// 형변환 : 대입연산자를 기준으로 왼쪽, 오른쪽에 오는 피연산자의 자료형이 다를 경우
//Parent p=c; // 업캐스팅 : 자동
//p.parentPrn(); // 부모로부터 상속받은 메소드만 호출 가능
// p.childPrn(); // 업캐스팅 후에는 자신의 메소드 호출 불가능
===================================================================================
package pack01;
class Point2D {
 int x, y;
 public void prn(){
  System.out.println(x + "," + y );
 }
}
class Point3D extends Point2D {
 int z;
 public void prn(){
  System.out.println(x + "," + y + "," + z);
 }
}
public class Ex01 {
 public static void main(String[] args) {
  Point2D p2d=new Point3D();
  p2d.prn();
  Point3D p3d=(Point3D)p2d;
  System.out.println("," + p3d.z);
 }
}
===================================================================================

질의 사항
실제로 업캐스팅과 다운캐스팅이 필요한 때가 언제인지.

'수업 > 자바2JDK입문' 카테고리의 다른 글

Part 4. 상속 IV 인터페이스  (1) 2008.08.13
Part 4. 상속 III 추상 클래스와 Final  (0) 2008.08.13
상속을 이용한 클래스 설계 및 출력  (0) 2008.08.08
Part 4. 상속 I  (0) 2008.08.08
Part 3. static  (2) 2008.08.07