Java객체지향

interface와 abstract class

공통 계약을 표현하는 interface와 부분 구현을 제공하는 abstract class를 어떻게 구분할지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

java
interface Payable {
    int pay();
}

abstract class Employee implements Payable {
    protected String name;
}

설명

  • interface는 "무엇을 할 수 있는가"라는 계약을 표현하는 데 잘 맞고, abstract class는 "공통 상태와 일부 구현을 공유하는 기본 뼈대"를 표현하는 데 잘 맞습니다.
  • Java는 클래스 다중 상속은 허용하지 않지만, 여러 interface 구현은 허용합니다. 그래서 역할 조합은 interface 쪽이 훨씬 유연합니다.
  • abstract class는 field, protected 메서드, 공통 구현을 함께 둘 수 있어, 서로 밀접한 클래스들의 공통 기반을 만들 때 유용합니다.
  • 반면 interface는 구현보다 계약과 타입 역할을 강조합니다. 서로 unrelated한 클래스도 같은 interface를 구현할 수 있다는 점이 큰 장점입니다.
  • 실무에서는 "공통 동작 일부를 실제로 공유해야 하는가"와 "공통 타입 계약만 있으면 되는가"를 기준으로 구분하면 대부분의 선택이 정리됩니다.

빠른 정리

도구잘 맞는 상황
interface역할 계약, 다중 구현, 느슨한 결합
abstract class공통 상태와 기본 구현 공유
공통점둘 다 직접 인스턴스화 대상은 아님
차이 핵심계약 중심 vs 기본 뼈대 중심
실무 기준공유 구현이 필요한지 먼저 판단

주의할 점

interface가 항상 더 현대적이거나, abstract class가 항상 더 강력한 것은 아닙니다. 공통 계약인지 공통 구현인지 기준을 먼저 세우면 선택이 훨씬 쉬워집니다.

참고 링크

2 sources