
추상 클래스는 사실 일반 클래스 + 추상 메서드라고 볼 수 있다.
어느 클래스든 추상 메서드가 하나라도 있다면 그 클래스는 추상 클래스가 되는 것이다.
추상 클래스가 되는 순간 인스턴스화가 불가능 하다. 이 말을 사용이 안되는 클래스 라는 것.
추상 클래스를 사용하기 위해선 상속이라는 과정이 필수적인데, 자식 클래스가 추상 형태인 부모 클래스의 메소드중 추상 메소드는 전부 구현해버리면 그때서야 인스턴스화가 가능하다.
인터페이스는 추상 클래스의 특수형태다. 일반적으로 인터페이스 = 추상 클래스 - (필드+메서드)라고 보면 된다. (public static 상수를 갖을 순 있지만 그냥 저렇게 적었다)
인터페이스도 추상 클래스의 일종이기 때문에 직접 인스턴스화는 불가능하고 implements를 통해 자식 클래스가 구현해야한다. 이때 자식 클래스는 인터페이스의 모든 추상 메소드를 구현해야한다. (중간에 추상 클래스를 통해 일부 구현하는거 제외)
일단 기본적으로 인스턴스화를 위해서 클래스를 만든다. 하지만 추상 클래스는 직접 인스턴스화가 불가능하기 때문에 상속이 목적인 클래스라고 볼 수 있다. 즉, 추상 클래스는 상속이 목적인 클래스이며 상속은 extends. 확장이다. 추상 클래스를 상속받은 클래스들이 추상 클래스를 기반으로 구체적인 동작을 정의하게 되는게 최종 목적이라는 것.
반면 인터페이스도 인스턴스화가 불가능해서 구현이 목적인 클래스이며 implements는 곧 구현 객체들의 동일한 사용법과 동일한 동작을 보장하는것에 목적이 있다. 즉, 동일한 인터페이스를 구현한 서로 다른 클래스는 인터페이스에 의해 공통된 기능을 갖도록 강제되고, 이를 통해 다형성이 제공된다.