이 문서는 Java 8 기준으로 작성되었습니다.

추상클래스와 인터페이스는 비슷하다. 객체를 만들 수 없다는 점과 둘 다 메서드를 선언만 할지 아니면 구현도 할지 선택할 수 있다는 점이 같다. 하지만 추상 클래스와 달리 인터페이스는 모든 필드가 키워드를 안 붙여도 자동으로 public static final 이 되며 모든 메서드가 public 으로 선언되거나 정의되어야 한다.

그렇다면 추상 클래스와 인터페이스는 어떤 상황에 사용할까?

  • 이럴 때 추상클래스를 사용한다.
    • 관련성이 높은 클래스들간에 코드 공유를 하고 싶을 때
    • 상속할 공통 메서드와 필드가 많거나 접근 제어자로 public 이외의(protected 또는 private 같은) 것을 사용하고 싶을 때
    • static 이나 final 이 아닌 필드를 선언하고 싶을 때. 이렇게하면 객체의 상태에 접근하고 수정할 수 있는 메서드를 정의하는 게 가능
  • 이럴 때 인터페이스를 사용한다.
    • 관련성이 없는 클래스들간에도 같은 기능을 구현할 때. 예를 들면 Comparable 과 Clonable을 구현하는 많은 클래스들은 서로 상관이 없음
    • 특정 데이터 타입의 행위를 명시하고 싶으면서도, 어떤 것이 그 행위를 구현할지 관심이 없을 때
    • 다중 상속의 이점을 취하고 싶을 때

참조