개발/JAVA

[JAVA] 다형성

경주초이 2020. 6. 21. 19:48

Polymorphism

 

다음과 같이 Bouncer(경비원) 클래스를 만들어 보자. 경비원 클래스는 다음과 같이 동물을 짖게 하여 건물을 지킨다고 한다.

Bouncer.java

public class Bouncer {
    public void barkAnimal(Animal animal) {
        if (animal instanceof Tiger) {
            System.out.println("어흥");
        } else if (animal instanceof Lion) {
            System.out.println("으르렁");
        }
    }

    public static void main(String[] args) {
        Tiger tiger = new Tiger();
        Lion lion = new Lion();

        Bouncer bouncer= new Bouncer();
        bouncer.barkAnimal(tiger);
        bouncer.barkAnimal(lion);
    }
}


어흥
으르렁

 

barkAnimal 메소드가 마음에 들어 동물을 추가한다면

public void barkAnimal(Animal animal) {
    if (animal instanceof Tiger) {
        System.out.println("어흥");
    } else if (animal instanceof Lion) {
        System.out.println("으르렁");
    } else if (animal instanceof Crocodile) {
        System.out.println("쩝쩝");
    } else if (animal instanceof Leopard) {
        System.out.println("캬옹");
    }
}

처럼 되겠으나 인터페이스를 이용하여 더 나은 코딩을 해보자.

 

Barkable.java

public interface Barkable {
    public void bark();
}

그리고 Tiger클래스와 Lion 클래스가 Barkable 인터페이스를 구현하도록 변경 해 보자.

 

Tiger.java

public class Tiger extends Animal implements Predator, Barkable {
    public String getFood() {
        return "apple";
    }

    public void bark() {
        System.out.println("어흥");
    }
}

 

Lion.java

public class Lion extends Animal implements Predator, Barkable {
    public String getFood() {
        return "banana";
    }

    public void bark() {
        System.out.println("으르렁");
    }
}

 

barkAnimal 메소드를 다음처럼 수정한다.

//변경 전
public void barkAnimal(Animal animal) {
    if (animal instanceof Tiger) {
        System.out.println("어흥");
    } else if (animal instanceof Lion) {
        System.out.println("으르렁");
    }
}


//변경 후
public void barkAnimal(Barkable animal) {
    animal.bark();
}

barkAnimal 메소드의 입력 자료형이 Animal에서 Barkable 로 변경하였다. 그리고 animal의 객체 타입을 체크하여 "어흥" 또는 "으르렁"을 출력하던 부분을 그냥 bark 메소드를 호출하도록 변경했다. 훨씬 깔끔한 코드가 되었다.