관리 메뉴

개발노트

Abstract Class vs Interface [특징 및 차이점] 본문

Java

Abstract Class vs Interface [특징 및 차이점]

YoonGwon 2024. 6. 20. 16:36

Abstract Class vs Interface

Abstract Class란?

추상 클래스는 일반 클래스와는 달리 단독으로 객체를 생성할 수 없다.
반드시 추상 클래스를 상속한 실제 클래스를 통해서만 객체를 생성할 수 있다.

점프투자바

인스턴스화 될 수 없으며, extends를 통해서 자식 클래스에 의해 완성됨
추상 클래스는 여러 클래스에서 공통으로 쓰는 property와 method를 모아두는 용도로 사용함

Interface란?

유지보수에서 인터페이스(interface)는 SOLID를 구현하고, 객체 지향 개발을 하는데 큰 도움을 줍니다.
...
인터페이스는 객체를 어떻게 구성해야 하는지 정리한 설계도입니다.
...
객체가 인터페이스를 사용하면, 인터페이스 메서드를 반드시 구현해야 하는 제약을 합니다.

자바 인터페이스(Java Interface)는 무엇인가?

인터페이스는 특정 기능을 개발할 때 공통적인 기능을 명시하고 강제적으로 구현하게 하는 용도로 사용됨
추상 클래스보다 추상화 단계가 높다

차이점

자바8 버전 이후부터는 디폴트 메서드(default method)를 사용할 수 있다.
인터페이스의 메서드는 몸통(구현체)을 가질 수 없지만 디폴트 메서드를 사용하면 실제 구현된 형태의 메서드를 가질 수 있다.
점프투자바

자바8 버전 이후 디폴트 메서드의 사용으로 인터페이스와 추상 클래스의 차이가 모호해짐

가장 큰 차이는 추상 클래스의 자식 클래스는 하나의 클래스만 extends 할 수 있지만,
인터페이스의 구현 클래스는 여러개의 인터페이스를 implements 할 수 있다

 

왜 인터페이스의 다중 상속은 허용되고,  클래스는 안되는 걸까?

만약 자식클래스가 둘 이상의 클래스로부터 다중 상속을 받는다고 가정하자.

ParentA 부모 클래스에 love() 라는 메서드가 이미 정의되어있고, 마찬가지로 ParentB 라는 부모 클래스에도 love() 메서드가 존재한다. love() 메서드가 동일한 시그니처를 가진다면,  자식클래스는 둘 중 어느것을 상속받아야 할까?

(동일 시그니처 : 메서드의 접근 제어자, 리턴 타입, 메서드 명, 매개변수가 모두 동일함을 의미. 메서드 구현부는 같을수도, 다를 수도 있다.)

 

자식 클래스 입장에서는, love() 메서드를 상속받을 때, 어느 부모의 메서드를 상속받아야할 지 파악할 수 없게 된다. 이미 구현이 완료된 동일 시그니처의 메서드를 상속받는 일은 결국 불가능하다. 

 

반면 인터페이스는 다중 상속이 가능하지만, 위의 문제를 피해 갈 수 있다. 왜냐하면 메서드가 정의되지 않았기 때문이다.
즉 선언된 형태의 메서드만 가지는 인터페이스는, 동일 시그니처의 메서드를 얼마든 상속받아도 아무런 문제가 발생하지 않는다.

해당 메서드는 아직 구현되지 않아 자식 클래스에서 새롭게 정의해야 하기 때문이다. 

 

인터페이스의 다중 상속

public interface Father{
   void love();
}

public interface Mother{
   void love();
}
public class Child implements Father, Mother {
   @Override
   void love(){
      System.out.println("L.O.V.E");
   }
  
   public static void main(){
      Child child = new Child();
      child.love();  // "L.O.V.E"
   }
}

 

 

마무리

  • 인터페이스는 구현된 메서드가 없기 때문에, 다중상속이 가능하다.
  • 하지만, 클래스나 추상 클래스는 이미 구현된 메서드가 존재하기 때문에 다중 상속이 불가능하다.
  • 추상 클래스보다는 인터페이스를 사용하는 것이 좋은 디자인이라는 의견.
728x90