다형성
여러 가지 형태를 가질 수 있는 능력, 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써
다형성을 프로그램 적으로 구현.
부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 한다.
ex)타이어 사용법은 모두 같지만 자동차에 어떤 타이어(객체)를 사용하느냐에 따라 성능이 달라짐.
다형성을 구현하려면 메소드 재정의와 타입 변환이 필요
메소드 재정의 + 타입변환 => 다형성
자동 타입 변환
다른 타입으로 변환하는 행위
클래스도 마찬가지로 타입 변환이 있는데, 클래스의 변환은 상속관계에 있는 클래스 사이에서 발생
자식은 부모타입으로 자동 타입 변환이 가능
B b = new B();
C c = new C();
D d = new D();
E e = new E();
A a1 = b; //가능
A a2 = c; //가능
A a3 = d; //가능
A a4 = e; //가능
B b1 = d; //가능
C c1 = e; //가능
B b3 = e; //불가능
C c2 = d; //불가능
모두 타입변환이 가능하지만 D객체는 C 타입으로 변환할 수 없고, E 객체는 B타입으로 변환될 수 없다.
이유는 상속 관계가 아니기 때문이다.
필드의 다형성
자동타입이 필요한 이유는 다형성을 구현하기 위해서이다.
필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다.
이것이 필드의 다형성이다.
자동차를 예로 들어보자. 자동차를 구성하는 부품은 언제든 교체할 수 있다.
고장이 날수도 있고, 성능이 더 좋은 부품으로 교체될 수도 있다.
프로그램은 수많은 객체들이 서로 연결되고 각자의 역할을 하게 되는데, 이 객체들은 다른 객체로
교체될 수 있어야 한다.
public class Car {
Tire frontLeftTire = new Tire();
Tire frontRightTire = new Tire();
Tire backLeftTire = new Tire();
Tire backRightTire = new Tire();
}
public class Driver{
public static void main(String[] args){
Car Qm6 = new Car();
Qm6.frontLeftTire = new KumhoTire();
Qm6.backRightTire = new HankookTire();
//Car 타입의 Qm6 객체를 정의 하였으며 앞 2바퀴를 한국,금호 타이어 객체를 사용하여 대입
//한국, 금호 클래스 객체를 넣어도 문제가 없는 이유는 Car클래스에서 각각 타입이
//Tire(부모)라 자동형변환이 되었다.
}
}
public class HankookTire extends Tire{ //Tire 클래스를 상속받은 한국타이어
public void changetire(){
System.out.println("한국타이어");
}
}
public class KumhoTire extends Tire{ //Tire 클래스를 상속받은 금호타이어
public void changetire(){
System.out.println("금호타이어");
}
}
매개 변수의 다형성
자동 타입 변환은 필드의 값을 대입할 때에도 발생하지만 주로 메소드를 호출할 때 많이 발생
메소드를 호출할 때에는 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석,
매개값을 다양화 하기 위해 매개 변수에 자식 객체를 지정할 수도 있다.
public class Driver1{ //Driver 클래스는 설계시 driver메소드 파라미터로 vehicle타입을 가지고 왔다.
public void driver1 (Vehicle vehicle){
vehicle.run();
}
}
public class Vehicle{
public void run(){
System.out.println("차량이 달립니다.");
}
}
public class Bus extends Vehicle{ //Vehicle를 상속받은 Bus는 Run 메소드를 오버라이드
@Override
public void run(){
System.out.println("버스가 달립니다.");
}
}
public class Taxi extends Vehicle{ //Vehicle를 상속받은 Taxi는 Run 메소드를 오버라이드
@Override
public void run(){
System.out.println("택시가 달립니다.");
}
}
public DriverEx{
public static void main(String[] args){
Driver1 sungman = new Driver1();
Bus mybus = new Bus();
Taxi mytaxi = new Taxi();
sungman.driver1(mytaxi);
sungman.driver1(mybus);
}
}
//sungnama 객체에서 driver1함수 호출 파라미터로 Bus, Taxi객체를 대입
// 대입이 가능한 이유는 Driver1 클래스 설계 시 부모 타입의 Vehicle로 설계 되었기 때문
필드,매개변수 다형성에 대한 공통점은
부모타입을 상속받은 자식타입 객체가 부모타입에 대입도 문제가 없다는것을 보여준다.(자동형변환)
'Java > Java' 카테고리의 다른 글
[Java] 인터페이스(Interface) (0) | 2022.12.05 |
---|---|
[Java] 추상 클래스, 메소드 (0) | 2022.12.02 |
[Java] 상속 (0) | 2022.11.30 |
[Java]public static void (0) | 2022.11.27 |
[Java]오버라이딩 (Override) (0) | 2022.11.27 |
댓글