[java] 자바 추상 클래스와 인터페이스를 언제 사용해야 하는지

자바에서 추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 중요한 개념입니다. 추상 클래스와 인터페이스는 각각 다른 목적과 사용 방법을 가지고 있으며, 올바르게 사용함으로써 더욱 유연하고 재사용 가능한 코드를 작성할 수 있습니다.

추상 클래스 (Abstract Class)

추상 클래스는 하나 이상의 추상 메소드와 일반 메소드를 포함할 수 있는 클래스입니다. 추상 메소드는 선언만 되어 있고 구현 내용이 없으므로, 실제 사용될 때 서브 클래스에서 반드시 구현되어야 합니다.

추상 클래스는 다음과 같은 경우에 사용될 수 있습니다:

public abstract class Animal {
    public abstract void makeSound();
    
    public void sleep() {
        System.out.println("Zzz");
    }
}

위의 예시에서 Animal 추상 클래스는 makeSound()라는 추상 메소드와 sleep()라는 일반 메소드를 가지고 있습니다. Animal을 상속받는 서브 클래스는 makeSound()를 구현해야 하며, sleep() 메소드는 공통된 기능으로 사용될 수 있습니다.

인터페이스 (Interface)

인터페이스는 추상 메소드와 상수만을 가지는 참조 타입입니다. 인터페이스는 클래스가 가져야 할 동작을 명시하는 설계 도구로 사용됩니다. 클래스는 인터페이스를 구현함으로써 인터페이스에서 선언된 메소드를 구현해야 합니다.

인터페이스는 다음과 같은 경우에 사용될 수 있습니다:

public interface Flyable {
    void fly();
}

public class Bird implements Flyable {
    public void fly() {
        System.out.println("Flying high in the sky");
    }
}

위의 예시에서 Flyable 인터페이스는 fly()라는 추상 메소드를 가지고 있습니다. Bird 클래스는 Flyable 인터페이스를 구현하며, fly() 메소드를 구현합니다.

결론

추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 코드의 재사용성을 높이고 유연성을 제공하는 중요한 도구입니다. 추상 클래스는 서로 다른 클래스 간의 공통된 동작을 추상화하고 재사용할 수 있으며, 인터페이스는 클래스 간의 계약을 정의하여 다형성을 구현할 수 있도록 합니다. 올바르게 사용함으로써 코드의 유지보수성을 높이고, 확장 가능한 애플리케이션을 구축할 수 있습니다.

참고 자료