package lang.object.poly;
class Car {
public void move() {
System.out.println("자동차");
}
}
package lang.object.poly;
class Dog {
public void sound() {
System.out.println("멍멍");
}
}
package lang.object.poly;
public class ObjectPolyExample1 {
Public static void main(String[] args) {
Dog dog = new Dog();
Car car = new Car();
//Object dog = new Dog(); 로 변경가능
//Object car = new Car(); 로 변경가능
// => 부모는 자식을 담을 수 있기때문.
action(dog);
action(car);
}
public static void action(Object obj) {
//obj.sound(); ->컴파일오류, Object에는 sound()가 없다.
//obj.move(); ->컴파일오류, Object에는 move()가 없다.
//객체에 맞는 다운캐스팅이 필요하다.
if (odj instanceof Dog dog) {
dog.sound();
} else if (odj instanceof Car car) {
car.move();
}
}
}
멍멍
자동차
다운캐스팅 복습
- 자식클래스의 레퍼런스가 부모클래스의 인스턴스를 참조하는 것
- 부모클래스의 인스턴스를 자식클래스 타입으로 형변환하는 것
- 참조 가능한 영역이 확대됨
- 자동 형변환이 일어나지 않음 = 명시적(강제) 형변환 필요
- 강제 형변환을 통해 구문 오류가 해결되더라도 실제 실행 시점에서 오류(실행 오류)가 발생하게 됨
=> 존재하지 않는 영역의 참조 위험성 때문- 무조건 다운캐스팅이 성립하는 것이 아니라 반드시 자식객체가 부모타입으로 자동 변환하면 부모타입에 선언된 필드와 메소드만 사용 가능하다는 제약이 있다.