흔히 추상클래스와 인터페이스의 차이점으로 구현되어 있는 메서드의 존재 여부를 말한다. 추상클래스는 공통 로직에 대해 구현이 되어 있지만 상속받는 클래스마다 다른 지점은 추상 클래스로 선언하여 커스터마이징을 하며, 인터페이스는 모든 메서드가 추상 메서드로 이루어져 있기 때문에 구현되어 있는 메서드가 없다.

하지만 Java8 에서 인터페이스의 디폴트 메서드가 추가되면서 둘의 차이점이 줄어들었다. 디폴트 메서드는 인터페이스에서 선언한 기본 메서드이다. 구현부가 존재하는 완전한 메서드이며 인터페이스를 구현한 클래스에서도 접근 가능하다.

정리해보면 추상클래스에서도 공통 로직의 메서드와 추상 클래스가 존재하며, 인터페이스에서도 공통 로직의 메서드와 추상 클래스가 존재한다. 이 둘의 차이점은 무엇일까? 또 어떤 상황에서 어떤 것을 선택하는 것이 좋을까?

다중 상속

사실 추상클래스와 인터페이스의 가장 큰 차이점은 다중 상속이다. 추상클래스는 다중 상속이 불가능하여 상속할 때 하나의 추상클래스에서만 가능하다. 인터페이스는 다중 상속을 지원하여 여러 인터페이스에 정의되어 있는 기능을 구현하고 싶을 때 여러 개를 구현할 수 있다. 하지만 이 차이점만 있다면 모든 상황에서 인터페이스를 선택하는 것이 좋을 것이다.

인스턴스 변수