자바 객체지향 - 다형성

태인
Written by 태인 on

객체지향 프로그래밍의 특성 중 “다형성(Polymophism)”이라는 것이 있다.

간단한 개념은

하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것이다.

예제로 알아보자.

public class Bouncer {
    public void barkAnimal(Animal animal) { //instanceof란 형변환 가능 여부 연산자
        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);
    }
}

그러나 더 많은 동물들이 추가되면 if조건을 계속 추가해야 한다. 좀 더 나은 방법을 찾아보자.

Barkable.java를 생성해보자.

public interface Barkable {
    public void bark();
}

Tiger.java

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

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

Tiger도 마찬가지로 bark메소드에 ‘으르렁’을 출력하도록.

그 다음 맨 위에 만들었던 bouncer클래스를 수정해보자.

public class Bouncer {
    public void barkAnimal(Barkable animal) {
        animal.bark();
    }

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

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

클래스를 수정하고 Bouncer 클래스를 실행하더라도 역시 다음과 같이 동일한 결과값이 출력되는 것을 확인 할 수 있다.

어흥
으르렁

위 예제에서 사용한 tiger, lion 객체는 각각 Tiger, Lion 클래스의 객체이면서 Animal 클래스의 객체이기도 하고 Barkable, Predator 인터페이스의 객체이기도 하다. 이러한 이유로 barkAnimal 메소드의 입력 자료형을 Animal에서 Barkable 로 바꾸어 사용할 수 있는 것이다. 이렇게 하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것을 객체지향 세계에서는 다형성, 폴리모피즘(Polymorphism)이라고 부른다.

태인

태인

댓글

comments powered by Disqus