추상클래스는 일반 클래스와 별 다를게없음
단지 추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스입니다.
그래서 미완성 설계도라고도 표현합니다.
상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없습니다.
class 앞에 "abstract"예약어를 사용하여 상속을 통해서 구현해야한다는것을 알려주고 선언부만 작성하는 추상메서드를 선언할 수 있습니다.
abstract class 클래스이름 {
...
public abstract void 메서드이름();
추상클래스가 미완성 설계도라면 인터페이스는 기본설계도라고 할수 있습니다. 인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속(구현)이 가능합니다.
interface 인터페이스이름{
public static final 상수이름 = 값;
public abstract void 메서드이름();
}
추상클래스와 인터페이스의 공통점은 추상메서드를 사용할 수 있다는 것입니다.
그럼 왜 굳이 2가지로 나눠서 사용할까요?
추상클래스와 인터페이스의 기능들을 살펴보면 추상클래스가 인터페이스의 역할을 다 할 수 있는데 왜 굳이 인터페이스라는게 있는걸까요?
이론적인 차이점을 다 제외하고 두개로 나눠서 사용하는 가장 큰 차이점은 사용용도라고 생각합니다.
사용의도 차이점
추상클래스는 is-A "~이다".
인터페이스는 HAS-A "~을 할수있는"
이렇게 구분하는 이유는 다중상속의 가능 여부에 따라 용도를 정한 것 같습니다. 자바의 특성상 한개의 클래스만 상속이 가능하여 해당클래스의 구분을 추상클래스 상속을 통해 해결하고 할수있는 기능들을 인터페이스로 구현합니다.
공통된 기능 사용여부
만약 모든 클래스가 인터페이스를 사용해서 기본 틀을 구성한다면... 공통으로 필요한 기능들도 모든 클래스에서 오버라이딩하여 재정의 해야하는 번거로움이 있습니다. 이렇게 공통된 기능이 필요하다면 추상클래스를 이용해서 일반 메서드를 작성하여 자식 클래스에서 사용할수있도록 하면된다.
어!? 그러면 그냥 추상 클래스만 사용하면 되는거 아님?
위에서 이야기 했듯이 자바는 하나의 클래스만 상속이 가능하다
만약 각각 다른 추상클래스를 상속하는데 공통된 기능이 필요하다면
해당기능을 인터페이스로 작성해서 구현하는게 편하겠죠?

추상클래스 사용 시기 : 상속 관계를 쭉 타고 올라갔을때 같은 조상클래스를 상속하는데 기능까지 완벽히 똑같은 기능이 필요한 경우 (예:attack,printInfo)
인터페이스 사용시기 : 상속관계를 쭉 타고 올라갔을때 다른 조상클래스를 상속하는데 같은 기능이 필요한 경우 인터페이스를 사용
(예: Swimable)
https://myjamong.tistory.com/150
여기서 더 자세히 볼수있어요