웹사이트 검색

Java에서 추상 클래스와 인터페이스의 차이점


추상 클래스와 인터페이스의 차이점은 인기있는 인터뷰 질문 중 하나입니다. 추상 클래스 및 인터페이스는 Java 프로그래밍 언어의 핵심 부분입니다. 인터페이스를 선택할지 추상 클래스를 선택할지는 모든 설계자가 직면하는 디자인 결정입니다. 지난 기사에서 나는 추상 클래스에 대해 가능한 한 많은 세부 정보를 제공했습니다. 이 게시물에서는 추상 클래스와 인터페이스의 차이점과 추상 클래스보다 인터페이스를 사용해야 하는 경우와 그 반대의 경우에 대해 알아봅니다.

추상 클래스와 인터페이스의 차이점

  1. abstract 키워드는 추상 클래스를 생성하는 데 사용되며 메소드와 함께 사용할 수도 있지만 interface 키워드는 인터페이스를 생성하는 데 사용되며 사용할 수 없습니다. 방법.
  2. 하위 클래스는 extends 키워드를 사용하여 추상 클래스를 확장하며 하위 클래스가 추상 클래스이기도 한 반면 하위 클래스는 구현 을 사용하지 않는 한 추상 클래스에서 선언된 모든 메소드의 구현을 제공해야 합니다. 키워드는 인터페이스를 구현하고 인터페이스에 선언된 모든 메서드에 대한 구현을 제공해야 합니다.
  3. 추상 클래스는 구현이 있는 메서드를 가질 수 있지만 인터페이스는 절대 추상화를 제공하고 메서드 구현을 가질 수 없습니다. Java 8부터는 메서드 구현을 포함하는 인터페이스에서 기본 및 정적 메서드를 만들 수 있습니다.
  4. 추상 클래스는 생성자를 가질 수 있지만 인터페이스는 생성자를 가질 수 없습니다.
  5. 추상 클래스는 인스턴스화할 수 없다는 점을 제외하면 일반 자바 클래스의 모든 기능을 가지고 있습니다. abstract 키워드를 사용하여 클래스를 추상화할 수 있지만 인터페이스는 완전히 다른 유형이며 공개 정적 최종 상수 및 메소드 선언만 가질 수 있습니다.
  6. 추상 클래스 메서드는 액세스 수정자를 public, private, protected, static으로 가질 수 있지만 인터페이스 메서드는 암묵적으로 공개적이고 추상적이므로 인터페이스 메서드와 함께 다른 액세스 수정자를 사용할 수 없습니다.
  7. 하위 클래스는 하나의 추상 클래스만 확장할 수 있지만 여러 인터페이스를 구현할 수 있습니다.
  8. 추상 클래스는 다른 클래스를 확장하고 인터페이스를 구현할 수 있지만 인터페이스는 다른 인터페이스만 확장할 수 있습니다.
  9. main() 메서드가 있는 추상 클래스를 실행할 수 있지만 기본 메서드 구현을 가질 수 없기 때문에 인터페이스를 실행할 수 없습니다.
  10. 인터페이스는 하위 클래스에 대한 계약을 정의하는 데 사용되는 반면 추상 클래스는 계약도 정의하지만 사용할 하위 클래스에 대한 다른 메서드 구현을 제공할 수 있습니다.

이것이 인터페이스와 추상 클래스 간의 차이점에 대한 전부입니다. 이제 우리는 언제 추상 클래스보다 인터페이스를 사용해야 하는지 또는 그 반대로 사용해야 하는지 알 수 있습니다.

인터페이스 또는 추상 클래스

하위 클래스에 대한 계약을 제공하기 위해 인터페이스 또는 추상 클래스 중에서 선택할지 여부는 설계 결정이며 많은 요인에 따라 달라집니다. 언제 인터페이스가 최선의 선택이고 언제 추상 클래스를 사용할 수 있는지 봅시다.

  1. Java는 다중 클래스 수준 상속을 지원하지 않으므로 모든 클래스는 하나의 수퍼클래스만 확장할 수 있습니다. 그러나 클래스는 여러 인터페이스를 구현할 수 있습니다. 따라서 대부분의 경우 인터페이스는 클래스 계층 구조 및 계약의 기반을 제공하는 데 적합합니다. 또한 인터페이스 측면에서 코딩하는 것은 자바 코딩의 모범 사례 중 하나입니다.
  2. 계약에 많은 메서드가 있는 경우 모든 하위 클래스에 공통적인 일부 메서드에 대한 기본 구현을 제공할 수 있으므로 추상 클래스가 더 유용합니다. 또한 하위 클래스가 특정 메서드를 구현할 필요가 없다면 구현을 제공하지 않아도 되지만 인터페이스의 경우 하위 클래스는 아무 소용이 없고 구현이 빈 블록일지라도 모든 메서드에 대한 구현을 제공해야 합니다.
  3. 기본 계약이 계속 변경되면 모든 구현 클래스를 변경하지 않고는 인터페이스에 대한 추가 메서드를 선언할 수 없기 때문에 인터페이스가 문제를 일으킬 수 있습니다. 추상 클래스를 사용하면 기본 구현을 제공하고 구현 클래스만 변경할 수 있습니다. 실제로 새로운 방법을 사용할 것입니다.

추상 클래스와 인터페이스를 모두 사용

인터페이스와 추상 클래스를 함께 사용하는 것이 시스템을 설계하는 가장 좋은 방법입니다. 예를 들어 JDK에서 java.util.List는 많은 메소드를 포함하는 인터페이스이므로 골격 구현을 제공하는 추상 클래스 java.util.AbstractList가 있습니다. 모든 하위 클래스가 이 클래스를 확장하고 필요한 메서드만 구현할 수 있도록 List 인터페이스의 모든 메서드에 대해. 우리는 항상 인터페이스를 기반으로 시작하여 모든 하위 클래스가 구현해야 하는 메서드를 정의한 다음 특정 하위 클래스만 구현해야 하는 일부 메서드가 있는 경우 기본 인터페이스를 확장하여 해당 메서드로 새 인터페이스를 만들 수 있습니다. 하위 클래스에는 요구 사항에 따라 구현하기 위해 기본 인터페이스 또는 자식 인터페이스 중에서 선택할 수 있는 옵션이 있습니다. 메서드의 수가 많이 늘어나면 자식 인터페이스를 구현하는 뼈대 추상 클래스를 제공하고 하위 클래스가 인터페이스와 추상 클래스 중에서 선택할 수 있는 유연성을 제공하는 것도 나쁘지 않습니다.

자바 8 인터페이스 변경

Java 8부터는 인터페이스에서 메소드 구현을 가질 수 있습니다. 인터페이스에서 기본 메서드와 정적 메서드를 만들고 구현을 제공할 수 있습니다. 이것은 추상 클래스와 인터페이스 사이의 간격을 메웠고 이제 인터페이스는 새 메서드에 대한 기본 구현을 제공하여 인터페이스를 더 확장할 수 있기 때문에 갈 길입니다. 자세한 내용은 Java 8 인터페이스 기본 정적 메서드를 확인하세요.