부모-자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리.
메소드가 실행 시점에서 성격기 결정되는 바인딩.
다형성 장점
- 유지보수가 쉽다
- 재사용성 증가
- 느슨한 결합
class Parent { ... }
class Child extends Parent { ... }
...
Parent pa = new Parent(); // 허용
Chile ch = new Child(); // 허용
Parent pc = new Child(); // 허용
Chile cp = new Parent(); // 오류
사용할 수 있는 멤버의 개수를 조절하는 것.
※ 부모-자식 관계의 참조변수는 서로 형변환 가능(단 자손끼리는 불가능)
public class Car {
public void run() {
System.out.println("Car의 run메소드");
}
}
public class Bus extends Car {
public void ppang() {
System.out.println("빵");
}
}
main에서 ppang메소드를 호출하고 싶으면 Bus타입의 참조변수로 참조해야 함.
public class BusExam {
public static void main(String args[]) {
Car car = new Bus();
car.run();
Bus bus = (Bus)car;
bus.run();
bus.ppang();
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println(p.x); // 200
System.out.println(c.x); // 100
p.method(); // Child method
c.method(); // Child method
}
}
class Parent {
int x = 200;
void method(){
System.out.println("Parent Method");
}
}
class Child extends Parent { // Child 자식 Parent 부모
int x = 100;
void method(){
System.out.println("Child Method");
}
}
부모타입의 배열에 자식들의 객체를 담을 수 있음.
Product p[] = new Product[3];
p[0] = new TV();
p[1] = new Computer();
p[2] = new Audio();
여기서 배열에는 실제 객체를 저장하는게 아니라 참조변수를 저장하기 위한 것으로 인스턴스의 주소가 저장된다.