JAVA - 클래스의 형변환

클래스는 형변환이 가능하다고 하다. 보다 정확히 이야기하자면, 상속관계에서 수퍼 클래스를 서브 클래스처럼 사용할 수 있다는 이야기이다.

원래 서브 클래스는 수퍼 클래스처럼 사용할 수있다. 서브 클래스에서 선언하지 않아도 수퍼 클래스에 선언 또는 호출되어 있다면 해당 기능(메서드)를 사용할 수 있기 때문이다. 그래서

1
public class Sub extends Super { }

위와 같은 상속관계를 Sub 는 Super이다 라고 표현할 수 있다고 한다. Super 클래스의 기능을 Sub 클래스에서 똑같이 사용할 수 있기 때문에 Sub 클래스를 Super클래스라 하더라도 맞는 표현이 될 수 있다.

1
2
3
4
5
// B는 A이다 는 아래로 표현될 수 있다.
Sub sub = new Super();

// 이건 에러를 유발한다.
Super super = new Sub();

반면 위와 같은 상속관계에서 Super는 Sub이다 라고 할수는 없다. Super 클래스에서는 Sub 클래스의 메서드는 사용할 수 없기 때문이다. 예제 코드를 통해 확인해보도록 하자.

Car 클래스와 Bus클래스가 상속관계이며, main()에서 Bus 클래스로부터 Car 클래스 타입의 car 인스턴스를 생성했다.

1
Car car = new Bus(); // Car 클래스 타입의 인스턴스 car는 새로운 Bus 객체이다.

Car.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package devandy.java.conversion;

public class Car {
public void run() {
System.out.println("차가 달립니다.");
}

public void run(String name) {
System.out.println(name.concat("가 달립니다."));
}

public void run(String name, int speed) {
System.out.println(name+"가 시속 "+speed+"km/h로 달립니다.");
}
}

Bus.class

1
2
3
4
5
6
7
8
package devandy.java.conversion;

public class Bus extends Car {

public void run(int speed) {
System.out.println("버스가 시속 "+speed+"km/h로 달립니다.");
}
}

CarExam.class

1
2
3
4
5
6
7
8
package devandy.java.conversion;

public class CarExam {
public static void main(String[] args) {
Car car = new Bus(); // Car 클래스 타입의 인스턴스 car는 새로운 Bus 객체이다.
car.run();
}
}

그리고 car.run()를 호출해보면, Bus 클래스엔 없는 파라미터가 없는 run()Car 클래스로부터 상속받아서 호출을 한다.

1
차가 달립니다.

그런데 위에서 생성한 인스턴스로는 Bus 클래스에서 int형 변수를 파라미터로 받는 run()를 호출할 수가 없다. Car 클래스 타입의 인스턴스 car는 서브클래스인 Bus 클래스의 기능을 알지 못하기 때문이다.

따라서 이럴 때엔 Car클래스 타입의 인스턴스로부터 Bus 클래스 타입의 인스턴스를 생성함으로써 형변환을 통해 Bus 클래스의 메서드를 호출할 수 있다.

CarExam.class

1
2
3
4
5
6
7
8
9
10
package devandy.java.conversion;

public static void main(String[] args) {
Car car = new Bus();
car.run();

Bus bus = (Bus)car; // 클래스 타입의 형변환
bus.run(70);
}
}

위와 같이 코드를 추가하고, 실행하면 다음과 같이 원하는대로 출력이 된다.

1
2
차가 달립니다.
버스가 시속 70km/h로 달립니다.

결론은, 서브 클래스로부터 수퍼 클래스의 인스턴스를 생성할 수 있지만, 서브 클래스의 기능을 전부 사용하지는 못한다. 따라서 이 때는 수퍼 클래스를 서브클래스로 형변환하는 일이 필요해진다.