- 추상 클래스: 클래스 내 추상 메소드가 하나 이상 포함되어 있거나, 목적에 맞게 사용하기 위하여 직접 객체를 만들어 사용하지 못하도록, abstract로 정의된 경우
- 인터페이스: 모든 메소드가 추상 메소드(default 메소드 제외)
공통점
- new 키워드를 통해 객체를 생성할 수 없다.
- 추상 클래스와 인터페이스 모두 상속받는 클래스 또는 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제한다.
- 상속 받거나 구현하는 클래스가 반드시 선언된 추상 메서드를 구현하도록 한다.
- 또한 추상 클래스를 상속 받거나 인터페이스를 구현하거나 이들 내부의 추상 메서드를 제대로 오버라이딩 하지 않으면 현재 클래스가 추상 클래스가 되어 버린다.
- 즉, 둘 다 하는 일은 추상메서드를 구현하는 것이다.
→ 그렇다면, 추상 클래스 하나 내에 추상 메서드를 여러 개 두거나 전부 추상 메서드만 두면 될텐데 인터페이스가 존재하는 이유는 무엇일까?
차이점
⇒ 결론: 인터페이스와 추상 클래스는 존재 목적이 다르다.
- 추상 클래스의 존재 목적: 추상 클래스를 상속 받아서 기능을 이용하고 확장
- 인터페이스의 존재 목적: 인터페이스는 함수의 껍데기만 있다. 그 이유는 함수의 구현을 강제하기 위함이다.
또한 그 구현을 강제 함으로써 구현객체의 같은 동작을 보장할 수 있다.
- 추상 클래스는 extends, 인터페이스는 implements
추상 클래스와 인터페이스 관계 참고 이미지
- 하지만, 이렇게 애매하지만 명확하게 다른 존재 이유가 있는데도 서로 상호 보완적인 면이 있는 이유는 무엇일까?
→ 자바가 다중 상속을 지원하지 않기 때문이다.
(내가 알아서 정리하기엔, 인터페이스는 이 인터페이스를 구현하는 클래스들에게 동일한 규칙을 일관되게 강제하는 것 같고,
추상 클래스는 이 추상 클래스가 수퍼클래스로서 기능을 물려 받고, 확장하게 하려는 것 같다.)