개발/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 메소드를 호출하도록 변경했다. 훨씬 깔끔한 코드가 되었다.