활용
다형성: 오버라이딩된 함수를 분리해서 사용
상속: 캐스팅을 통해 범용적인 프로그래밍
종류
묵시적 형변환(업캐스팅): 캐스팅이 자동 발생
Animal dog = new Dog();
명시적 형변환(다운캐스팅): 캐스팅할 내용을 적어줘야함
다운캐스팅은 업캐스팅 발생 이후에 작용한다.
Animal dog = new Dog();
Dog c = (Dog) p;
class Animal {
int name;
Animal() {}
Animal(int name) {
this.name = name;
}
void printInfo() {
System.out.println("Animal");
}
}
class Dog extends Animal {
String name;
Dog() {}
Dog(int age, String name) {
super(age);
this.name = name;
}
@Override
void printInfo() {
System.out.println("Dog");
}
}
public class Main {
public static void main(String[] args) {
Animal p = new Dog();
p.printInfo();
Dog c = (Dog) new Animal();
}
}
Dog 출력
자바에서는 오버라이딩된 함수를 동적 바인딩하기 때문에, Animal에 담겼어도 Dog의 printInfo() 함수를 불러오게 된다.
런타임 에러
컴파일 과정에서는 데이터형의 일치만 따진다. 프로그래머가 따로 (Dog)로 형변환을 해줬기 때문에 컴파일러는 문법이 맞다고 생각해서 넘어간다. 하지만 런타임 과정에서 Dog 클래스에 Animal 클래스를 넣을 수 없다는 것을 알게 되고, 런타임 에러가 나오게 되는것!