본문 바로가기
Dev Log/Java

[Java] Interface vs Abstract class

by 삽질하는큐 2019. 5. 7.

interface

  • 오직 추상 method와 상수만을 멤버로 갖는다. (JDK 1.8부터는 static method와 default method도 가능)
    • static method: 선택적으로 override할 수 있고, 객체에서도 호출되고 static으로도 호출 가능
    • default method: 선택적으로 override할 수 있음.
  • 다중 구현 가능

abstract class

  • 상속은 하나만 가능
  • 추상 method를 가진 클래스

공통점

  • new 연산자로 인스턴스 생성 불가능
  • prototype만 있는 method를 갖는다.
  • 사용하기 위해서는 확장/구현 해야 한다.

차이점

  • MINOR) abstract class는 완성된 method를 사용할 수 있지만, interface는 추상 method와 static, default method 선언만 가능하다. ⇒ 이것은 사실 상속/구현한 입장에서는 크게 다르지 않아 보인다.
  • MINOR) abstract class는 다중 상속이 안 된다. interface는 다중 구현(상속)이 가능하다.
  • 결국엔 "목적이 다르다"는게 답이다.
    • interface ⇒ 구현 객체가 같은 동작을 한다는 것을 보장하는 것이 목적이다.
    • abstract class ⇒ 기능을 확장하는 것이 목적이다. 공통적인 기능을 묶어 상위 클래스화하고, 구현이 필요한 것들을 추상화 한다.
  • 상태를 가질 수 있는지 여부. abstract class는 기본적으로 클래스라 변수를 가질 수 있다. interface는 instance 변수를 가질 수 없기 때문이다. 상수만이 있을 뿐이다.
  • 생성자를 가질 수 있는지 여부. abstract class (O), interface (X)

 

여담

  • interface에 default method가 추가 된 이유는 Collection API의 람다식 지원을 위한 back단 개선이라고 한다. 안 그랬으면 기존의 것들을 전부 deprecated 하고 새로운 버전의 클래스를 만들어야 하는 문제가 발생하기 때문이다.