먹었으면 뇌를 쓰자

다형성(polymorphism)을 이해하는 가장 간단한 설명 본문

JAVA/개념

다형성(polymorphism)을 이해하는 가장 간단한 설명

뇌이비 2022. 12. 23. 09:33
interface Predator {
    String getFood();

    default void printFood() {
        System.out.printf("my food is %s\n", getFood());
    }

    int LEG_COUNT = 4; 

    static int speed() {
        return LEG_COUNT * 30;
    }
}

interface Barkable {
    void bark();
}

interface BarkablePredator extends Predator, Barkable {
}

class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

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

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

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

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

class ZooKeeper {
    void feed(Predator predator) {
        System.out.println("feed " + predator.getFood());
    }
}

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

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

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

//코드 출처: 점프 투 자바(https://wikidocs.net/269)

 

 

위의 코드에서 메인에 생성된 tiger, lion 객체는

기본적으로 Tiger, Lion 클래스의 객체이면서

Animal 클래스의 객체이기도 하다. (오버라이딩)

 

tiger 객체는 Predator, Barkable 인터페이스의 객체이기도 하다. (구현)

lion 객체는 두 인터페이스를 상속한 BarablePredator 인터페이스의 객체이기도 하다. (구현)

* 참고로 일반 클래스는 단일상속만 가능하지만, 인터페이스는 다중상속이 가능하다.

 

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

Comments