자바 공부 19 : 다형성

친환경 개발자
|2024. 2. 10. 22:15

다형성(Polymorphism)이란?

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

>> 복잡한 형태의 분기문을 간단하고 효율적으로 처리할 수 있다.

 

 

 

다형성의 장점

1) 확장성 : 상위클래스나 인터페이스의 기능을 가지는 하위클래스를 생성하여 기존 코드를 변경하지 않고 확장할 수 있다.

2) 유지관리 용이 : 클래스 간의 결합도를 낮춰 코드가 유연해지므로 수정이 필요한 해당 클래스만 수정할 수 있음

3) 유연성 : 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있음

 

 

 

interface 다중상속

Java에서 클래스는 다른 클래스를 다중 상속할 수 없고 오직 1개만 상속이 가능하다.

그러나 인터페이스는 다중 상속을 지원한다!

 

(예시)

interface BarkablePredator extends Barkable, Predator {

}

 

 

 

 

다형성의 예시

아래 코드에서,

Tiger클래스의 객체인 tiger는 여러 가지 자료형으로 표현할 수 있다.

 

Tiger tiger = new Tiger();                   → Tiger is a Tiger

Animal animal = new Tiger();             → Tiger is a Animal

Predator predator = new Tiger();       → Tiger is a Predator

Barkable barkable = new Tiger();      → Tiger is a Barkable

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 Barkable, Predator{
}



class Animal {
    String name;

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

class Tiger extends Animal implements BarkablePredator {
    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 Day17 {
    public static void main(String[] args) {
        Zookeeper zookeeper = new Zookeeper();
        Tiger tiger = new Tiger();
        Lion lion = new Lion();

        tiger.printFood();
        zookeeper.feed(tiger);  //feed apple 출력
        System.out.println();

        lion.printFood();
        zookeeper.feed(lion);   // feed banana 출력
        System.out.println();

        Predator.speed();
        System.out.println(Predator.LEG_COUNT);
        System.out.println();

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