Java 다형성 - 활용 예제코드의 문제 원인

다형성을 사용하는 예제 몇 가지를 코드 예제
다형성을 사용하지 않는 동물 소리 내는 코드부터 점진적으로 발전시켜보도록 한다.

Bird.java

package sound;

public class Bird {
    public String sound() {
        return "짹짹";
    }
}

Dog.java

package sound;

public class Dog {
    public String sound() {
        return "멍멍";
    }
}

Cat.java

package sound;

public class Cat {
    public String sound() {
        return "냐옹";
    }
}

AnimalMain.java

package sound;

public class AnimalMain {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();
        Bird bird = new Bird();

        System.out.println("동물 울음 소리: " + dog.sound());
        System.out.println("동물 울음 소리: " + cat.sound());
        System.out.println("동물 울음 소리: " + bird.sound());
    }
}

실행결과

동물 울음 소리: 멍멍
동물 울음 소리: 냐옹
동물 울음 소리: 짹짹

다형성 없이 사용한 코드에서 AnimalMain 소리를 출력하는 것이 중복으로 표시되는 것을 확인할 수 있다. 중복 코드를 제거하려면 Arrayfor 문으로 제거해왔으나, 작성한 코드는 클래스 단위로 사용할 수 없다.
Dog, Cat, Bird 각각 다른 클래스이다.


중복 제거 시도해보기

메소드로 중복 제거해보기

메소드를 사용하여 매개변수 클래스를 정해야 한다.

public static void soundPack(Cat cat) {
    System.out.println("동물 울음 소리: " + cat.sound());
}

다음과 같은 메소드를 사용할 수 있으나 Cat, Dog, Bird 각각 클래스에 대한 출력코드를 만들어줘야 하는 단점이 있다. 따라서 Dog, Bird 인수로 사용할 수 없다.

배열로 중복 제거해보기

일반적인 배열의 중복 시도라면 다음 코드와 같다.

Bird[] arr = {bird, cat, dog}; // 컴파일 오류
for (Bird animal : arr) {
    System.out.println(animal.sound());
}

배열과 for 문을 시도하려 해도 Dog, Cat, Bird 클래스를 하나만 선택해야하며, 같은 Bird 배열에 담으려해도 서로 다른 타입으로 컴파일 오류가 발생한다.
결과적으로 해결방안이 없으며, 동물을 추가할 때마다 많은 중복코드를 만들어낸다.

중복 제거를 하고 싶지만 문제의 핵심인 클래스가 달라 제거가 안된다는 것이다.
이제 서로 다른 타입인 클래스 해결하여 메소드와 배열과 반복문으로 문제를 해결해보자.