개념은 다형성 파트를 참고하자.
public static class Unit {
public void attack() {
System.out.println("평타");
}
}
public static class Kindred extends Unit{
String name;
public void attack() {
System.out.println("활 쏘기");
}
public void qSkill() {
System.out.println("폴짝");
}
}
상속관계를 가지는 클래스를 정의한다.
public static void main(String[] args) {
Kindred kindred = new Kindred();
// Unit unitUp = (Kindred) kindred;
Unit unitUp = kindred; // 윗줄과 같은 의미를 가진다.
unitUp.attack(); // 업캐스팅 시 unitup은 Unit의 멤버만 갖는다.
// 어라라 ? 분명 Unit의 멤버만 갖는다고 했는데
// Kindred 클래스의 attack 메서드가 출력되었다.
// 이유는 다음과 같다.
// 오버라이딩된 메서드를 업캐스팅한경우 부모의 메서드가 아닌 오버라이딩된 메서드가 실행된다.
// 오버라이딩 특성상 코드가 실행하는 런타임 환경에서 동적으로 바인딩 되었기 때문.
}
동일성을 가진 부분을 만들어 간단히 다루기 위함이다.
상속관계에서 받은 sub클래스가 백개, 천개라도 하나의 인스턴스로 묶어서 관리가 가능하기 때문이다.
하나의 자료형으로 관리하면 코드를 줄이고, 가독성이 향상되며
유지보수가 용이하다.
자식클래스의 고유 메서드를 실행하려면,
다운캐스팅이 필요하다.
부모크클래스가 자식클래스의 타입으로 캐스팅되는것을 말한다.
다운캐스팅은 연산자 괄호의 생략이 불가하다.
다운캐스팅은 단순히 업캐스팅의 반대개념은 아니다.
업캐스팅된 자식클래스를 복구하여 자식클래스의 멤버를 회복하기위함이다.
원래 기능을 회복하기위해 실행하는 것이다.