부모타입으로 자식객체를 참조하게 되면 부모가 가지고 있는 메소드만 사용할 수 있다. 자식객체가 가지고 있는 메소드나 속성을 사용하고 싶다면 형변환 해야 한다.
형변환
public class Car{
public void run(){
System.out.println("Car의 run메소드");
}
}
public class Bus extends Car{
public void ppangppang(){
System.out.println("빵빵.");
}
}
상속관계란 is a 관계라고 말했었습니다. Bus는 Car다. 라는 관계가 성립되는 것이죠.
현실에서도 우리는 버스를 가리키면서 차다. 라고 말하곤 합니다.
부모타입으로 자식객체를 참조하게 되면 부모가 가지고 있는 메소드만 사용할 수 있다.
public class BusExam{
public static void main(String args[]){
Car car = new Bus();
car.run();
car.ppangppang(); // 컴파일 오류 발생
}
}
public class BusExam{
public static void main(String args[]){
Car car = new Bus();
car.run();
//car.ppangppang(); // 컴파일 오류 발생
Bus bus = (Bus)car; //부모타입을 자식타입으로 형변환
bus.run();
bus.ppangppang();
}
}
객체들 끼리도 형변환이 가능하다. 단 상속관계에 있었을 때만 가능하다.
부모타입으로 자식타입의 객체를 참조할 때는 묵시적으로 형변환이 일어난다.
부모타입의 객체를 자식타입으로 참조하게 할때는 명시적으로 형변환 해주어 한다. 단 이렇게 형변환 할때에는 부모가 참조하는 인스턴스가 형변환 하려는 자식타입일 때만 가능하다.
=> car가 참조하는 객체가 원래 Bus 였기 때문에 가능하다.
즉, 실제로 생성되었을 때의 Bus였기 때문에 가능 .
Car car = new Car();일 경우 불가능하다.
다음과 같이 Person 클래스와 이를 상속받는 클래스들이 있다고 하자
class Person {
.....
}
class Student extends Person{
.....
}
class Researcher extends Person{
.....
}
class Professor extends Researcher{
.....
}
person p = new Person();
person p = new Student();
person p = new Researcher();
person p = new Professor();
이와 같은 경우에 Person 타입의 레퍼런스 p가 있을때, p가 person 객체를 가리키는지, student 객체를 가리키는지, professor 객체를 가리키는지 알 수 없다
=> 레퍼런스가 가리키는 객체가 어떤 클래스 타입인지 구분하기 위해, 자바에서는 instanceof 연산자를 사용한다
레퍼런스 instanceof 클래스명
Person jae = new Student();
if(jae instanceof Person) // true
if(Jae instanceof Student) // true
if(jae instanceof professor) // false