공통점
- 자바에서 타입을 정의하는 방법이다.
- 추상 메서드를 가지며, 반드시 구현해야한다.
- 추상클래스 : 추상메서드를 가지는 클래스
- 인터페이스 : 모든 메서드가 public abstract이며, 해당 제어자는 생략가능하다. *
- 스스로 생성자를 통해서 인스턴스를 생성할 수 없다.
- 추상 클래스 : 상속을 통해 자식 클래스의 인스턴스를 생성한다.
- 인터페이스 : 인터페이스를 구현한 클래스를 통해 인스턴스를 생성한다.
차이점
추상클래스 | 인터페이스 |
객체이므로, 상태와 행위를 가진다. (= 추상메서드 외에 필드와 생성자, 메서드를 가질 수 있다.) |
명세이므로, 행위만을 정의한다. (= 추상 메서드와 상수만을 가진다.)* |
Object 클래스를 상속하므로, equals와 hashcode를 재정의할 수 있다. |
Object 클래스를 상속하지 않으므로, equals와 hashcode를 재정의할 수 없다. |
다중 상속이 불가능하다 | 다중 구현이 가능하다. |
사용 시기
- 추상 클래스
- 타입 계층 구조를 구현해야 하는 경우
- 공통으로 가지는 메서드와 필드가 많아 중복 멤버를 통합할 때
- 인스턴스의 상태 변경이 필요할 때
- 인터페이스
- 서로 관련이 없는 클래스들을 묶어 주고 싶을 때
- 다중 구현을 통한 추상화 설계를 해야할 때
- 명세를 정의했으나, 어떤 클래스가 구체적인 동작을 구현하는 지 알 필요가 없는 경우
레퍼런스
- 자바의 정석 3판 p.375 ~ 402
- Interface는 객체인가?
- https://www.baeldung.com/java-interface-vs-abstract-class
* 단, jdk 1.8 이후 static 메서드와 default 메서드, jdk1.9 이후 private 메서드를 가질 수 있다.
(참고로 default 메서드의 default는 접근 제어자가 아닌 키워드다)
'Develop > Java' 카테고리의 다른 글
표준 예외 vs 사용자 정의 예외 (0) | 2023.04.05 |
---|---|
try-finally와 try-with-resource (0) | 2023.04.05 |
다형성 (0) | 2023.04.04 |
제어자 (0) | 2023.04.04 |
메서드 오버라이딩(Overriding) (0) | 2023.04.04 |