class Animal {
    int age;
    void speak() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

class Dog extends Animal {
    String type;
    @Override
    void speak() {
        System.out.println("멍멍");
    }
}

public class TestCasting {
    public static void main(String[] args) {
        Animal a = new Dog();   // ①　업캐스팅: 자식 객체를 부모 객체로 형변환
        a.speak();                // ②　동적 메소드 호출: 자식 객체의 speak() 호출

        Dog d = (Dog) a;        // ③　다운캐스팅: 부모 객체를 자식 객체로 형변환
        d.speak();                // ④　메소드 오버라이딩: 자식 객체의 speak() 호출
    }
}