Java 다형성 - 순수 추상 클래스

추상 클래스에서 모든 메소드가 추상 클래스로 만든 것이다.

이전 AbsAnimal 클래스에서 move() 일반 메소드로 만들었다.
이 일반 메소드를 추상 메소드로 만들어야 한다면, AbsAnimal 클래스는 순수 추상 클래스라 한다.

move() 추상 메소드가 되었으니 상속 받은 Dog, Cat, Bird 자식 클래스에서도 오버라이딩 move() 필수로 한다.

AbsAnimal.java

package sound;

public abstract class AbsAnimal {

    public abstract String sound();

    public abstract String move();
}

Bird.java

package sound;

public class Bird extends AbsAnimal { // 컴파일 오류
    @Override
    public String sound() {
        return "짹짹";
    }

    @Override
    public String move() {
        return "참새 이동하기~";
    }
}

Dog.java

package sound;

public class Dog extends AbsAnimal {
    @Override
    public String sound() {
        return "멍멍";
    }

    @Override
    public String move() {
        return "멍멍이 이동하기";
    }
}

Cat.java

package sound;

public class Cat extends AbsAnimal {

    @Override
    public String sound() {
        return "냐옹";
    }

    @Override
    public String move() {
        return "야옹이 이동하기";
    }
}

AbsAnimalMain.java

package sound;

public class AbsAnimalMain {
    public static void main(String[] args) {

        Bird bird = new Bird();
        Cat cat = new Cat();
        Dog dog = new Dog();

        soundAnimal(bird);
        soundAnimal(cat);
        soundAnimal(dog);

        moveAnimal(bird);
        moveAnimal(cat);
        moveAnimal(dog);

    }

    private static void soundAnimal(AbsAnimal animal) {
        System.out.println("울음 소리: ");
        System.out.println(" " + animal.sound());
    }

    private static void moveAnimal(AbsAnimal animal) {
        System.out.println(animal.move());
    }
}

실행 결과

울음 소리: 
 짹짹
울음 소리: 
 냐옹
울음 소리: 
 멍멍
참새 이동하기~
야옹이 이동하기
멍멍이 이동하기

순수 추상 클래스로 만들었기에 이해하기가 쉽다.

순수 추상 클래스 특징

  • 인스턴스를 생성할 수 없다.
  • 상속 받은 모든 메소드는 오버라이딩되어야 한다.

순수 추상 메소드는 부모의 기능을 물려받아 사용하는 개념이 아니다.
빈 껍데기인 부모 추상 메소드를 자식에서 모두 구현하듯이 자식 클래스인 Dog, Cat, Bird 각 클래스의 move(), sound() 메소드 오버라이딩하여 구현해주었다.

순수 추상 클래스는 마치 프로토콜 구현하는 것과 같다. 실생활에서 사용하는 USB 도 프로토콜과 인터페이스가 있다. USB만의 프로토콜이 있고, USB 인터페이스 종류로는 USB-C, USB2, USB3 등이 있으며, 프로토콜이 순수 추상 클래스와 같다. 인터페이스와 프로토콜에 맞춰 각각의 마우스, 키보드, 오디오 연결 장치를 구현한다.

순사 추상 클래스는 객체지향 프로그래밍에서 자주 사용된다.
그리고 인터페이스로 순수 추상 클래스를 편리하게 다룰 수 있게 해준다.