메소드를 호출할 때에는 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석이지만, 매개값을 다양화하기 위해 매개 변수에 자식 객체를 지정할 수도 있다.
매개 변수를 부모 타입(부모 클래스)으로 선언하면 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체를 제공할 수 있다.
public class Vehicle {
public void run() {
System.out.println("차량이 달립니다.");
}
}
// run() 메소드를 가지고 있는 Vehicle 클래스
public class Driver {
public void drive(Vehicle vehicle) {
vehicle.run();
}
}
// Driver 클래스의 drive() 메소드안에
// Vehicle 타입의 매개 변수를 선언한다.
public class DriverExample {
public static void main(String[] args) {
Driver driver = new Driver();
Vehicle vehicle = new Vehicle();
driver.drive(vehicle);
}
}
// 실행 결과
// 차량이 달립니다.
public class Bus extends Vehicle {
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
}
// Vehicle을 상속받는 Bus 클래스를 생성하고
// run() 메소드를 만들면 자동으로 @Override가 붙는다.
// override는 무시하다, ~보다 더 우선한다 등의 뜻이 있다.
// 부모 클래스의 run() 메소드를 자식 클래스에서 재정의 할 수 있다.
public class Taxi extends Vehicle {
@Override
public void run() {
System.out.println("택시가 달립니다.");
}
}
// 동일하게 Taxi 클래스 생성
public class DriverExample {
public static void main(String[] args) {
Driver driver = new Driver();
Bus bus = new Bus();
Taxi taxi = new Taxi();
driver.drive(bus);
driver.drive(taxi);
}
}
// 실행 결과
// 버스가 달립니다.
// 택시가 달립니다.
drive() 메소드를 만들 때 Vehicle 타입의 매개 변수를 넣어줌으로써 자식 클래스인 Bus와 Taxi의 값까지 가져올 수 있다.
자동 타입 변환 : 자식 타입이 부모 타입의 기능을 상속받기 때문에 부모 타입과 동일하게 취급될 수 있다는 것
부모타입 변수 = 자식타입;
강제 타입 변환 : 부모 타입을 자식 타입으로 변환하는 것
조건 : 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 반대로 변환할 때 사용
자식타입 변수 = (자식타입) 부모타입;
public class Parent {
public String field1;
public void method1() {
System.out.println("Parent-method1()");
}
public void method2() {
System.out.println("Parent-method2()");
}
}
// method1() 과 method2()를 가진 부모 클래스
public class Child extends Parent {
public String field2;
public void method3() {
System.out.println("Child-method3()");
}
}
// Parent를 상속받고 method3()이 있음
public class ChildExample {
public static void main(String[] args) {
Parent parent = new Child(); // 자동 타입 변환
parent.field1 = "data1";
parent.method1();
parent.method2();
Child child = (Child) parent; // 강제 타입 변환
child.field2 = "yyy";
child.method3();
}
}
// method3()을 사용하기 위해 자동 타입 변환된 상태에서
// 다시 자식 타입으로 강제 타입 변환
타입 확인하지 않고 강제 타입 변환 시도 시 ClassCastException 발생할 수 있다.
instanceof 연산자
boolean result = 좌항(객체) instanceof 우항(타입)
public class ChildExample {
public void method(Parent parent) {
if (parent instanceof Child) {
Child child = (Child) parent;
}
}
}
// Child가 Parent를 상속받기 때문에 예외 발생 X