객체 지향의 꽃
다형성이란 상속을 전제로 하여 하나의 클래스(메소드)가 다양한 방식으로 동작하는 것을 말한다. 상위클래스가 하위클래스에게 동일한 메세지로 서로 다르게 동작시키는 것이다.
하나의 메소드로 자식클래스에서 다양한 메소드로 오버라이딩 하여 쓸수 있어 재사용성이 높아진다.
업캐스팅, 다운캐스팅, 오버라이드가 쉽게 생각할 수 있는 다형성의 한 모습이다.
다형성 인수
아래의 경우 오버로딩하는 하는 것이 일반적이다.
하지만, 메소드가 많을때는 확장하는데 어려움이 있다.
package com.java.poly01;
import com.java.poly01.mycar.Sedan;
import com.java.poly01.mycar.Truck;
public class Poly01 {
public static void main(String[] args) {
// 다형성
Sedan s = new Sedan();
display(s);
Truck t =new Truck();
display(t);
}
//오버로딩
private static void display(Sedan s) {
s.aiDriving();
s.doorOpen();
s.startOfCar();
s.manOfCar();
}
private static void display(Truck t) {
t.doorOpen();
t.manOfCar();
t.startOfCar();
t.startOfCar();
}
}
이럴때 상속 받은 자식들에 한에 부모 클래스 타입의 객체를 매개 변수로 받을 수 있는데 이를 다형성 인수라 한다.
package com.java.poly01;
import com.java.poly01.mycar.Car;
import com.java.poly01.mycar.Sedan;
import com.java.poly01.mycar.Truck;
public class Poly02 {
public static void main(String[] args) {
// 다형성을 사용하는 이유: 다형성 인수
Sedan s = new Sedan();
display(s);
Truck t =new Truck();
display(t);
}
//메서드를 오버로딩 하지 않고 메서드를 하나만 이용해서 표현 하시오.
//Car c = new Sedan(); --> Car c = s
//Car c = new Truck(); -->Car c = t;
private static void display(**Car c**) { //Car c = s;
if(c instanceof Sedan) {
//오버라이드 된 메서드 : 묵시적 형변환
c.doorOpen();
c.manOfCar();
c.startOfCar();
//오버라이드 안된 메서드 :명시적 형변환
((Sedan)c).aiDriving();
}
if(c instanceof Truck) {
c.doorOpen();
c.manOfCar();
c.startOfCar();
((Truck) c).lifting();
}
}
// private static void display(Sedan s) {
// // TODO Auto-generated method stub
//
// }
private static void display(Object o) { //Car c = s;
if(o instanceof Sedan) {
//오버라이드 된 메서드 : 묵시적 형변환
((Sedan)o).doorOpen();
((Sedan)o).manOfCar();
((Sedan)o).startOfCar();
//오버라이드 안된 메서드 :명시적 형변환
((Sedan)o).aiDriving();
}
if(o instanceof Truck) {
((Sedan)o).doorOpen();
((Sedan)o).manOfCar();
((Sedan)o).startOfCar();
((Truck) o).lifting();
}
}
}

다형성 배열
다형성을 배열에 적용하는 것이다.
package com.java.poly01;
import com.java.poly01.mycar.Car;
import com.java.poly01.mycar.Sedan;
import com.java.poly01.mycar.Truck;
public class Poly03 {
public static void main(String[] args) {
// 다형성 > 다형성 배열
Car[] c = new Car[2];
// 1.하위 객체(Sedan,Truck)로 배열에 주소값을 입력하세요
// Sedan s = new Sedan();
// c[0] =s; //첫번째 배열의 주소값 저장한다.
//
// Truck t = new Truck();
// c[1]=t;
c[0] = new Sedan();
c[1] = new Truck();
// 2.diplay() 메서드를 이용해 구현해 보세요
display(c);
}
private static void display(Car[] c) { // Car[] c=c;
// 배열(for) + 인스턴스(객체)(if)
for (int i = 0; i < c.length; i++) {
// 오버라이드 된 메서드 : 묵시적 형변환
c[i].doorOpen();
c[i].manOfCar();
c[i].startOfCar();
// 오버라이드 안된 메서드 :명시적 형변환
if (c[i] instanceof Sedan) ((Sedan)c[i]).aiDriving();
if (c[i] instanceof Truck)((Truck)c[i]).lifting();
// if(c[0] instanceof Sedan) {
// //오버라이드 된 메서드 : 묵시적 형변환
// c[0].doorOpen();
// c[0].manOfCar();
// c[0].startOfCar();
// //오버라이드 안된 메서드 :명시적 형변환
// ((Sedan)c[0]).aiDriving();
// }
//
// if(c[1] instanceof Truck) {
// c[1].doorOpen();
// c[1].manOfCar();
// c[1].startOfCar();
// ((Truck)c[1]).lifting();
} // for
}
}
private static void display(Object o) { // 1)Car c =s , 2) t
// sedan,truck의 모든 메서드에 접근하여 출력하시오.
// instanceof연산자를 사용하시오
//instanceof : 이 객체가 이 클래스로 만들어진게 맞냐 ?
if (o instanceof Sedan) {
// 묵시적 형벼환
//Sedan s =(Sedan)o;
((Sedan)o).drive();
((Sedan) o).manOfCar();
// 명시적 형변환
((Sedan) o).openWindows();
}
System.out.println("--------------");
if (o instanceof Truck) {
((Truck) o).drive();
((Truck) o).manOfCar();
((Truck) o).displayCarInfo();
}
}
private static void display(Object[] o) { // Car[] c=c;
// 배열의 값에 접근 할때 쓰는 방법
for (int i = 0; i < o.length; i++) { // 0 ,1
if (o[i] instanceof Sedan) {
// 묵시적 형벼환
((Sedan) o[i]).drive();
((Sedan) o[i]).manOfCar();
// 명시적 형변환
((Sedan) o[i]).openWindows();
}
System.out.println("--------------");
if (o[i] instanceof Truck) {
((Truck) o[i]).drive();
((Truck) o[i]).manOfCar();
((Truck) o[i]).displayCarInfo();
}
}