반응형
자동 타입 변환(Promotion)은 부모 타입에 모든 자식 객체가 대입되어 사용할 수 있다는 것이다.
자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
자동 타입 변환은 메소드 구현 상황에서 자주 발생한다.
메소드 호출 시 매개 변수의 타입과 동일한 매개 값을 지정하는 일반적인 방법에서 벗어나 매개 변수에 자식 타입 객체를 지정할 수 있다면 매개 값을 다양화할 수 있다.
매개 변수의 타입이 클래스인 경우, 해당 클래스의 객체 뿐만이 아니라 자식 객체까지도 매개 값으로 사용할 수 있다.
매개 값으로 어떤 자식 객체가 제공되느냐에 따라 메소드의 실행 결과가 다양해진다.
자식 객체가 부모 클래스의 메소드를 오버라이딩했다면 메소드 내부에서 오버라이딩된 메소드를 호출하여 메소드 실행 결과가 다양해진다.
public class Vehicle {
public void run() {
System.out.println("차량이 달린다.");
}
}
public class Driver {
public void drive(Vehicle vehicle) {
vehicle.run();
}
}
Vehicle 클래스가 있고, Driver 클래스에서 정의한 drive() 메소드의 매개값으로 Vehicle 객체 타입을 받도록 구현한다.
현재 상황에서 drive() 메소드를 호출하면 Vehicle 메소드의 run() 메소드 실행 결과가 출력된다.
이제 Vehicle 클래스를 상속받는 Bus, Taxi 클래스를 구현한다.
부모 클래스인 Vehicle 클래스의 run() 메소드를 오버라이딩한다.
public class Bus extends Vehicle{
@Override
public void run() {
System.out.println("버스가 달린다.");
}
}
public class Taxi extends Vehicle{
@Override
public void run() {
System.out.println("택시가 달린다.");
}
}
아래 실행 결과를 살펴보면 매개 변수의 타입이 클래스인 경우, 해당 클래스의 객체 뿐만이 아니라 자식 객체까지도 매개값으로 사용할 수 있다는 것을 알 수 있다.
public class Main {
public static void main(String[] args) {
Driver driver = new Driver();
Bus bus = new Bus();
Taxi taxi = new Taxi();
// 자동 타입 변환(Vehicle vehicle = bus)
driver.drive(bus);
// 자동 타입 변환(Vehicle vehicle = taxi)
driver.drive(taxi);
}
}
결과)
버스가 달린다.
택시가 달린다.
참고
반응형
'Programming > Java' 카테고리의 다른 글
[Java] toString() 메소드는 왜? (2) | 2022.01.27 |
---|---|
[Java] DTO / VO (0) | 2021.12.22 |
[Java] String이 불변(Immutable) 객체인 이유 (0) | 2021.12.11 |
[Java] Spring Pool (0) | 2021.12.11 |
[Java] 자바 스트림(stream) (0) | 2021.11.30 |