둘 다 직접 객체를 생성할 수 없음 (new 불가)
자식 클래스에서 상속(구현) 해야 함
다형성(Polymorphism)을 위해 사용됨
| 항목 | abstract class (추상 클래스) | interface (인터페이스) |
|---|---|---|
| 상속 | 클래스는 단일 상속만 가능 | 여러 개의 인터페이스 동시 구현 가능 |
| 목적 | 공통 기능 + 일부 추상화 | 기능만 정의 (100% 추상화) |
| 구현 가능 여부 | 일부 메서드 구현 가능 | (Java 8부터) default 메서드로 일부 구현 가능, 하지만 보통은 전부 미구현 |
| 필드(변수) | 인스턴스 변수, 생성자 가능 | 상수 (public static final)만 가능 |
| 생성자 | O (생성자 정의 가능) | X (생성자 없음) |
| 접근 제어자 | 메서드, 필드에 접근제어자 사용 가능 | 메서드는 기본적으로 public abstract |
| 상속 키워드 | extends | implements |
abstract class Animal {
void breathe() {
System.out.println("숨을 쉰다");
}
abstract void sound(); // 추상 메서드
}
class Dog extends Animal {
void sound() {
System.out.println("멍멍");
}
}
interface Flyable {
void fly(); // public abstract 생략됨
}
class Bird implements Flyable {
public void fly() {
System.out.println("날아간다");
}
}
abstract class: 상속받는 클래스끼리 공통된 코드나 필드가 있을 때 사용
(ex. 동물의 공통 기능)
interface: 서로 관련 없는 클래스들이 동일한 기능을 수행해야 할 때 사용
(ex. 자동차도, 새도 fly 할 수 있음)