추상 클래스
- 미완성 설계도
추상 메서드란?
- 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨둔 메서드
- 상속받는 클래스에 따라 달라 질 수 있다.
규칙
- 추상 클래스는
abstract
를 붙여 표현
추상 메서드를 포함하지 않은 클래스에서도
abstract
를 붙여서 추상 클래스로 지정 가능- 추상 클래스는
new
를 통해 객체 생성 불가능
- 추상 케서드는 inteface와 같이 구현 부분은 없다.
- 추상 메서드는 자식 클래스에서 반드시 구현해야 한다. (오버라이딩)
- 추상 메서드가 하나 이상인 경우, 반드시 클래스에
abstract
키워드를 추가해야 한다.
인터페이스
- 기본 설계도
규칙
- 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.
- 모든 멤버 변수는
public static final
이어야 하며, 생략 가능
인터페이스 변수는 아무 인스턴스도 존재하지 않는 시점이기 때문에 스스로 초기화할 권한 없음
→
public static final
를 사용해 구현 객체의 같은 상태를 보장- 모든 메서드는
public abstract
이어야 하며, 생략 가능 (JDK 1.8 부터 static 메서드와 default 메서드 사용 가능)
- 다중 상속이 가능하다.
인터페이스 vs 추상 클래스
차이점
- 결합의 정도
추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다.
자바는 단일 상속만 지원 → 새로운 타입을 정의하는데 커다란 제약을 가진다.
When to use 추상 클래스?
- 관련성 높은 클래스 간에 코드를 공유하고 싶은 경우
- 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메서드와 필드가 많거나, public 이외의 접근자 (protected, private) 선언이 필요한 경우
- non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메서드가 필요한 경우)
When to use 인터페이스?
- 서로 관련성 없는 클래스들이 인터페이스를 구현하게 되는 경우
- 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지 신경쓰지 않는 경우
- 다중 상속을 허용하고 싶은 경우
ㅤ | 추상 클래스 | 인터페이스 |
변수 | 일반 클래스와 동일 | (public static final) 상속 |
메서드 | 일반 클래스와 동일
단, abstract 메서드는 무조건 1개 이상 | 추상 메서드, default/static 메서드(jdk 1.8부터) |
메서드 접근제어자 | public, protected, default(생략 가능) | public만(생략 가능) |
생성자 | O | X |
A {?} B | extends / 상속 (is-a) | implements / 구현 (has-a) |
다중상속 | 불가능 | 가능 |