상속관계에서 형변환을 할 수 있다
: 자식 객체가 부모 클래스의 참조변수에 들어올 때 자동형변환이 가능하다.
: 단, 자식 객체가 부모 클래스의 참조변수에 들어갔을 때는 자식 객체 본인이 고유로 가지고 있는 메서드나 속성을 사용할 수 없다.
: 자식 객체가 부모 클래스 참조변수에 들어올 수 있었던 건 부모객체를 하위로 가지고 있었기 때문이다.
: 실질적으로 들어오는건 자식 객체 상속된 부모 객체가 담기는 것이다.

: 위험성 : 부모참조변수가 부모객체를 가지고 있는지 다른 자식 객체를 가지고 있는지 알 수 없을 수가 있다.
: 만약 A 자식이 있는 부모참조 값을 B자식의 참조변수에 넣어버리면 에러가 난다
: 이를 방지하기 위해 부모 객체가 자식 클래스의 참조변수에 들어가는 자동형변환이 되지 않는다.
: (클래스명)을 사용해 강제로 변경할 수 있지만 그전 변수에 무엇을 담고있는지 주의해야한다.

public class Casting2{
public static void main(String[] arge){
// 객체간의 형변환
Dog d1 = new Dog();
d1.bark();
Cat c1 = new Cat();
c1.moew();
// d1 = c1;
// Dog변수에 Cat이 들어올 수 없다.
// 완전히 개념이 다르기 때문
// 1. 고양이를 동물이 지나간다 라고 해도 상관은 없다
// 2. 동물이 지나가는데 고양이가 지나간다라고
// 말하면 오류를 범할 수 있다.
// 3. 동물 영역에 고양이가 속할 수 있지만
// 고양이 영역에 동물이라는 범위가 들어갈 수 없다.
// ㄱ. 관련있는 속성, 상속x >> 형변환 불가능
// Animal a1 = c1;
// cat 객체는 상속 받지 못해서 Dog변수에 Cat이 못들어 간 것처럼 못들어감
// Dog는 Animal과 관계가 있지만
// Cat은 Animal과 관계가 없어서 형변횐 대상이 되지 않음
// ㄴ. 관련있는 속성, 상속o, 부모클래스 참조변수에 자식객체가 들어갈 때
// >> 형변환 가능
Animal a1 = d1;
// 가능
// Animal 타입변수에 Dog가 대입되었다.(x)
// Dog가 Animal로 모습을 바꿔서 대입(o)
// > 객체간의 형변환은 상속 관계에서 허용된다.
// >> 객체간 자동형변환
// a1.bark(); // 자식 객체의 Dog의 속성은 사용 불가
a1.eat(); // 자식 객체안의 부모객체 Animal의 속성은 사용 가능
// ㄷ. 관련 있는 속성, 상속x, 자식클래스 참조변수에 자식객체가 들어갈 때
// >> 강제로만 형변환 가능
// d1=a1; > 불가능
d1=(Cat)a1; // Animal을 Cat으로 수동형변환 => 위험
a1 = d1 ;// a1 -> Dog
// c1 = a1 ;// == c1 = d1; >> 에러
c1 = (Cat)a1 ;// >> 강제로 형변환 시킴
// c1.moew
// >> c1d은 Dog 속성을 가지고 있지 않기 때문에 에러
c1.eat();
// >> Cat과 Dog는 같은 부모 속성을 가지고 있기 때문에
// 부모의 기능은 사용 가능
}
}
// Animal 큰 범위를 Dog 객체가 상속받음
class Animal {
public void eat(){
System.out.println("먹다")
}
}
class Dog extends Animal{
public void bark(){
System.out.println("멍멍")
}
}
class Cat {
public void moew(){
System.out.println("야옹")
}
}
- 객체간 형변환은 상속관계일때 가능하다.
- 자식 객체가 부모객체로 모습을 바꾸는 것은 안전하다.
자식은 부모의 기능을 무조건 가지고 있기 때문에- 부모 객체가 자식 객체로 모습을 바꾸는 것은 위험하다.
부모 객체는 여러 자식 객체 포함할 수 있기 때문에