빠른 비교
interface Payable {
int pay();
}
abstract class Employee implements Payable {
protected String name;
}갈리는 기준
어떤 추상화 형태를 먼저 고르면 되나
| 상황 | 먼저 떠올릴 것 |
|---|---|
| 역할 계약만 필요 | interface |
| 공통 상태와 기본 구현 공유 | abstract class |
| 여러 역할을 조합 | 여러 interface 구현 |
| 공통 field 필요 | abstract class |
interface: 역할 계약과 느슨한 결합
interface는 "무엇을 할 수 있는가"라는 계약을 표현하는 데 잘 맞습니다. Java는 클래스 다중 상속을 허용하지 않지만 여러 interface 구현은 허용하므로, 역할 조합이 훨씬 유연합니다. 서로 관련 없는 클래스도 같은 interface를 구현할 수 있다는 점이 큰 장점입니다.
interface Printable { void print(); }
interface Serializable { byte[] serialize(); }
// 관련 없는 두 역할을 한 클래스에 부여
class Report implements Printable, Serializable {
@Override public void print() { ... }
@Override public byte[] serialize() { ... }
}abstract class: 공통 상태와 기본 구현 공유
abstract class는 "공통 상태와 일부 구현을 공유하는 기본 뼈대"를 표현하는 데 잘 맞습니다. field, protected 메서드, 공통 구현을 함께 둘 수 있어, 서로 밀접한 클래스들의 공통 기반을 만들 때 유용합니다.
abstract class HttpHandler {
protected final Logger log = LoggerFactory.getLogger(getClass());
// 공통 구현
public final void handle(Request req) {
log.info("Request: {}", req.path());
doHandle(req);
}
// 하위 클래스에서 구현
protected abstract void doHandle(Request req);
}선택 기준
"공통 동작 일부를 실제로 공유해야 하는가" → abstract class, "공통 타입 계약만 있으면 되는가" → interface로 구분하면 대부분의 선택이 정리됩니다. Java 8부터 interface에 default 메서드가 추가됐지만, 상태(field)를 공유해야 하면 여전히 abstract class가 필요합니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 역할 계약, 느슨한 결합 | interface |
| 여러 역할을 한 클래스에 부여 | 다중 interface 구현 |
| 공통 상태와 기본 구현 공유 | abstract class |
| 공통 field 필요 | abstract class |
| 공통 계약만 필요 | interface |
주의할 점
abstract class를 공유 구현 없이 계약 목적으로만 쓰면 다중 구현이 막히고 유연성을 잃습니다.
// ❌ 상태도 공유 구현도 없는 abstract class — interface가 더 적합
abstract class Notification {
abstract void send(String message);
}
// ✅ 역할 계약은 interface로
interface Notification {
void send(String message);
}
// ✅ 공통 구현이 있을 때 abstract class 사용
abstract class BaseNotification implements Notification {
private final String sender;
protected BaseNotification(String sender) {
this.sender = sender;
}
protected String getSender() { return sender; }
}참고 링크
2 sources