interface Meter {
void start();
int stop(int distance);
}
class Car implements Meter {
public void start() {
System.out.println("시작!");
}
public int stop(int distance) {
return distance / 2;
}
}
순수한 설계의 틀을 제공한다.
abstract class Machine {
abstract void powerOn();
void check() {
System.out.println("시스템 점검");
}
}
class Computer extends Machine {
void powerOn() {
System.out.println("컴퓨터 켜짐");
}
}
공통 기능 일부와 설계도 제공한다.
| 구분 | interface | abstract class |
|---|---|---|
| 상속(구현) 방식 | implements로 구현 | extends로 상속 |
| 다중 상속 가능 | ✔️ 여러 개 동시 구현 가능 | ✖️ 단일 상속만 가능 |
| 메서드 구성 | 기본적으로 public abstract 메서드만 선언 (Java 8부터 default, static 가능) | abstract 메서드 + 일반 메서드 섞어 사용 가능 |
| 필드 구성 | 상수(public static final)만 선언 가능 | 일반 변수, 상수 모두 선언 가능 |
| 객체 생성 | 불가능 | 직접 생성 불가, 자식이 상속해야 사용 가능 |
| 주 사용 목적 | 설계 틀 제공(순수 규격) | 공통 기능 일부 제공 + 설계 제공 |
Java 클래스는 다이아몬드 상속 문제(모호성) 방지 목적 때문에 다중상속이 금지 된다
하지만 interface는 다중 상속을 허용한다.
다이아몬드 상속 문제란?
interface와 abstract class의 메모리 할당
abstract class가 어떻게 사용되는지