객체지향 개념에서 다형성은 여러 가지 형태를 가질 수 있는 능력을 의미한다.
한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있게 한다.
-> 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 한다.
업캐스팅 : 자식클래스 객체가 부모 클래스 타입으로 형변환되는 것
다운캐스팅 : 업캐스팅 된 것을 다시 원상태로 돌리는 것. 타입을 명시적으로 지정해줘야 한다.
public class UpDownCasting {
public static void main(String[] args) {
// 부모 클래스 타입에 자식 클래스 타입의 객체가 생성된 주소를 대입했으므로 정상적으로 처리된다.
// Base b = new Sub(); // 정상 실행
// 자식 클래스 타입에 부모 클래스 타입의 객체가 생성쇤 주소를 대입했으므로 에러가 발생된다.
// Sub s = new Base(); // 에러 발생
// 부모 클래스 타입의 객체에 자식 클래스 타입의 객체가 생성된 주소를 대입한다. => upcasting
Base b = sub;
// 자식 클래스 타입의 객체에 부모 클래스 타입의 객체가 생성된 주소를 대입한다.
// Sub s = base; // 에러 발생
// 자식 클래스 타입에 부모 클래스 타입의 객체가 생성된 주소를 대입하면 에러가 발생되는데 이 때 casting 시켜서 대입하면 대입은
// 가능하다. 이 경우 문법적인 오류는 발생되지 않지만 프로그램 실행 단계에서 ClassCaseException이 발생된다.
// Sub s = (Sub) base; // casting 시키면 문법적인 에러는 발생되지 않는다.
// instanceof 연산자는 객체가 instanceof 뒤에 지정된 클래스 타입으로 안전하게 형변환이 가능한지 검사한다.
// 형식 => 객체이름 instanceof 클래스이름
if (sub instanceof Base) {
Base base2 = sub;
base2.say();
} else {
System.out.println("Sub 클래스 타입의 객체는 Base 클래스 타입으로 형변환 시킬 수 없습니다.");
}
if (base instanceof Sub) {
Sub sub2 = (Sub) base;
sub2.say();
} else {
System.out.println("Base 클래스 타입의 객체는 Sub 클래스 타입으로 형변환 시킬 수 없습니다.");
}
try {
Sub sub2 = (Sub) base;
sub2.say();
} catch (ClassCastException e) {
System.out.println("Base 클래스 타입의 객체는 Sub 클래스 타입으로 형변환 시킬 수 없습니다.");
}
}
}