JAVA

[JAVA] 다형성 (polymorphism)

개발 공주 2023. 6. 1. 14:48
728x90
  • 여러 가지 형태를 가질 수 있는 능력
  • 조상 타입 참조 변수로 자손 타입 객체를 다루는 것

📌 다형성이란 ‘여러 가지 형태를 가질 수 있는 능력’을 의미합니다.

  • 예를 들어 자동차의 핸들을 교체하면 핸들링이 부드러워지고 바퀴를 교체하면 승차감이 좋아집니다.
  • 소프트웨어 또한 구성하고 있는 객체를 바꿨을 때 소프트웨어의 실행 성능 및 결과물이 다르게 나올 수 있습니다.
  • 참조변수 타입변환을 활용해서 다형성을 구현할 수 있습니다.
Tire tire = new HankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");
  • 부모타이어 변수 = 자식타이어객체; 를 선언하여 자동 타입변환된 변수를 사용하여 각각의 자식타이어 객체에 재정의 된 메서드를 통해 다양한 승차감을 가진 자동차를 생성할 수 있습니다.
public Car(Tire tire) {
    this.tire = tire;
}

...

Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));
  • 매개변수에도 다형성이 적용될 수 있습니다.
  • Car 생성자에서 매개변수의 타입이 부모 타이어 이기 때문에 자식 타이어 객체들을 매개값으로 전달할 수 있습니다.
Tire getHankookTire() {
    return new HankookTire("HANKOOK");
}

Tire getKiaTire() {
    return new KiaTire("KIA");
}

...

Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();
  • 반환타입에도 다형성이 적용될 수 있습니다.
  • 반환타입이 부모 타이어 이기 때문에 자식 타이어 객체들을 반환값으로 지정할 수 있습니다.
  • 또한 자동 타입변환이된 반환값인 자식 타이어 객체를 강제 타입변환할 수도 있습니다.

예제코드

Tire 클래스 : 부모 클래스

public class Tire {
    String company; // 타이어 회사

    public Tire(String company) {
        this.company = company;
    }

    public void rideComfort() {
        System.out.println(company + " 타이어 승차감은?");
    }
}

KiaTire, HankookTire : 자식 클래스

public class KiaTire extends Tire{

    public KiaTire(String company) {
        super(company);
    }

    @Override
    public void rideComfort() {
        System.out.println(super.company + " 타이어 승차감은 " + 60);
    }
}


public class HankookTire extends Tire {

    public HankookTire(String company) {
        super(company);
    }

    @Override
    public void rideComfort() {
        System.out.println(super.company + " 타이어 승차감은 " + 100);
    }
}

Car 클래스

public class Car {
    Tire tire;

    public Car(Tire tire) {
        this.tire = tire;
    }

    Tire getHankookTire() {
        return new HankookTire("HANKOOK");
    }

    Tire getKiaTire() {
        return new KiaTire("KIA");
    }
}

Main 클래스

public class Main {
    public static void main(String[] args) {
        // 매개변수 다형성 확인!
        Car car1 = new Car(new KiaTire("KIA"));
        Car car2 = new Car(new HankookTire("HANKOOK"));

        // 반환타입 다형성 확인!
        Tire hankookTire = car1.getHankookTire();
        KiaTire kiaTire = (KiaTire) car2.getKiaTire();

        // 오버라이딩된 메서드 호출
        car1.tire.rideComfort(); // KIA 타이어 승차감은 60
        car2.tire.rideComfort(); // HANKOOK 타이어 승차감은 100
    }
}

'JAVA' 카테고리의 다른 글

[JAVA] 추상 클래스  (0) 2023.06.01
[JAVA] instanceof  (0) 2023.06.01
[JAVA] 참조변수의 타입변환  (0) 2023.06.01
[JAVA] super 및 super()  (0) 2023.06.01
[JAVA] 오버라이딩  (0) 2023.06.01