
상속, interface를 배우고 다형성을 배우면서 의문이 드는 점이 있었다.

Vehicle이라는 추상클래스를 상속받아서 구현한 Car와 Airplane이라는 클래스가 있다. 그 중 Airplane이라는 클래스는 Flyable이라는 인터페이스도 함께 구현하였다.
이 둘을 Vehicle 배열에 넣어놓으면 Car에서 구현하거나 Airplane에서 구현한 함수는 호출이 불가하였다.
이부분을 어떻게 구현할까 고민하다 형변환이 가능 한 것을 발견하였다.
형변환은 기본자료형에서만 가능 할 줄 알았지만 참조 변수도 형변환이 가능하다고 하다.
형 변환을 위한 조건
서로 상속관계에 있는 상위 클래스 : 하위 클래스 사이에만 형 변환이 가능하다.
업 캐스팅(하위 클래스 타입에서 상위 클래스 타입으로 형 변환)은 형 변환 연산자를 생략할 수 있다.
다운 캐스팅(상위 클래스에서 하위 클래스 타입으로 변환)은 형 변환 연산자를 반드시 작성해야 한다.
출처: https://ittrue.tistory.com/132 [IT is True:티스토리]
업캐스팅
업캐스팅의 경우 형변환 연산자 생략가능 (Vehicle) 생략가능!
Vehicle airplane = (Vehicle) new Airplane();에서
다운캐스팅
다운캐스팅의 경우 형 변환 연산자를 반드시 작성해야한다.
((Airplane) airplane).fly();
형변환을 이용하여 상위클래스 배열에 넣어놨더라도 하위 클래스에 있는 메소드를 호출 가능하다.

vehicle에 추상메소드로 move가 있어서 vehicle배열에 car와 airplane인스턴스를 추가하여 반복문돌릴때 move호출이 가능하다.
//추상클래스 Vehicle
public abstract class Vehicle {
abstract public void move();
}
//Main 클래스
public class VehicleMain {
public static void main(String[] args) {
ArrayList<Vehicle> vehicles = new ArrayList<>();
vehicles.add(new Car());
vehicles.add(new Airplane());
for(Vehicle vehicle:vehicles) {
vehicle.move();
}
}
}
Airplane에서 Flyable을 상속받아 구현한 fly 메소드를 호출하고 싶은데
어떻게 할까 고민을하였다.
instanceof를 사용하면 형변환 가능여부 를 boolean으로 반환한다고한다.
그래서 vehicle을 Airplane클래스로 형변환이 가능하면 fly메소드를 호출하겠다. 이렇게 코드를 짜보았고 잘 동작하였다.
for(Vehicle vehicle:vehicles) {
vehicle.move();
if(vehicle instanceof Airplane) {
((Airplane) vehicle).fly();
}
}
고민이 되었던 부분이 해결되어서 뿌듯하다.
이맛에 공부하는 것 같다. 고민하던 수학문제 풀어내듯.. 고민하던부분해결하면 짜릿하다.
혹시 전체 코드가 필요한 사람들의 위해 소스코드를 첨부 및 깃헙 링크 첨부한다.
추상클래스, 인터페이스 구현 연습코드
public abstract class Vehicle {
private String name;
private int maxSpeed;
abstract public void move();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
}
public interface Flyable {
void fly();
}
public class Car extends Vehicle {
@Override
public void move() {
System.out.println("도로를 따라 이동 중");
}
}
public class Airplane extends Vehicle implements Flyable {
@Override
public void move() {
System.out.println("하늘을 날아가는 중");
}
@Override
public void fly() {
System.out.println("고도 10,000피트에서 비행 중");
}
}
public class VehicleMain {
public static void main(String[] args) {
ArrayList<Vehicle> vehicles = new ArrayList<>();
vehicles.add(new Car());
vehicles.add(new Airplane());
for(Vehicle vehicle:vehicles) {
vehicle.move();
if(vehicle instanceof Airplane) {
((Airplane) vehicle).fly();
}
}
}
}