자바에서 하나 이상의 추상 메소드를 포함하는 클래스를 추상 클래스라고 한다.
이러한 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다. 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 한다.(오버라이딩)
추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다. 일반 메소드로 구현한다면 사용자에 따라 해당 메소드를 구현할 수도 안할 수도 있다. 하지만 추상 메소드가 포함된 클래스를 상속받은 모든 자식 클래스는 추상 메소드를 구현해야만 인스턴스를 생성할 수 있으므로 반드시 구현하게 된다.
존재 목적은 추상클래스를 상속받아서 기능을 이용하고 확장시키는 데 있다.
클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러가지 문제가 발생할 수 있기 때문에 자바에서는 클래스를 통한 다중 상속은 지원하지 않는다.
하지만, 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스를 통해 다중 상속을 지원하고 있다.
존재 목적은 함수의 껍데기만 가지고 있으면서 함수의 구현을 강제하고 결과적으로 구현 객체의 같은 동작을 보장하기 위함이다.
둘은 그 사용용도가 비슷하기에 아래의 상황에 따라 적절히 선택해서 사용하자
추상 메소드만 선언한다면 인터페이스를 ,
다른 일반 메소드나 필드도 필요하면 추상클래스를 사용한다.
같은 종류나 행동들을 구현할 것이 많을 때 -> 추상클래스
상속에 대한 계층구조를 명확히 표현하고자 한다면 -> 추상클래스
디자인을 구성하는 요소들이 자주 바뀔때 -> 인터페이스
클래스 전체가 아닌 메소드들만 쓰고싶을 때 -> 인터페이스
https://jroomstudio.tistory.com/7
https://inpa.tistory.com/entry/OOP-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%B6%94%EC%83%81%ED%99%94-%EC%84%A4%EA%B3%84%EC%9D%98-%EC%9D%B4%ED%95%B4
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4Interface%EC%9D%98-%EC%A0%95%EC%84%9D-%ED%83%84%ED%83%84%ED%95%98%EA%B2%8C-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC
https://brunch.co.kr/@kd4/6