다운캐스팅, Downcasting
public class Day3 {
public static void main(String[] args) {
class Apple {
void func02() {
System.out.println("Apple's func02");
}
}
class Banana extends Apple {
void func01() {
System.out.println("Banana's func01");
}
}
class Orange extends Apple {
void func01() {
System.out.println("Orange's func01");
}
}
Apple apple = new Banana();
apple.func02();
// apple이 자식 Banana클래스 안의 func01를 쓰고 싶을 때! -> Downcasting
Banana banana = (Banana) apple;
banana.func01();
banana.func02();
Orange org = new Orange();
org = (Orange) apple; // ClassCastException
}
}
// 이미 부모 클래스인 Apple 타입으로 Upcasting 되어 있으면 자식클래스(Banana)에 접근할 수가 없다. 자식클래스의 고유의 메소드에 접근하고자 할 때 Downcasting을 사용한다.
class Apple {
void f0() {
System.out.println("0");
}
}
class Banana extends Apple {
void f1() {
System.out.println("1");
}
}
class Orange extends Apple {
void f2() {
System.out.println("2");
}
}
class In {
void f3(Apple a) {
if (a instanceof Apple) {
Apple aa = (Apple) a;
a.f0();
}
if (a instanceof Banana) {
Banana b = (Banana) a; // Downcasting
b.f1();
}
if (a instanceof Orange) {
Orange org = (Orange) a;
org.f2();
}
}
}
public class Day3 {
public static void main(String[] args) {
Apple a = new Apple();
Banana b = new Banana();
Orange org = new Orange();
In d = new In();
d.f3(b); // Upcasting
}
}