추상화는 내부 구현을 숨기고 사용자에게 기능만 표시하는 것을 의미합니다. 추상 클래스(Abstract Class)와 인터페이스(Interface)는 모두 추상화를 위해 사용되는데요. 이 둘은 어떤 차이가 있을까요?
메소드 타입: 인터페이스는 추상 메소드만 가질 수 있습니다. 이와 달리 추상 클래스는 추상 메소드와 추상적이지 않은 메소드 모두 가질 수 있습니다. 하지만 Java8 부터 인터페이스도 디폴트 메소드와 정적 메소드를 가질 수 있게 되었으며, Java9 부터는 private 메소드도 가질 수 있게 되었습니다.
변수 타입: 인터페이스에 오직 정적(static)이며 초기화시 변경불가능(final)한 변수들만 가질 수 있습니다. 반면에 추상 클래스는 static, non-static, final, non-final 변수들 모두 소유 가능합니다.
구현 제공: 추상 클래스는 인터페이스의 구현체가 될 수 있습니다. 반면에 인터페이스는 추상 클래스의 구현체가 될 수 없습니다.
구현 방법: 인터페이스는 구현체 하나에 여러개의 인터페이스를 가질 수 있습니다. 추상 클래스는 구현체 하나의 하나의 추상 클래스만 가질 수 있습니다.
다중 상속: 인터페이스는 다중 상속을 지원합니다. 반면에 추상 클래스는 다중 상속을 지원하지 않습니다.
멤버 변수 접근성: 인터페이스의 멤버 변수들은 기본적으로 public 입니다. 반면에 추상 클래스는 private, protected 등과 같은 멤버 변수를 가질 수 있습니다.
출처