[java] 자바 추상 클래스와 인터페이스를 함께 사용하는 예시

자바에서 추상 클래스와 인터페이스는 각자의 특징과 역할을 가지고 있습니다. 추상 클래스는 하위 클래스에게 공통의 속성과 메서드를 상속해주는 역할을 하며, 인터페이스는 특정한 동작을 보장하기 위한 규약을 제공합니다. 이 두 가지를 함께 사용하면 더욱 유연하고 확장 가능한 코드를 작성할 수 있습니다.

예를 들어, 동물을 나타내는 추상 클래스인 Animal과 애완동물을 나타내는 인터페이스인 Pet을 함께 사용해보겠습니다. 이 예시에서는 추상 클래스가 기본적인 동물의 특징을 정의하고, 인터페이스가 애완동물로서 가져야 하는 동작을 정의할 것입니다.

abstract class Animal {
    String species;
    int age;
    
    abstract void move();
    abstract void makeSound();
    
    void eat() {
        // 동물이 먹는 동작 구현
    }
    
    void sleep() {
        // 동물이 잠자는 동작 구현
    }
}

interface Pet {
    void play();
    void groom();
}

class Dog extends Animal implements Pet {
    @Override
    void move() {
        // 개가 움직이는 동작 구현
    }
    
    @Override
    void makeSound() {
        // 개가 소리내는 동작 구현
    }
    
    @Override
    public void play() {
        // 개와 놀기 동작 구현
    }
    
    @Override
    public void groom() {
        // 개 그루밍 동작 구현
    }
}

class Cat extends Animal implements Pet {
    @Override
    void move() {
        // 고양이가 움직이는 동작 구현
    }
    
    @Override
    void makeSound() {
        // 고양이가 소리내는 동작 구현
    }
    
    @Override
    public void play() {
        // 고양이와 놀기 동작 구현
    }
    
    @Override
    public void groom() {
        // 고양이 그루밍 동작 구현
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.move(); // 개가 움직임
        dog.makeSound(); // 개가 소리를 냄
        dog.play(); // 개와 놀기
        dog.groom(); // 개 그루밍
        
        Cat cat = new Cat();
        cat.move(); // 고양이가 움직임
        cat.makeSound(); // 고양이가 소리를 냄
        cat.play(); // 고양이와 놀기
        cat.groom(); // 고양이 그루밍
    }
}

위의 예시에서 Animal 클래스는 추상 클래스로 선언되어 있으므로 인스턴스를 직접 생성할 수 없습니다. 대신 DogCat 클래스에서 Animal을 상속받아 필요한 메서드를 구현하고, Pet 인터페이스를 구현하여 애완동물로서의 동작을 추가로 정의합니다.

이렇게 추상 클래스와 인터페이스를 함께 사용하면 공통된 속성과 동작을 상속받으면서도 필요한 동작을 유연하게 추가할 수 있습니다. 이렇게 모듈화된 코드를 작성하면 코드의 재사용성과 확장성이 향상되며, 유지 보수에도 용이해집니다.


참고 자료: