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

Mohammad Irfan 2023년10월12일
  1. 추상 클래스와 인터페이스의 유사점
  2. 추상 클래스와 인터페이스의 차이점
  3. 추상 클래스와 인터페이스는 언제 사용합니까?
  4. Java의 추상 클래스
  5. Java의 인터페이스
  6. 인터페이스를 구현하는 추상 클래스
  7. 요약
Java에서 인터페이스와 추상 클래스의 차이점

이 자습서에서는 Java의 Interface와 Abstract 클래스의 차이점을 소개하고 주제를 이해하기 위한 몇 가지 예제 코드도 나열합니다.

추상화는 구현을 숨기고 사용자에게 필수적인 세부 정보만 제공하는 프로세스입니다. Java의 추상화는 추상 클래스와 인터페이스를 통해 이루어집니다. 추상 클래스와 인터페이스에는 몇 가지 공통점이 있지만 둘 사이에는 큰 차이점이 있습니다. 먼저 둘 사이에 유사한 몇 가지 사항을 살펴보겠습니다.

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

  • 위에서 설명한 것처럼 추상 클래스와 인터페이스는 모두 추상화에 사용됩니다.
  • 추상 클래스 및 인터페이스는 인스턴스화할 수 없습니다. 즉, 해당 객체를 생성할 수 없습니다.
  • 서브클래스는 추상 클래스 또는 인터페이스에 정의된 추상 메서드를 재정의해야 합니다.

위의 요점은 둘 사이의 유사점을 거의 요약합니다. 이제 그들 사이의 몇 가지 주요 차이점을 살펴보겠습니다.

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

추상 클래스 상호 작용
Java에서 abstract 키워드는 abstract 클래스를 생성하거나 선언하는 데 사용됩니다. Java에서 interface 키워드는 새 인터페이스를 생성하거나 선언하는 데 사용됩니다.
클래스는 extends 키워드를 사용하여 추상 클래스의 속성과 메서드를 상속할 수 있습니다. Java에서 인터페이스를 구현하려면 implements 키워드를 사용할 수 있습니다.
추상 클래스에는 추상 또는 비추상 메서드가 정의되어 있을 수 있습니다. 추상 메서드는 구현이 제공되지 않은 메서드입니다. 인터페이스에는 추상 메서드만 있을 수 있습니다. 메서드 정의만 제공할 수 있지만 구현은 제공할 수 없습니다. Java 8 이후에는 Interfaces에서 기본 및 정적 메서드도 사용할 수 있습니다.
추상 클래스에는 최종 또는 최종이 아닌 변수(클래스 속성)가 포함될 수 있습니다. 또한 정적 또는 비정적 속성을 포함할 수 있습니다. 인터페이스는 정적 및 최종 멤버만 포함할 수 있으며 다른 유형의 멤버는 허용되지 않습니다.
추상 클래스는 인터페이스를 구현하고 인터페이스의 메서드를 구현할 수 있습니다. 인터페이스는 다른 클래스를 확장할 수 없으며 추상 클래스 메서드를 재정의하거나 구현할 수 없습니다.
추상 클래스는 다른 클래스를 확장할 수 있으며 인터페이스를 구현할 수도 있습니다. 이전 지점에서 논의한 것처럼 인터페이스는 다른 클래스를 확장할 수 없습니다. 그러나 인터페이스 구현에는 제한이 없습니다.
Java는 클래스를 통한 다중 상속을 지원하지 않습니다. 추상 클래스는 다른 클래스와 마찬가지로 다중 상속을 지원하지 않습니다. Java의 다중 상속 지원은 인터페이스를 통해 제공됩니다. 인터페이스가 완전한 추상화를 제공하기 때문입니다.
추상 클래스 멤버 또는 속성은 비공개, 보호 또는 공개가 될 수 있습니다. 인터페이스의 속성 또는 멤버는 항상 공개됩니다.

추상 클래스와 인터페이스는 언제 사용합니까?

추상 클래스는 부분 또는 전체 추상화를 제공할 수 있습니다. 반면에 인터페이스는 항상 완전한 추상화를 제공합니다. 몇 가지 공통 기능이 있는 몇 가지 클래스에 대해 추상 부모 클래스를 만들 수 있습니다. 더 많은 행동의 자유를 원한다면 추상 클래스도 선호됩니다.

인터페이스는 기본 구조를 정의할 때 선호됩니다. 그러면 프로그래머는 이 구조로 무엇이든 만들 수 있습니다. 인터페이스는 다중 상속도 지원합니다. 따라서 단일 클래스가 여러 인터페이스를 구현할 수 있습니다.

전반적으로 이것은 선택의 문제이며 수행해야 할 작업입니다. Abstract 클래스와 Interface는 모두 다른 목적에 적합하며 그에 따라 사용해야 합니다.

Java의 추상 클래스

Abstract 클래스를 만들고 추상 클래스와 그 기능을 이해하도록 확장하는 자식 클래스를 만들어 보겠습니다.

abstract class Bell {
  protected String sound;

  Bell() {
    this.sound = "ting";
  }
  // Abstract Method
  abstract public void ring();

  // Non-Abstract Methods
  public void increaseVolume() {
    System.out.println("Increasing Volume");
  }

  public void decreaseVolume() {
    System.out.println("Decreasing Volume");
  }
}
class SchoolBell extends Bell {
  @Override
  public void ring() {
    System.out.println("Ringing the School bell: " + sound);
  }
}
class ChruchBell extends Bell {
  @Override
  public void ring() {
    System.out.println("Ringing the Chruch Bell: " + sound);
  }
}
public class AbstractClassDemo {
  public static void main(String[] args) {
    SchoolBell sb = new SchoolBell();
    ChruchBell cb = new ChruchBell();

    // Using the overridden methods
    sb.ring();
    cb.ring();

    // Using the non-abstract methods of Bell class
    sb.increaseVolume();
    cb.decreaseVolume();
  }
}

출력:

Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume
Decreasing Volume

Java의 인터페이스

인터페이스를 사용하여 동일한 시나리오를 복제해 보겠습니다. 더 이상 인터페이스에서 비추상 메서드를 정의할 수 없습니다. 클래스가 increaseVolume()decreaseVolume() 메서드의 일반적인 구현을 원하지 않는 경우 인터페이스가 올바른 선택입니다.

interface Bell {
  String sound = "ting";
  // only abstract methods allowed in interface
  public void ring();
  public void increaseVolume();
  public void decreaseVolume();
}
class SchoolBell implements Bell {
  public void ring() {
    System.out.println("Ringing the School bell: " + sound);
  }
  @Override
  public void increaseVolume() {
    System.out.println("Increasing Volume of School Bell");
  }
  @Override
  public void decreaseVolume() {
    System.out.println("Decreasing Volume of School Bell");
  }
}
class ChruchBell implements Bell {
  public void ring() {
    System.out.println("Ringing the Chruch Bell: " + sound);
  }
  @Override
  public void increaseVolume() {
    System.out.println("Increasing Volume of Chruch Bell");
  }
  @Override
  public void decreaseVolume() {
    System.out.println("Decreasing Volume of Chruch Bell");
  }
}
public class InterfaceDemo {
  public static void main(String[] args) {
    SchoolBell sb = new SchoolBell();
    ChruchBell cb = new ChruchBell();

    // Using the overridden methods
    sb.ring();
    cb.ring();

    // Using the non-abstract methods of Bell class
    sb.increaseVolume();
    cb.decreaseVolume();
  }
}

출력:

Ringing the School bell: ting
Ringing the Chruch Bell: ting
Increasing Volume of School Bell
Decreasing Volume of Chruch Bell

인터페이스를 구현하는 추상 클래스

이전 섹션에서 논의했듯이 추상 클래스에서 인터페이스의 메서드를 구현할 수 있습니다. 다음 코드는 이를 보여줍니다.

interface Bell {
  String sound = "ting";
  // only abstract methods allowed in interface
  public void ring();
  public void increaseVolume();
  public void decreaseVolume();
}
abstract class AbstractBell implements Bell {
  public void increaseVolume() {
    System.out.println("Increasing Volume");
  }
  public void decreaseVolume() {
    System.out.println("Decreasing Volume");
  }
}

요약

추상화는 객체 지향 프로그래밍에서 사용되는 가장 기본적인 개념 중 하나입니다. 추상화는 구현을 숨기고 사용자에게 최소한의 필수 세부 정보만 제공하는 데 사용됩니다. Java에서 추상화는 추상 클래스 또는 인터페이스를 사용하여 수행됩니다. 이 둘의 주요 차이점은 Abstract 클래스는 부분 추상화도 제공할 수 있지만 Interface는 항상 완전한 추상화를 제공한다는 것입니다. 이 자습서에서는 둘 사이의 몇 가지 주요 차이점에 대해 논의했습니다.

관련 문장 - Java Interface