타입 변환이란 타입을 다른 타입으로 변환하는 것을 말한다.
클래스도 타입변환이 있는데 클래스의 타입 변환은 상속 관계에 있는 클래스 사이에서 발생한다.
의미 그대로 자동적으로 타입 변환이 일어나는 것을 말한다.
부모타입 변수 = 자식타입 객체;
class Parent {
void method1() {...}
void method2() {...}
}
class Child extends Parent {
void method2() {...} // 오버라이딩
void method3() {...}
}
class ChildExample {
public static void main(String[] args) {
Child child = new Child();
Parent parent = child;
parent.method1();
parent.method2(); //오버라이딩한 child 메소드가 호출댐
parent.method3(); //호출불가능
}
자식 타입은 부모 타입으로 자동 변환되지만, 반대로 부모 타입은 자식 타입으로 자동 변환되지 않는다. 대신 캐스팅 연산자로 강제 타입 변환을 할수 있다.
자식타입 변수 = (자식타입) 부모타입객체;
그렇다고 해서 부모 타입 객체를 자식 타입으로 무조건 강제 변환할 수 있는 것은 아니다. 자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
parent parent = new Child(); //자동 타입 변환
Child child = (Child) parent; //강제 타입 변환
자식 객체가 부모 타입으로 자동 변환하면 부모 타입에 선언된 필드와 메소드만 사용 가능하다는 제약 사항이 따른다. 만약 자식 타입에 선언된 필드와 메솓를 꼭 사용해야 한다면 강제 타입 변환을 해서 다시 자식 타입으로 변환해야 한다.
class Parent {
String field1;
void method1() {...}
void method2() {...}
}
class Child extends Parent {
String field2;
void method3() {...}
}
class ChildExample {
public static void main(String[] args) {
Parent parent = new Child();
parent.field1 = "xxx";
parent.method1();
parent.method2();
parent.field2 = "yyy"; // 불가능
parent.method3(); // 불가능
Child child = (Child) parent;
child.field2 = "yyy"; // 가능
child.method3(); // 가능