타입을 변환하는 것(=형변환)
int a = 0.1; // (1) 에러 발생 X
int b = (int) true; // (2) 에러 발생 O, boolean은 int로 캐스트 불가
(1)은 0.1이 double형이지만 int로 될 정보 또한 가지고 있음
(2)는 true는 int형이 될 정보를 가지고 있지 않음
1. 다형성 : 오버라이딩 된 함수를 분리해서 활용할 수 있음
2. 상속 : 캐스팅을 통해 범용적인 프로그래밍 가능
자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것
Parent p = new Child(); // (Parent) new Child()할 필요가 없음
➡️ Parent를 상속받은 Child는 Parent의 속성을 포함하고 있기 때문
업캐스팅된 것을 다시 원상태로 돌리는 것
Parent p = new Child();
Child c = (Child) p;
➡️ 다운캐스팅은 업캐스팅이 발생한 이후에 작용
class Parent {
int age;
Parent() {}
Parent(int age) {
this.age = age;
}
void printInfo() {
System.out.println("Parent Call");
}
}
class Child extends Parent {
String name;
Child() {}
Child(int age, String name) {
super(age);
this.name = name;
}
@Override
void printInfo() {
System.out.println("Child Call!!!!");
}
}
public class test {
public static void main(String[] args) {
Parent p = new Child();
p.printInfo(); // 문제1 : 출력 결과는?
Child c = (Child) new Parent(); //문제2 : 에러 종류는?
}
}
자바에서는 오버라이딩된 함수를 동적 바인딩 하기 때문에 Parent에 담겼어도 Child의 printInfo() 함수를 불러온다.
컴파일 과정에서는 데이터형의 일치만 따진다. 프로그래머가 따로 Child로 형변환을 해줬기 때문에 컴파일러는 문법이 맞다고 생각해서 넘어간다. 하지만 런타임 과정에서 Child 클래스에 Parent 클래스를 넣을 수 없다는 것을 알게 되고, 런타임 에러가 나게 된다.