클래스는 구체적인 클래스와 추상클래스가 있다. 구체적인 클래스는 상세한 구현을 포함하는 클래스이고, 추상클래스는 객체가 아니라 타입으로만 존재하고 추상메소드를 가지는 존재이다. 추상메소드란 구현 클래스에게 오버라이드를 강제하는 메소드이다.
인터페이스는 객체가 아닌, 객체와 객체의 중간에 놓이는 통신장치와 같다. 인터페이스는 어떤 객체가 할 수 있는 기능 자체를 의미하며 그 기능을 하나의 스펙으로 모은 것이다. 인터페이스는 상수와 추상메소드로만 이루어져있다. 인터페이스는 객체들이 같이 바라보는 존재이므로 외부에서 보여야 하기 때문에 private로 정의될 수 없다. 인터페이스 안에 선언되는 모든 변수는 자동으로 public static final로 선언된다. 그리고 상속과 달리 다중구현이 가능하다.
추상클래스와 인터페이스는 객체지향의 특징 중 하나인 다형성의 형태로 볼 수 있다. 다형성이란 하나의 타입이 n개의 객체를 커버하는 것이다. 이 둘은 오버라이드를 강제하는 추상메소드를 갖는다는 점이 공통적이다.
하지만 이 둘을 사용하는 목적에서는 분명한 차이가 있다.
추상클래스는 객체를 못 만들 뿐이지 상속의 기능은 그대로 있기 때문에, 클래스가 객체 생성의 용도가 아닐 경우 변수의 타입으로 선언하는 용도와 상속의 본연의 기능으로 특정한 코드를 하위 클래스로 물려주는 기능을 활용할 때 사용한다.
인터페이스는 스펙(조건)을 정의하는 방식의 설계이다. 실제 기능 구현 전에 상호간 메소드 설계를 결정하는 경우, 전혀 다른 데이터와 로직을 가진 클래스들을 하나의 타입으로 사용해야할 경우 사용한다.