인터페이스(Interface)와 추상클래스(Abstract class) 공통점과 차이점
추상클래스와 인터페이스는 선언만 있고 구현 내용이 없는 클래스다.
자바8부터 인터페이스에 default method 구현이 가능해졌지만 일반적으로 인터페이스는 구현이 없다.
인터페이스와 추상클래스를 가지고 새로운 인스턴스(객체)를 생성할 수 없다.
추상클래스를 extends로 상속받아 구현한 자식클래스나 인터페이스를 implements 하고 구현한 자식클래스만이 객체를 생성할 수 있다.
추상클래스는 추상메서드(abstract method)가 하나라도 존재하는 클래스를 말한다.
즉, 일부는 구현된 메서드도 있을 수 있고, 일부는 abstract method로 구현이 되어있지 않은 메서드도 있을 수 있다.(강제성 없음)
여기서 포인트는 추상클래스를 언제 사용해야하는 지다.
인터페이스와 추상클래스를 단순하게 자식클래스에서 반드시 구현하게 위임시키는 것만 생각하면 비슷하지만 용도를 봤을 때 다르다.
추상클래스는 말그대로 추상화 시킬 때 사용하면 된다.
책에서 보는 is-a 관계가 핵심이다.
쉽게 말하면 만들어야할 여러 클래스들의 공통점을 찾아 추상화시켜서 사용하는 것이 개발에서 이득일 때!
예를 들면, 냉장고, TV, 커피머신, 전자렌지등의 클래스를 만들어야할 일이 있을 때 가전제품이라는 추상클래스로 추상화 시켜서 사용하면 좋을 때 사용한다.
냉장고 is a 가전제품 , 커피머신 is a 가전제품 , 전자렌지 is a 가전제품
상속 받아서 기능을 확장시키는데 목적, 전형적인 상속의 목적 또한 자바특성상 다중상속이 불가한 점을 고려해서 사용해야한다.
요약하면 다중상속 불가, 멤버 변수 존재 가능, 구현된 메서드 존재 가능 이다.
즉 구현 객체가 같은 동작을 한다는 것을 보장하기 위한 목적이다.
클래스가 아니기 때문에 인터페이스는 다중 상속이 가능하다.
interface도 is-a관계다.
Thread는 runnable이다. 라고 했을 때 인터페이스도 상속이니 is-a관계로 볼 수 있다.
Inheritance (IS-A) vs. Composition (HAS-A) Relationship 으로 상속과 관련되면 is-a로보고 멤버 변수로 사용되면 has-a로 본다.
public class Computer{
private Cpu cpu;
private Memory memory;
//...
class Cpu{
//...
}
class Memory{
//...
}
}