클래스는 형변환이 가능하다고 하다. 보다 정확히 이야기하자면, 상속관계에서 수퍼 클래스를 서브 클래스처럼 사용할 수 있다는 이야기이다.
원래 서브 클래스는 수퍼 클래스처럼 사용할 수있다. 서브 클래스에서 선언하지 않아도 수퍼 클래스에 선언 또는 호출되어 있다면 해당 기능(메서드)를 사용할 수 있기 때문이다. 그래서
1 | public class Sub extends Super { } |
위와 같은 상속관계를 Sub 는 Super이다
라고 표현할 수 있다고 한다. Super
클래스의 기능을 Sub
클래스에서 똑같이 사용할 수 있기 때문에 Sub
클래스를 Super
클래스라 하더라도 맞는 표현이 될 수 있다.
1 | // B는 A이다 는 아래로 표현될 수 있다. |
반면 위와 같은 상속관계에서 Super는 Sub이다
라고 할수는 없다. Super
클래스에서는 Sub
클래스의 메서드는 사용할 수 없기 때문이다. 예제 코드를 통해 확인해보도록 하자.
Car
클래스와 Bus
클래스가 상속관계이며, main()
에서 Bus
클래스로부터 Car
클래스 타입의 car
인스턴스를 생성했다.
1 | Car car = new Bus(); // Car 클래스 타입의 인스턴스 car는 새로운 Bus 객체이다. |
Car.class
1 | package devandy.java.conversion; |
Bus.class
1 | package devandy.java.conversion; |
CarExam.class
1 | package devandy.java.conversion; |
그리고 car.run()
를 호출해보면, Bus
클래스엔 없는 파라미터가 없는 run()
를 Car
클래스로부터 상속받아서 호출을 한다.
1 | 차가 달립니다. |
그런데 위에서 생성한 인스턴스로는 Bus
클래스에서 int형 변수를 파라미터로 받는 run()
를 호출할 수가 없다. Car
클래스 타입의 인스턴스 car
는 서브클래스인 Bus
클래스의 기능을 알지 못하기 때문이다.
따라서 이럴 때엔 Car
클래스 타입의 인스턴스로부터 Bus
클래스 타입의 인스턴스를 생성함으로써 형변환을 통해 Bus
클래스의 메서드를 호출할 수 있다.
CarExam.class
1 | package devandy.java.conversion; |
위와 같이 코드를 추가하고, 실행하면 다음과 같이 원하는대로 출력이 된다.
1 | 차가 달립니다. |
결론은, 서브 클래스로부터 수퍼 클래스의 인스턴스를 생성할 수 있지만, 서브 클래스의 기능을 전부 사용하지는 못한다. 따라서 이 때는 수퍼 클래스를 서브클래스로 형변환하는 일이 필요해진다.