interface는 계약 — 타입이 제공해야 하는 메서드 집합 — 을 선언하며, 구현은 없거나(또는 최소한입니다). abstract class는 부분적으로 구현된 class로, 공유 상태와 구체 메서드를 가질 수 있지만 인스턴스화할 수 없습니다. 핵심 차이: class는 여러 interface를 구현할 수 있지만 하나의 class만 상속할 수 있습니다.
interface는 계약 — 타입이 제공해야 하는 메서드 집합 — 을 선언하며, 구현은 없거나(또는 최소한입니다). abstract class는 부분적으로 구현된 class로, 공유 상태와 구체 메서드를 가질 수 있지만 인스턴스화할 수 없습니다. 핵심 차이: class는 여러 interface를 구현할 수 있지만 하나의 class만 상속할 수 있습니다.
| Interface | Abstract class |
|---|
| 인스턴스화 | 불가 | 불가 |
| 다중 상속 | 가능 (여러 개 구현) | 불가 (단일 기반) |
| 필드 / 상태 | 불가 (상수만*) | 가능 |
| 메서드 본문 | default 메서드만* | 가능, 완전히 |
| 모델링 대상 | 능력 ("할 수 있다") | 공유 코드가 있는 is-a |
*최신 Java는 default 메서드와 상수를 허용합니다. 정신은 여전히 유효합니다.
interface Drawable { // 능력
void draw();
}
abstract class Shape { // 공유 정체성 + 상태
protected String color;
Shape(String color) { this.color = color; }
abstract double area(); // 서브클래스가 정의해야 함
String describe() { // 공유 구체 동작
return color + " shape, area=" + area();
}
}
class Circle extends Shape implements Drawable {
private double r;
Circle(String c, double r) { super(c); this.r = r; }
double area() { return Math.PI * r * r; }
public void draw() { /* 렌더링 */ }
}
Circle은 Shape이다(하나의 기반, 공유 코드) 그리고 Drawable일 수 있다(혼합된 능력).
잘못 선택하면 설계가 고정됩니다: abstract 기반은 단일 상속 라인을 강제하지만, interface는 타입이 자유롭게 능력을 조합하도록 유지합니다.
Interface는 디커플링을 위한 선호되는 기본값입니다 — 구체적 계층 구조가 아니라 계약에 의존하는 것이 코드를 테스트 가능하고 확장 가능하게 유지합니다.