추상클래스는 일반 클래스와 별 다를 것이 없습니다. 단지, 클래스 안에 추상 메서드를 하나라도 선언하면 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스입니다. 그래서 미완성 설계도라고도 표현합니다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없습니다.
class 앞에 "abstract" 예약어를 사용하여 상속을 통해서 구현해야한다는 것을 알려주고 선언부만 작성하는 추상메서드를 선언할 수 있습니다.
abstract class 클래스이름 {
...
public abstract void 메서드이름();
}
추상클래스가 미완성 설계도라면 인터페이스는 그냥 설계도자체 라고 할 수 있습니다. 인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속(구현)이 가능합니다.
이 둘을 사용해 수 많은 클래스들의 구현에 방향성이 잡히기 때문에 구현 작업이 쉬워지는 장점이 있습니다.
추상클래스는 IS - A "~이다".
인터페이스는 HAS - A "~을 할 수 있는".
이렇게 구분하는 이유는 다중상속의 가능 여부에 따라 용도를 정한 것 같습니다. 자바의 특성상 한개의 클래스만 상속이 가능하여 해당 클래스의 구분을 추상클래스 상속을 통해 해결하고, 할 수 있는 기능들을 인터페이스로 구현합니다.
만약 모든 클래스가 인터페이스로 구성 되어 있다면,,,상속 받는 모든 클래스에서 똑같은 기능을 하는 메소드를 모두 오버라이딩해서 같은 기능을 구현해야 하는 번거로움이 있습니다.
🙋 어? 그럼 추상클래스만 쓰면 되는거아님????
🤖 자바는 하나의 클래스만 상속 가능하다고 닝겐 ^^;;;
정리하자면,
추상클래스의 경우 : 상속 관계를 쭉 타고 올라갔을때 같은 조상클래스를 상속하는데 기능까지 완벽히 똑같은 기능이 필요한 경우.
인터페이스의 경우 : 상속 관계를 쭉 타고 올라갔을때 다른 조상클래스를 상속하는데 같은 기능이 필요한 경우.