자바에서 인터페이스와 추상 클래스는 둘 다 추상화를 구현하는데 사용된다. 여기서 추상화란 객체의 공통적인 특성을 추출하여 정의하는 것을 말한다. 이를 통해 코드의 재사용성과 유지보수성을 향상 시킬 수 있다.
추상 클래스는 하나 이상의 추상 메서드를 포함할 수 있는 클래스이다. 추상 메서드는 선언만 되어 있고 본체가 없는 메서드이다.
추상 클래스는 일반 메서드와 필드 뿐만 아니라 추상메서드도 포함 할 수 있다.
추상 클래스는 직접 객체 인스턴스를 생성 할 수 없으며 반드시 하위 클래스에서 상속받아 추상메서드를 구현한 후에 해당 클래스의 객체를 생성 할 수 있다.
인터페이스는 메서드의 명세만을 가지고 있으며 그 메서드의 구현은 인터페이스를 구현하는 클래스에서 이루어진다.
하나의 클래스가 여러 인터페이스를 구현 할 수 있다.
인터페이스는 다중 상속을 지원한다.


추상 클래스에서는 메서드 본문이 없으면 abstract void start(); 로 선언 되어야 한다.
인터페이스는 본문이 없는 명세만을 가지고 있으며 단순히 선언만 되어 있다.
또 다른 차이는 상속과 포함의 관계이다
클래스가 A가 클래스 B를 상속받을 때 이는 'A는 B이다.' 라고 말 할 수 있다.
추상 클래스는 하위 클래스에게 공통된 특성을 제공하고 이러한 하위 클래스들은 추상 클래스의 특성을 갖는다.
예를 들어 동물 클래스가 있고 개와 고양이 클래스가 있을 때 '개는 동물이다.' 와 '고양이는 동물이다' 라고 말 할 수 있다.
클래스가 다른 클래스를 포함하고 있음을 의미한다. 예를들어 클래스 A가 클래스 B를 내부에 포함하고 있을 때 이는 'A는 B를 가지고 있다.' 라고 말 할 수 있다.
인터페이스는 클래스가 특정한 기능을 가질 수 있음을 나타내며 클래스는 해당 인터페이스를 구현하여 해당 기능을 얻을 수 있다.
예를 들어 자동차 클래스가 운전 가능한 'Drive' 인터페이스를 가질 수 있다. 이 경우 자동차는 운전 가능한 기능을 가지고 있다'라고 말 할 수 있다.
따라서 추상 클래스는 클래스들 간의 공통된 특성을 표현하고, 인터페이스는 클래스들이 가질 수 있는 특정한 기능을 정의한다.
추상 클래스와 인터페이스를 언제 어떻게 사용하는지 궁금해서 공부를 해보았다.
긍정적인 점은 추상 클래스와 인터페이스를 사용할 기준을 상속과 포함 관계 라는 것을 알게 되었다.
상속 관계와 포함 관계가 어떻게 보면 쉬운 관계이면서 깊게 생각하면 아직도 어렵게 느껴진다.
앞으로 과제를 진행하면서 생각을 해보면서 잘 활용해봐야 할 것 같다.