한모로그 2023. 1. 21. 13:00

다형성

  • 사용 방법은 동일하지만 다양한 결과가 나오는 성질


    출처, 이것이 자바다


  • 인터페이스 역시 다형성을 구현하기 위해 재정의와 자동 타입 변환 기능을 이용


    출처, 이것이 자바다


필드의 다형성


출처, 이것이 자바다


package ch08.sec11.exam01;

public interface Tire {
    //추상 메소드
    void roll();
}

package ch08.sec11.exam01;

public class HankookTire implements Tire {
    //추상 메소드 재정의
    @Override
    public void roll() {
        System.out.println("한국 타이어가 굴러갑니다.");

    }

}

package ch08.sec11.exam01;

public class KumhoTire implements Tire {
    //추상 메소드 재정의
    @Override
    public void roll() {
        System.out.println("금호 타이어가 굴러갑니다.");

    }

}

package ch08.sec11.exam01;

public class Car {
    //필드. 부모 인터페이스 변수 = 구현객체
    Tire tire1 = new HankookTire();
    Tire tire2 = new HankookTire();

    //메소드
    void run() {
        tire1.roll();
        tire2.roll();
    }
}

package ch08.sec11.exam01;

public class CarExample {

    public static void main(String[] args) {
        //자동차 객체 생성
        Car mycar = new Car();

        //run() 메소드 실행
        mycar.run();

        //타이어 객체 교체
        mycar.tire1 = new KumhoTire();
        mycar.tire2 = new KumhoTire();

        //run() 메소드 실행(다형성 : 실행 결과가 다름)
        mycar.run();

    }

}

매개변수의 다형성

  • 매개변수 타입을 인터페이스로 선언하면 메소드 호출 시 다양한 구현 객체를 대입할 수 있음


    출처, 이것이 자바다



    출처, 이것이 자바다


package ch08.sec11.exam02;

public interface Vehicle {

    //추상 메소드
    void run();
}

package ch08.sec11.exam02;

public class Driver {

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

package ch08.sec11.exam02;

public class Bus implements Vehicle {

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

package ch08.sec11.exam02;

public class Taxi implements Vehicle {

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

package ch08.sec11.exam02;

public class Truck implements Vehicle {

    //추상 메소드 재정의
    @Override
    public void run() {
        System.out.println("트럭이 달립니다.");
    }
}

package ch08.sec11.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);
    }

}