IT Knowledge/Design Pattern

객체 지향 -2. 다형성(상속)

RoarinGom 2021. 11. 10. 22:58

- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것

- 같은 코드에서 여러 다른 실행 결과가 나옴

- 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나

- 다형성을 활용하여 유연하고 확장성있고, 유지보수가 편리한 프로그램을 만들 수 있음.

 

package Basic_Grammar.chap3_OOP.ch03_Polymorphism;

public class AnimalTest {
    public void moveAnimal(Animal animal){
        animal.move();
    }
    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);
    }
}

-상위 클래스를 이용하여 하위클래스를 handling한다.

Animal 클래스 (상위 클래스) 

move()

위의 예시 처럼 Animal(상위 클래스)로 객체타입을 지정하여 생성하면, Animal이 가진 move() 메서드(overriding)는 사용할 수 있으나,

Human, Tiger, Eager이 가진 개별적인 메서드(오버라이딩하지않고 만들어진)는 사용을 못한다.

사용하기 위해서는 각각 하위 클래스는 다운 캐스팅을 해야지 사용할 수 있다.

 

Animal

package Basic_Grammar.chap3_OOP.ch03_Polymorphism;

public class Animal {
    public void move(){
        System.out.println("동물이 움직인다.");
    }
}

Human

package Basic_Grammar.chap3_OOP.ch03_Polymorphism;

public class Human extends Animal{
    @Override
    public void move() {
        System.out.println("사람이 두 발로 걷습니다.");
    }

    public void readBook(){
        System.out.println("사람이 책을 읽습니다.");
    }
}

Tiger

package Basic_Grammar.chap3_OOP.ch03_Polymorphism;

public class Tiger extends Animal{
    @Override
    public void move() {
        System.out.println("호랑이가 네 발로 뜁니다.");
    }

    public void hunting(){
        System.out.println("호랑이가 사냥을 합니다.");
    }
}

Eagle

package Basic_Grammar.chap3_OOP.ch03_Polymorphism;

public class Eagle extends Animal{
    @Override
    public void move() {
        System.out.println("독수리가 하늘을 날아 다닙니다.");
    }

    public void flying(){
        System.out.println("독수리가 양 날개를 쭉 펴고 날아 다닙니다.");
    }

}

 

각각의 다른 Human, Tiger, Eagle을 배열에 넣고 싶을 땐, 

ArrayList<Animal> animals=new ArrayList<>(); 로 넣어준다.

package Basic_Grammar.chap3_OOP.ch03_Polymorphism;

import java.util.ArrayList;

public class AnimalTest {

    public static void main(String[] args) {
        Animal hAnimal=new Human();
        Animal tAnimal=new Tiger();
        Animal eAnimal=new Eagle();


        ArrayList<Animal> animals=new ArrayList<>();
        animals.add(hAnimal);
        animals.add(tAnimal);
        animals.add(eAnimal);

        for (Animal animal:animals){
            animal.move();
        }
    }
}