상위 클래스는 하위 클래스의 인스턴스를 생설 할 수 있지만 그 반대는 안되는 이유
public class Blog {
public static void main(String[] args) {
A a = new A(); // 단순
B b = new B(); // 객체 생성
A ab = new B(); // 상위 타입 변수에 하위 타입 객체 생성
B ba = new A(); // 하위 타입 변수에 상위 타입 객체 생성 (컴파일 에러 발생)
}
}
class A {
int a = 1;
}
class B extends A {
int b = 2;
}
한 줄 요약: 부모 클래스는 자식 클래스의 정의된 모든 속성과 행동을 보유하고 있지 않기 때문이다. 자식 클래스는 부모 클래스를 상속해서, 부모 클래스와 자신(자식) 클래스의 정보를 모두 보유하고 있으나, 부모 클래스는 자신(부모) 클래스의 정보만 가지고 있다.
코드를 보면, A 가 부모 (상위) 클래스이고, B 가 자식 (하위) 클래스이다.
B의 생성자는 호출될 때 부모의 생성자가 먼저 호출 되어서, A 와 B 의 정보가 모두 있다.
A ab = new B(); 이 코드의 실행 순서는,
1. A ab;
2. new A();
3. new B();
4. ab = new B();
대충 이런식으로, 부모와 자식의 정보가 모두 있으니, 문제가 없다라는 느낌이다.
반대로,
B ba = new A(); 이 코드의 실행 순서는,
1. B ba;
2. new A();
3. new B(); (부모는 자식에게 상속을 하지, 자식의 재산을 빼앗지는 않아서, 자식의 생성자를 호출 할 수 없다. )
4. ba = new A();
이렇게 되면, 자식 타입 변수 ba 는 부모가 가지고 있지 않은 정보를 요구하지만, 부모는 제공을 할 수 없기에, 컴파일 에러가 난다.
해결하려면 자식 타입으로 다운 캐스팅하면 되는데,
B ba = (B) new A();
이렇게 하면 부모가 가지고 있지 않던 정보는 0 또는 null로 대체되어서 자식 객체가 생성되는 듯 하다.
비슷한 예로
int 와 double 원시 데이터 타입을 보면,
double 은 int 보다 복잡한 내용을 가지고 있으니,
int에서 double로는 자동 형변환이 되지만 5 -> 5.0,
int i = 5;
double d = i;
double에서 int로는 강제 형변환을 해줘야 한다. 5.5 -> 5
double d = 5.5;
int i = (int) d;
댓글
댓글 쓰기