Interface
와 Abstract Class
는 상속(extends)받거나, 구현(implements)하는 Class가 Interface
나 Abstract Class
안에 있는 Abstract Method
를 구현하도록 강제하는 공통점을 가지고 있다.
Interface
는 부모, 자식 관계인 상속 관계에 얽메이지 않고, 공통 기능이 필요할 때, Abstract Method
를 정의해놓고 구현(implements)하는 Class에서 각 기능들을 Overridng하여 여러가지 형태로 구현할 수 있기에 다형성과 연관되어 있다.
Java에서 다중 상속이 안되어 발생하는 Abstract Class의 한계도 보완해줄 수 있다.
Interface의 implements에는 제한이 없어 다중 구현이 가능하다.
Abstract Class
는 부모와 자식 즉, 상속 관계에서 Abstract Class를 상속(extends)받으며 같은 부모 Class(여기서는 Abstract Class)를 상속받는 자식 Class들 간에 공통 기능을 각각 구현하고, 확장시키며 상속과 관련되어 있다.
상속은 SuperClass의 기능을 이용, 확장 하기 위해 사용된다.
Abstract Class
는 IS - A "~이다"
이고, Interface
는 HAS - A "~을 할 수 있는"
이다.
class Vehicle extends Car, Motorcycle {
@Override
public void run(){
super.drive();
}
}
만약 Java에서 다중 상속이 가능했다면 Car, Motocycle에 각각 drive method가 정의되어 있을 경우 무엇을 상속받아 Overridng 한건지 모호해진다.
이것이 다중 상속의 모호성이고, 이 때문에 Java는 다중 상속을 막아 놓았다.
Abstract Class
의 사용 목적을 살펴보면, 사실 위에 Talkable
Interface는 동일한 부모 Class인 Animal을 상속받는 Kim, Gil에서 사용하고 있는 기능이다.
여기서 Interface
의 사용 목적을 알 수 있는데, Eatable
Interface를 사용함으로써 Animal
, Plant
각각 다른 부모 Class를 상속받고 있는 Monkey, Kim, Gil, Venus Flaytrap에게 공통적인 기능인 먹는 기능을 Interface
를 사용함으로써 상속 관계가 다름에도 기능을 구현하도록 강제 할 수 있다.
출처 : https://velog.io/@gillog/Java-Interface-vs-Abstract-Class-%EC%A0%95%EB%A6%AC