하나의 코드가 여러 자료형으로 구현되어 실행되는 능력을 의미하며 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하며 구현을 한다.
같은 코드에서 여러 다른 실행 결과가 나오게 할 수 있으며 다형성을 잘 활용하면 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들수 있다.
정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나이다.
상속과 메서드 재정의를 활용하여 코딩을 하는 방법인 다형성을 사용하지 않는 경우 if-else if문이 많이 생성되어 코드의 유지보수가 어려워진다.
그래서 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들도록 해야한다.
상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능을 구현을 한다.
공통적인 부분을 제공하는 상위 클레스로 핸들링 할 수 있다.
package ch06;
import java.util.ArrayList;
class Animal{
public void move() {
System.out.println("동물이 움직입니다");
}
}
class Human extends Animal {
@Override
public void move() {
System.out.println("사람이 두 발로 걷습니다.");
}
public void readBook() {
System.out.println("사람이 책을 읽습니다.");
}
}
class Tiger extends Animal {
@Override
public void move() {
System.out.println("호랑이가 네 발로 걷습니다.");
}
public void hunting() {
System.out.println("호랑이가 사냥을 합니다.");
}
}
class Eagle extends Animal {
@Override
public void move() {
System.out.println("독수리가 하늘을 날아 다닙니다.");
}
public void flying() {
System.out.println("독수리가 날라다닙니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
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);
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(hAnimal);
animalList.add(tAnimal);
animalList.add(eAnimal);
for (Animal ani: animalList) {
ani.move();
}
}
public void moveAnimal(Animal animal) {
animal.move();
// 코드는 한 줄인데 어떤 값이 들어가느냐에 따라 move의 수행이 달라진다.
// 이게 다형성!!
}
}