기본 패턴
java
interface Payable {
int pay();
}
abstract class Employee implements Payable {
protected String name;
}설명
- interface는 "무엇을 할 수 있는가"라는 계약을 표현하는 데 잘 맞고, abstract class는 "공통 상태와 일부 구현을 공유하는 기본 뼈대"를 표현하는 데 잘 맞습니다.
- Java는 클래스 다중 상속은 허용하지 않지만, 여러 interface 구현은 허용합니다. 그래서 역할 조합은 interface 쪽이 훨씬 유연합니다.
- abstract class는 field, protected 메서드, 공통 구현을 함께 둘 수 있어, 서로 밀접한 클래스들의 공통 기반을 만들 때 유용합니다.
- 반면 interface는 구현보다 계약과 타입 역할을 강조합니다. 서로 unrelated한 클래스도 같은 interface를 구현할 수 있다는 점이 큰 장점입니다.
- 실무에서는 "공통 동작 일부를 실제로 공유해야 하는가"와 "공통 타입 계약만 있으면 되는가"를 기준으로 구분하면 대부분의 선택이 정리됩니다.
빠른 정리
| 도구 | 잘 맞는 상황 |
|---|---|
| interface | 역할 계약, 다중 구현, 느슨한 결합 |
| abstract class | 공통 상태와 기본 구현 공유 |
| 공통점 | 둘 다 직접 인스턴스화 대상은 아님 |
| 차이 핵심 | 계약 중심 vs 기본 뼈대 중심 |
| 실무 기준 | 공유 구현이 필요한지 먼저 판단 |
주의할 점
interface가 항상 더 현대적이거나, abstract class가 항상 더 강력한 것은 아닙니다. 공통 계약인지 공통 구현인지 기준을 먼저 세우면 선택이 훨씬 쉬워집니다.
참고 링크
2 sources