Abstract Class와 Interface
자바에서는 C++과 다르게 추상 클래스와 인터페이스의 개념을 명시적으로 구분한다. C++에서는 둘에 명확한 기술적 구분은 없고 모던 C++11에 와서야 __interface
키워드가 비표준으로 생겼다.
기본적으로 인터페이스는 어떠한 표준 동작을 만들기 위한 프레임으로 사용된다. 여기에 더불어 추상 클래스는 구체 클래스를 위한 상세화된 동작들을 명세할 수 있다. 다만 자바에서는 다중 상속이란 개념이 없기 때문에 추상 클래스를 다중으로 상속할 수 없다. 다만 다중 확장은 가능하다.
하지만 자바8 부터 인터페이스에 default 메소드
를 추가할 수 있도록 기능이 확장되면서 추상클래스와 인터페이스의 경계가 모호해졌다. 추상 클래스와 인터페이스가 가지는 차이는 다음과 같다.
상속과 확장
앞서 설명했듯이 추상 클래스는 다중 상속이 불가능하다. 인터페이스는 다중 확장이 가능하다.
인스턴스 변수
인터페이스에서는 모든 변수는 public static final
이다. 추상 클래스에서는 non-static
이나 non-final
필드를 지정할 수 있다.
인스턴스 메소드
인터페이스에서 모든 메소드는 public abstract
이다. 추상 클래스에서는 non-static
메소드나 public
protected
private
같은 다양한 Access Modifier를 지정할 수 있다.