하위 클래스의 공통점을 추상화하여 만든 클래스를 의미한다.
다중 상속이 불가능하여 단일 상속만 허용
추상 클래스는 추상 메소드 외의 일반 클래스처럼 일반적인 필드, 메서드, 생성자를 가질 수 있다.
상태정보 저장 가능
생성자 구현 가능
모든 메서드를 public 으로 정의해야 하고, 모든 필드를 public static final인 상수로 정의해야한다.
메서드의 시그니처만을 포함하고 구현은 포함하지 않는다.
다중구현(여러 개의 인터페이스를 구현)을 지원한다
인터페이스와 추상클래스는 둘 다 추상 메소드를 통해 상속/구현을 통한 메소드 강제 구현 규칙을 가지는 추상화 클래스이다.
다만 이 둘은 각각의 고유의 특징들을 가지고 있는데, 이러한 특징으로 인해 각각 사용처가 갈리게 된다.

// 독수리
class Eagle {
private String wings;
private String feathers;
public void fly();
}
// 비둘기
class Pigeon {
private String wings;
private String feathers;
public void fly();
}
abstract class Bird {
protected String wings;
protected String feathers;
//생성자
public Bird(String wings, String feathers) {
this.wings = wings;
this.feathers = feathers;
}
public abstract void fly();
}
// 독수리
class Eagle extends Bird {
public Eagle();
@Override
public void fly();
}
class Pigeon extends Bird {
public Pigeon();
@Override
public void fly();
}
중복되는 멤버 wing,feather를 상속을 통해 상위 클래스로 묶어 메서드도 통합하여 추상화 해주면서 나중에 다른 클래스를 추가/확장하는데 있어서 유연한 객체 지향 설계를 만들 수 있다.
또한, 생성자를 정의하여 자식 클래스에서 부모 클래스의 속성을 초기화하여 사용할 수 있다.
인터페이스의 가장 큰 특징은 구애 받지 않은 상속(구현)이 가능하다는 것이다.
상속(extends)는 클래스끼리의 논리적인 타입 묶음이라면, 구현(implements)은 관련없는 클래스간의 공통적 동작의 정의이다.


독수리와 비둘기의 공통 기능(날다)과 사람과 타조의 공통 기능(걷다, 뛰다)로 정의
// 인터페이스
interface Flyable {
void fly();
}
//
interface Walkable {
void walk();
void run();
}
// 조류 추상 클래스
abstract class Bird {
public String feathers;
public Bird(String feathers) {}
}
// 타조 클래스
class Ostrich extends Bird implements Walkable {
public Ostrich() {}
@Override
public void walk() {}
@Override
public void run() {}
}
// 독수리 클래스
class Eagle extends Bird implements Flyable {
public Eagle() {}
@Override
public void fly() {}
}
// 비둘기 클래스
class Pigeon extends Bird {
public Pigeon() {}
@Override
public void fly() {}
}