하나의 객체가 여러 타입으로 사용되는 것
package day09.poly;
class A {}
class B extends A {}
class C extends A {}
class D extends B {}
class E extends C {}
/*
Object
|
A
/ \
B C
| |
D E
*/
public class Basic {
void test() {
// 다형성: 객체가 여러 타입을 사용할 수 있다.
// - 부모의 타입을 사용 가능
A x1 = new A();
A x2 = new B();
A x3 = new C();
Object x4 = new D();
Object x5 = new E();
int a = 10;
double b = (double) a;
double n = 10;
C c = new C();
A d = (A) c;
}
}
1. 이종모음 (<-> 동종모음) 배열 구현 가능
-> 배열로 활용 가능
Car sonata1 = new Sonata();
Car sonata2 = new Sonata();
Sonata sonata3 = new Sonata();
Car tucson1 = new Tucson();
Car tucson2 = new Tucson();
Car mustang1 = new Mustang();
Car mustang2 = new Mustang();
Car mustang3 = new Mustang();
Car mustang4 = new Mustang();
// 다형성을 통해 이종모음(<->동종모음) 배열을 구현할 수 있음
Car[] cArr = {sonata1, tucson1, mustang1, mustang2};
for (Car car : cArr) {
car.accelerate();
}
2. 굳이 여러 개의 메서드를 선언할 필요 없이 하나의 메서드 만으로 여러 개의 객체를 받아 처리할 수 있음
package day09.poly.car;
public class Driver {
// Car타입으로 받으면 다형성에 의해서 Mustang, Sonata, Tucson 모두 올 수 있음
// 다형성이 안된다면 Car car 자리에 Sonata sonata, Tucson tuscon처럼 일일히 만들어줘야 했을 것이다.
public void drive(Car car) {
String carName = "";
if (car instanceof Sonata) {
carName = "쏘나타";
} else if (car instanceof Tucson) {
carName = "투싼";
} else if (car instanceof Mustang) {
carName = "머스탱";
}
// car가 Sonata냐? (boolean)
System.out.println(car instanceof Sonata);
System.out.println("운전을 시작합니다.");
car.accelerate();
}
}
##################################################
package day09.poly.car;
public class CarShop {
// 돈을 주면 자동차를 출고하는 기능
// return 타입을 Car로 받게되면 모두 return 가능
public Car exportCar(int money) {
if (money == 6000) {
return new Mustang();
} else if (money == 4000) {
return new Tucson();
} else if ( money == 3000) {
return new Sonata();
} else {
return null;
}
}
}
public class Parent {
public int n1;
void method1() {...}
void method2() {...}
}
public class Child extends Parent {
public int n2;
@override
void method2() {...}
void method3() {...}
}
//////////////////////////////////////////////////////////////////////
public class Main {
Parent p = new Child();
p.n1 = 1;
//p.n2 = 2; (x)
p.method1();
p.method2();
//p.method3(); (x)
}
Child c = (Child) p;
c.n2 = 2;
c.method3(); //주소값을 자식 타입으로 내리니까 속성 및 기능 사용 가능.
// Sonata타입 대신 Car 타입으로 하게되면 Sonata에서 정의하면
// joinSonataClub 메서드를 못쓰므로 그냥 Sonata 타입으로 사용해서 업케스팅해서 쓰는 것도 가능하다.
Sonata mySonata = new Sonata();
mySonata.accelerate();
mySonata.joinSonataClub();
Car[] cars = new Car[3];
cars[0] = mySonata;