Java

인터페이스(Interface)와 추상클래스(Abstract class) 공통점과 차이점

RyanGomdoriPooh 2019. 1. 30. 16:38
공통점

 

추상클래스와 인터페이스는 선언만 있고 구현 내용이 없는 클래스다.

 

자바8부터 인터페이스에 default method 구현이 가능해졌지만 일반적으로 인터페이스는 구현이 없다.

 

인터페이스와 추상클래스를 가지고 새로운 인스턴스(객체)를 생성할 수 없다.

 

추상클래스를 extends로 상속받아 구현한 자식클래스나 인터페이스를 implements 하고 구현한 자식클래스만이 객체를 생성할 수 있다.

 
=> 결국 자식클래스가 무언가 반드시 구현하도록 위임해야할 때 사용해야 한다.

 


차이점
 
1.추상클래스

 

추상클래스는 추상메서드(abstract method)가 하나라도 존재하는 클래스를 말한다.

 

즉, 일부는 구현된 메서드도 있을 수 있고, 일부는 abstract method로 구현이 되어있지 않은 메서드도 있을 수 있다.(강제성 없음)

 

여기서 포인트는 추상클래스를 언제 사용해야하는 지다.

 

인터페이스와 추상클래스를 단순하게 자식클래스에서 반드시 구현하게 위임시키는 것만 생각하면 비슷하지만 용도를 봤을 때 다르다.

 

추상클래스는 말그대로 추상화 시킬 때 사용하면 된다.

 

책에서 보는 is-a 관계가 핵심이다.

 

쉽게 말하면 만들어야할 여러 클래스들의 공통점을 찾아 추상화시켜서 사용하는 것이 개발에서 이득일 때!

 

 예를 들면, 냉장고, TV, 커피머신, 전자렌지등의 클래스를 만들어야할 일이 있을 때 가전제품이라는 추상클래스로 추상화 시켜서 사용하면 좋을 때 사용한다.

 

냉장고 is a 가전제품 , 커피머신 is a 가전제품 , 전자렌지 is a 가전제품

 

상속 받아서 기능을 확장시키는데 목적, 전형적인 상속의 목적 또한 자바특성상 다중상속이 불가한 점을 고려해서 사용해야한다.

 

요약하면 다중상속 불가, 멤버 변수 존재 가능, 구현된 메서드 존재 가능 이다.

 
 
2.인터페이스
 
인터페이스는 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제하는 역할이다.

즉 구현 객체가 같은 동작을 한다는 것을 보장하기 위한 목적이다.

클래스가 아니기 때문에 인터페이스는 다중 상속이 가능하다.

interface도 is-a관계다.

Thread는 runnable이다. 라고 했을 때 인터페이스도 상속이니 is-a관계로 볼 수 있다.

Inheritance (IS-A) vs. Composition (HAS-A) Relationship 으로 상속과 관련되면 is-a로보고 멤버 변수로 사용되면 has-a로 본다.
 
* 참고로 has-a 관계는 어떤 클래스의 멤버 변수로 가지고 있을 수 있으면 뭐든 has-a 관계인 것 같다.
 
public class Computer{
    private Cpu cpu;
    private Memory memory;
    //...
    class Cpu{
    //...
    }
    class Memory{
    //...
    }
}
 
Computer has a CPU and Memory.
 

인터페이스를 가지고 있어도 어떤 구성을 나타낸다면 has-a로 볼 수도 있는 것 같다.