추상적인 개념을 제공하는 클래스
abstract 키워드를 붙인다.extends 키워드를 사용한다.public abstract class Animal {
// 추상 메서드
public abstract void sound();
// 일반 메서드
public void move() {
System.out.println("동물이 움직입니다.")
};
}
sound() 는 추상 메서드로 자식 클래스가 반드시 오버라이딩 해야 한다.move() 는 일반 메서드로 자식 클래스가 오버라이딩 하지 않아도 된다.public class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("야옹");
}
}
구현을 강제하기 위한 명세를 제공하는 구조
interface 키워드를 붙인다.public abstract 이다. (생략 권장)public static final 이다. (생략 권장)implements 라는 구현 키워드를 사용한다.public interface Animal {
// 멤버 변수(상수)
double MY_PI = 3.14;
// default 메서드
default void move() {
System.out.println("동물이 움직입니다.");
}
// 추상 메서드
void sound();
}
sound() 는 추상 메서드로 자식 클래스가 반드시 오버라이딩 해야 한다.move() 는 default 메서드로 자식 클래스가 오버라이딩 하지 않아도 된다.public class Dog implements Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
public class Cat implements Animal {
@Override
public void sound() {
System.out.println("야옹");
}
}
부모 클래스의 기능을 자식 클래스가 상속 받을 때, 클래스는 상속 받는다고 표현하지만, 부모 인터페이스의 기능을 자식이 상속 받을 때는 인터페이스를 구현한다고 표현한다. 상속은 이름 그대로 부모의 기능을 물려 받는 것이 목적이고 인터페이스는 모든 메서드가 추상 메서드이기때문에 물려받을 수 있는 기능이 없고, 오히려 인터페이스에 정의한 모든 메서드를 자식이 오버라이딩해서 기능을 구현하기 때문이다.
인터페이스는 메서드 이름만 있는 설계도이고, 이 설계도가 실제 어떻게 작동하는지는 하위 클래스에서 모두 구현해야 한다. 따라서 인터페이스의 경우 상속이 아니라 해당 인터페이스를 구현한다고 표현한다.
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 선언 키워드 | abstract | interface |
| 상속 키워드 | extends | implements |
| 상속/구현 개수 | 1개 클래스만 상속 가능 | 여러 개 인터페이스 구현 가능 |
| 구현 메서드 | 일반 메서드 포함 가능 | 자바 8부터 default, static 메서드 가능 |
| 목적 | 상속을 통한 기능 공유 | 기능 약속 및 다형성 제공 |