하나의 코드가 여러 자료형으로 구현되어 실행되는 것
같은 코드에서 여러 실행결과가 나옴
정보은닉,상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나
객체지향 프로그래밍의 유연성,재활용성,유지보수성에 기본이 되는 특징임
package polymorphism;
class Animal{
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal{
public void move() {
System.out.println("사람이 두발로 걷습니다.");
}
}
class Tiger extends Animal{
public void move() {
System.out.println("호랑이가 네 발로 뜁니다.");
}
}
class Eagle extends Animal{
public void move() {
System.out.println("독수리가 하늘을 날아갑니다.");
}
public void readBook() {
System.out.println("사람이 책을 읽습니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal hAnimal=new Human();
Animal tAnimal=new Tiger();
Animal eAnimal=new Eagle();
AnimalTest test=new AnimalTest();
test.moveAnimal(hAnimal);
test.moveAnimal(tAnimal);
test.moveAnimal(eAnimal);
}
public void moveAnimal(Animal animal) {
//하나의 코드가 여러자료형이 구현이 되서 다른 실행이 이루어지는 경우를 다형성이라고 한다.
//각각의 클래스를 만들더라도 동일한 메서드로 호출할 수 있다.
animal.move();
}
}
다양한 여러 클래스를 하나의 자료형(상위 클래스)으로 선언하거나 형변환하여 각 클래스가 동일한 메서드를 오버라이딩한 경우, 하나의 코드가 다양한 구현을 실행할 수 있음
유사한클래스가 추가되는 경우 유지보수에 용이하고, 각 자료형마다 다른 메서드를 호출하지 않으므로 코드에서 많은 if문이 사라짐
묵시적으로 상위 클래스 형변환된 인스턴스가 원래자료형(하위클래스)으로 변환되어야 할 때 다운캐스팅이라 함
하위클래스로의 형변환은 명시적으로 되어야함
Customer vc=new VIPCustomer(); //묵시적
VIPCustomer vCustomer=(VIPCustomer)vc; //명시적
package polymorphism;
import java.util.ArrayList;
class Animal{
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal{
public void move() {
System.out.println("사람이 두발로 걷습니다.");
}
public void readBook() {
System.out.println("사람이 책을 읽습니다.");
}
}
class Tiger extends Animal{
public void move() {
System.out.println("호랑이가 네 발로 뜁니다.");
}
public void hunting() {
System.out.println("호랑이가 사냥을 합니다.");
}
}
class Eagle extends Animal{
public void move() {
System.out.println("독수리가 하늘을 날아갑니다.");
}
public void flying() {
System.out.println("독수가 날개를 쭉 펴고 멀리 날라갑니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal hAnimal=new Human();
Animal tAnimal=new Tiger();
Animal eAnimal=new Eagle();
//Human클래스로 다운캐스팅하여야한다.
// Human human=(Human)hAnimal;
// human.readBook();
//hAnimal이 Human타입의 변수인지 판단하여 맞으면 true,틀리면 false를 반환함
// if(hAnimal instanceof Human) {
// Human human=(Human)hAnimal;
// human.readBook();
// }
// AnimalTest test=new AnimalTest();
// test.moveAnimal(hAnimal);
// test.moveAnimal(tAnimal);
// test.moveAnimal(eAnimal);
ArrayList<Animal> animalList=new ArrayList<Animal>();
animalList.add(hAnimal);
animalList.add(tAnimal);
animalList.add(eAnimal);
//다운캐스팅된 animalList를 출력
AnimalTest test=new AnimalTest();
test.testDownCasting(animalList);
// for(Animal animal:animalList) {
// animal.move();
// }
}
public void testDownCasting(ArrayList<Animal> list) {
for(int i=0;i<list.size();i++) {
Animal animal=list.get(i);
if(animal instanceof Human) {
//Human클래스로 다운캐스팅해라
Human human=(Human)animal;
human.readBook();
}
else if(animal instanceof Tiger) {
Tiger tiger=(Tiger)animal;
tiger.hunting();
}
else if(animal instanceof Eagle) {
Eagle eagle=(Eagle)animal;
eagle.flying();
}else {
System.out.println("error");
}
}
}
public void moveAnimal(Animal animal) {
//하나의 코드가 여러자료형이 구현이 되서 다른 실행이 이루어지는 경우를 다형성이라고 한다.
//각각의 클래스를 만들더라도 동일한 메서드로 호출할 수 있다.
animal.move();
}
}
다운캐스팅을 안정적으로 하기 위해서는 instanceof를 사용하여야한다.