Java에서 인터페이스와 추상 클래스의 차이점
- 추상 클래스와 인터페이스의 유사점
- 추상 클래스와 인터페이스의 차이점
- 추상 클래스와 인터페이스는 언제 사용합니까?
- Java의 추상 클래스
- 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는 항상 완전한 추상화를 제공한다는 것입니다. 이 자습서에서는 둘 사이의 몇 가지 주요 차이점에 대해 논의했습니다.