내일배움캠프

내일배움캠프: 추상 클래스와 인터페이스

pracumj 2024. 11. 27. 23:41

오늘은 상호작용 기능을 인터페이스와 추상클래스 중 어떤 것을 선택해야할 지 고민하였다. 이 과정에서 결국 추상 클래스를 선택하긴 했지만,더 명확하게 인터페이스와 추상클래스 선택점을 만들면 좋을 것 같아서 해당 내용에 관해 공부해 보았다.

인터페이스 vs 추상클래스 

  추상 클래스 인터페이스
사용 키워드 abstract class interface
사용 가능 변수 인스턴스 필드, 정적 필드, 상수 모두 가능 const (상수만 가능)
사용 가능 접근 제어자 제한 없음 (public, protected, private, internal 등) 암묵적으로 public (명시적 접근 제어자 사용 불가)
사용 가능 메서드 추상 메서드, 일반 메서드, 정적 메서드 사용 가능 추상 메서드, 기본 구현 메서드(default), 정적 메서드
속성 (Property) 일반 속성 및 추상 속성 모두 가능 추상 속성 및 기본 구현 속성만 가능
상속 키워드 : BaseClass : IInterface
다중 상속 가능 여부 불가능 가능 (여러 인터페이스 구현 가능)
인스턴스화 가능 여부 불가능 (직접 객체 생성 불가) 불가능
사용 목적 공통 기능(필드 및 메서드 포함)의 상속 제공 특정 행위의 계약(메서드 및 속성 시그니처 제공)
공통점 1. 인스턴스화할 수 없다.
2. 구현 클래스에서 모든 추상 멤버를 반드시 구현해야 한다.
3. 다형성을 지원한다.

인터페이스&추상클래스 사용처

추상 클래스를 사용하는 경우 

 

  • 구현이 필요한 클래스들에서 공통으로 가지는 메서드와 필드가 많아 중복 멤버 통합이 필요할 때
  • 멤버에 public 이외의 접근자 (protected, private) 선언이 필요한 경우
  • 요구 사항과 함께 구현 세부 정보의 일부만 지정할 때
  • 하위 클래스가 오버라이드하여 재정의할 기능을 공유하기 위한 상속 개념을 사용할 때
  • 공통점을 추상화하여 상속 계층을 구성해야 할 때

인터페이스를 사용하는 경우 

 

  • 애플리케이션의 기능을 정의해야 하지만 구현 방식이나 대상에 대해 추상화할 때
  • 다중 상속(구현)을 통한 추상화 설계를 해야 할 때
  • 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경 쓰지 않을 때
  • 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용

추상 클래스와 인터페이스 중 어떤 것을 사용하면 좋을까?

구현의 일부를 공유 해야하는 상황이라면 추상 클래스, 행동만 정의하고 구현은 독립적이어야 한다면 인터페이스를 사용하는 것이좋다고 생각한다.경우에 따라서는 추상 클래스와 인터페이스 중 하나를 선택하기보다, 두 가지를 결합하여 사용하는 것이 더 효과적일 수도 있다.