다양한 형태를 가지는 성질
하나의 소통 방식으로 다양한 객체들이 각자의 방식으로 동작하는 성질
package step1;
public class TestPolymorphism1 {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
// Animal c = new Car(); -> compile error
// 타입이 다르므로 Car 객체를 Animal 타입의 변수에 참조시킬 수 없다.
}
}
package step1;
public class Animal {
public void eat() {
System.out.println("먹다");
}
}
// Animal c = new Car(); -> compile error
타입이 다르므로 Car 객체를 Animal 타입의 변수에 참조시킬 수 없다.
Animal a2 = new Person();
Animal a2 = new Person();
a2.eat(); //-> 오버라이드된 Person의 eat 메서드 실행
Person 자식 객체를 Animal 부모 타입의 변수에 참조시킬 수 있다.
Polymorphism 다형성 지원을 위해서는 계층 구조 형성이 필수적이다.
상품의 종류가 추가되면 새로 메소드를 오버로딩해서 처리해야함을 볼 수 있다.
cart.put(new ~) 텍스트으로 객체를 전달하면 실행됨으로 class와 cart.put(~) 코드를 매번 추가해줘야한다는 것이다.
이는 상품의 종류가 추가될수록 처리하는 쇼핑카트의 메소드가 함께 추가되는 비효율적인 구조로
결합도가 높은 구조 -> 유지보수성이 낮다. 라고 볼 수 있다.
다형성(Polymorphism) 적용하기 위해 계층 구조 형성
다형성이 적용되므로 put 장바구니에 추가하는 메소드는 하나만 정의하면된다.
부모 타입의 매개변수에 다양한 자식 객체들을 전달받을 수 있다.
새로운 상품이 추가되어도 별도의 메소드 추가 작업은 필요없다.
다형성을 적용하여 유지보수성을 향상 시킬 수 있다.
부모 타입의 변수로 자식 객체를 참조할 경우
부모로부터 상속받은 멤버(속성,기능)와 오버라이드한 메소드는 바로 접근 가능하지만 자식의 독자적 멤버(속성, 기능)는 접근이 불가하다.
참조 변수가 부모타입이기 때문이다.
예)
Animal a = new Person();
a.study();
study메서드는 Animal에는 존재하지않고 Person에만 존재하는 독자적 멤버로 위 코드는 컴파일 에러가 난다.
자식의 독자적 멤버에 접근하기 위해서는 Object Down Casting이 필요하다.
예) ((Person) a).study();
별도의 과정 필요 : a라는 참조변수를 Person클래스로 묶어줌