한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것
상위 클래스 타입의 참조 변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것
참조 변수가 사용할 수 있는 멤버의 개수는 상위 클래스의 멤버의 수
메서드 오버라이딩과 메서드 오버로딩 또한 다형성의 한 예시
(하나의 객체가 여러 가지 형태를 가질 수 있는 성질)
조건
서로 상속 관계에 있는 상위 클래스 - 하위 클래스 사이에만 타입 변환이 가능
하위 클래스 타입에서 상위 클래스 타입으로의 타입 변환(업캐스팅)은 형 변환 연산자(괄호)를 생략할 수 있다
반대로 상위 클래스에서 하위 클래스 타입으로 변환(다운캐스팅)은 형 변환 연산자(괄호)를 반드시 명시해야 한다.
(다운 캐스팅은 업 캐스팅이 되어 있는 참조 변수에 한해서만 가능하다)
참조_변수 instanceof 타입
리턴 값이 true가 나오면 참조 변수가 검사한 타입으로 타입 변환이 가능하며, 반대로 false가 나오는 경우에는 타입 변환이 불가능하다.
void buyCoffee(Americano americano) { // 아메리카노 구입
money = money - americano.price;
}
void buyCoffee(CaffeLatte caffeLatte) { // 카페라테 구입
money = money - caffeLatte.price;
}
커피의 종류가 수십 수백 가지가 된다면 매번 새로운 타입을 매개 변수로 전달해 주는 buyCoffee 메서드를 계속 추가해주어야 할 것이다.
void buyCoffee(Coffee coffee) { // 매개 변수의 다형성
money = money - coffee.price;
}
그러나 위와 같이 객체의 다형성을 활용하여
상위클래스인 Coffee의 타입을 매개 변수로 전달받으면, 그 하위클래스 타입의 참조변수면 어느 것이나 매개 변수로 전달될 수 있고 이에 따라 매번 다른 타입의 참조변수를 매개 변수로 전달해주어야 하는 번거로움을 훨씬 줄일 수 있다.