한모로그 2023. 1. 19. 20:51

다형성

  • 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
  • 다형성을 구현하기 위해서는 자동 타입 변환과 메소드 재정의가 필요


    출처, 이것이 자바다


필드 다형성

  • 필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행 결과가 다양하게 나올 수 있는 것


    출처, 이것이 자바다



    출처, 이것이 자바다


package ch07.sec08.exam01;

public class Tire {
    //메소드 선언
    public void roll() {
        System.out.println("회전합니다.");
    }
}

package ch07.sec08.exam01;

//자식클래스
public class HankookTire extends Tire {
    @Override
    public void roll() {
        System.out.println("한국 타이어가 회전합니다.");
    }
}

package ch07.sec08.exam01;

//자식클래스
public class KumhoTire extends Tire {
    @Override
    public void roll() {
        System.out.println("금호 타이어가 회전합니다.");
    }
}

package ch07.sec08.exam01;

public class Car {

    //필드 선언 : 필드 다형성
    public Tire tire;

    //메소드 선언
    public void run() {
        //tire필드에 자식객체가 대입이 되고,
        //roll()메소드가 재정의 된것이라면,
        //자식객체의 roll()메소드가 호출된다.
        tire.roll();
    }
}

package ch07.sec08.exam01;

public class CarExample {

    public static void main(String[] args) {
        //Car 객체 생성 : 기본본체생성
        Car myCar = new Car();

        //1)Tire 객체 장착(기본)
        myCar.tire = new Tire();
        myCar.run();

        //2)HankookTire 객체 장착. Tire부모클래스로 자동형변환
        myCar.tire = new HankookTire();
        myCar.run();

        //3)KumhoTire 객체 장착. Tire부모클래스로 자동형변환
        myCar.tire = new KumhoTire();
        myCar.run();
    }

}

매개변수 다형성

  • 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 자식 객체를 제공할 수 있음
  • 어떤 자식 객체가 제공되느냐에 따라서 메소드의 실행 결과가 달라짐


    출처, 이것이 자바다


package ch07.sec08.exam02;

public class Vehicle {

    //메소드 선언
    public void run() {
        System.out.println("차량이 달립니다.");
    }
}

package ch07.sec08.exam02;

public class Bus extends Vehicle {

    //메소드 재정의(오버라이딩)
    @Override
    public void run() {
        System.out.println("버스가 달립니다.");
    }
}

package ch07.sec08.exam02;

public class Taxi extends Vehicle {

    //메소드 재정의(오버라이딩)
    @Override
    public void run() {
        System.out.println("택시가 달립니다.");
    }
}

package ch07.sec08.exam02;

public class Truck extends Vehicle {

    @Override
    public void run() {
        System.out.println("트럭이 달립니다.");
    }
}

package ch07.sec08.exam02;

public class Driver {

    //메소드 선언(클래스 타입의 매개변수를 가지고 있음) - 매개변수의 다형성(부모클래스의 메소드를 자식클래스에서 재정의 해야 한다.)
    public void drive(Vehicle vehicle) {
        vehicle.run();
    }
}

package ch07.sec08.exam02;

public class DriveExample {

    public static void main(String[] args) {

        //Driver 객체 생성 : 운전사
        Driver driver = new Driver();

        //매개값으로 Bus 객체를 제공하고 driver() 메소드 호출
        //버스 운전
        Bus bus = new Bus();
        driver.drive(bus);

        //매개값으로 Taxi 객체를 제공하고 driver() 메소드 호출
        Taxi taxi = new Taxi();
        driver.drive(taxi);

        Truck truck = new Truck();
        driver.drive(truck);
    }

}