본문 바로가기

Programming/Java

[Java] 매개변수의 다형성

반응형

자동 타입 변환(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);
    }
}

결과)
버스가 달린다.
택시가 달린다.

 

참고

http://www.yes24.com/Product/Goods/15651484

 

이것이 자바다 - YES24

15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서. 저자 직강의 인터넷 강의와 Q/A를 위한 커뮤니티(네이커 카페)까지 무료로 제공하여 자바 개발자로 가

www.yes24.com

반응형

'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