OOP - Polymorphism, Abstract Class

5w31892p·2022년 12월 27일
0

Java

목록 보기
15/17

:: 다형성 (폴리모피즘, Polymorphism)

  • 경비원은 동물을 짖게(barkAnimal)하여 건물을 지킨다.
  • instanceof 어떤 객체가 특정 클래스의 객체인지 조사할 때 사용
    • animal instanceof Tiger == animal 객체는 Tiger 클래스로 만들어진 객체니?
  • 아래와 같은 방식은 동물 추가될 때마다 분기문 추가... 띠로리
interface Predator {
    (... 생략 ...)
}

class Animal {
    (... 생략 ...)
}

class Tiger extends Animal implements Predator {
    (... 생략 ...)
}

class Lion extends Animal implements Predator {
   (... 생략 ...)
}

class ZooKeeper {
    (... 생략 ...)
}

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

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);
    }
}

// 어흥
// 으르렁
  • Barkable 인터페이스를 만들어 각 동물들이 Barkable 인터페이스 구현하도록 변경
  • 콤마를 이용해서 여러개를 implements 할 수 있다.
...
interface Barkable {
    void bark();
}
...
class Tiger extends Animal implements Predator, Barkable {
    public String getFood() {
        return "apple";
    }

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

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

    public void bark() {
        System.out.println("으르렁");
    }
}
...
class Bouncer {
    void barkAnimal(Barkable animal) {  // Animal 대신 Barkable을 사용
        animal.bark();
    }
}
...

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

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
  • Predator 로 선언된 predator 객체와 Barkable 로 선언된 barkable 객체는 사용할 수 있는 메서드가 서로 다르다
    • predator 객체는 getFood 메서드만 호출 가능
    • barkable 객체는 bark 메서드만 호출 가능
  • 두개의 메서드 모두 사용하고 싶다면
    • Tiger로 선언된 tiger 그대로 사용하거나
    • getFood, bark 메서드를 모두 포함하는 새로운 인터페이스를 새로 만들어 사용
  • 자식 인터페이스로 생성한 객체의 자료형은 부모 인터페이스로 사용 가능
    • 자식 클래스의 객체 자료형을 부모 클래스의 자료형으로 사용 가능한 것과 동일
...

interface BarkablePredator extends Predator, Barkable {
}

...

:: 추상클래스 (Abstract Class)

  • 인터페이스의 역할도 하면서 클래스의 기능도 가지고 있는 자바의 돌연변이 같은 클래스
  • 추상 클래스는 class 앞에 abstract 표기해야 한다.
  • abstract 메서드도 내용 없음
    • 인터페이스와 똑같이 상속 하는 클래스가 구현
  • 인터페이스의 메서드와 같은 역할을 하는 메서드에도 abstract 붙여야 한다.
  • 추상클래스는 단독으로 객체 생성할 수 없다.
  • 상속한 실제 클래스 통해서만 객체 생성 가능하다.
  • abstract 메서드 외에 실제 메서드도 사용할수 있다.
  • 원래 인터페이스에서 default 메서드로 사용했던 printFood가 추상 클래스의 실제 메서드에 해당된다.
  • Predator 인터페이스를 추상클래스로 변경
abstract class Predator extends Animal { // Animal 클래스 기능 유지하기 위해 상속
    abstract String getFood();

    default void printFood() {  // default 를 제거한다.
        System.out.printf("my food is %s\n", getFood());
    }

    static int LEG_COUNT = 4;  // 추상 클래스의 상수는 static 선언이 필요하다.
    static int speed() {
        return LEG_COUNT * 30;
    }
}
...
// interface BarkablePredator extends Predator, Barkable {} 삭제

...
class Tiger extends Predator implements Barkable {
    (... 생략 ...)
}

class Lion extends Predator implements Barkable {
    (... 생략 ...)
}
....

추상클래스는 인터페이스와 달리 일반 클래스처럼 객체번수, 생성자, private 메서드 등을 가질 수 있다.

0개의 댓글