인터페이스와 추상 클래스는 추상화와 다형성을 달성하는 데 필수적인 구성 요소입니다.
Java의 인터페이스는 추상 메소드, 정적 메소드, 기본 메소드 및 정적 최종 변수(상수)만 포함할 수 있는 클래스와 유사한 참조 유형입니다. 인터페이스는 Java에서 추상화 및 다중 상속을 달성하는 데 사용됩니다. 인터페이스는 직접 인스턴스화되지 않을 수 있습니다.
?Java 8 이전에는 인터페이스에 추상 메소드만 있을 수 있었습니다.
이러한 메서드의 구현은 별도의 클래스에서 제공되어야 합니다. 따라서 인터페이스에 새로운 메소드를 추가하려면 동일한 인터페이스를 구현하는 클래스에 해당 구현 코드를 제공해야 합니다.
?이 문제를 극복하기 위해 Java 8에서는 인터페이스를 구현하는 클래스에 영향을 주지 않고 인터페이스가 구현된 메서드를 가질 수 있도록 하는 기본 메서드 개념을 도입했습니다. .
필요한 경우 클래스를 구현하여 기본 메소드를 재정의할 수 있습니다.
Java의 추상 클래스는 자체적으로 인스턴스화할 수 없는 클래스이며 추상 메서드(본문이 없는 메서드)와 구체적인 메서드(본문이 있는 메서드)를 포함할 수 있습니다. 추상 클래스는 서브클래스에 대한 공통 기반을 제공하여 코드 재사용 및 공유 동작 정의를 허용하는 데 사용됩니다.
Java는 단일 상속만 지원합니다. 즉, 각 클래스는 한 클래스의 필드와 메서드만 상속할 수 있습니다. 둘 이상의 소스에서 속성을 상속해야 하는 경우 Java는 다중 상속의 한 형태인 인터페이스 개념을 제공합니다.
?인터페이스는 클래스와 유사합니다. 그러나 메소드의 시그니처만 정의하고 구현은 정의하지 않습니다. 인터페이스에 선언된 메서드는 클래스에서 구현됩니다. 다중 상속은 클래스가 여러 인터페이스를 구현할 때 발생합니다.
Java에서는 클래스가 아닌 인터페이스를 통해 다중 상속이 이루어집니다. 이를 통해 클래스는 각 인터페이스의 메서드 시그니처를 상속하여 여러 인터페이스를 구현할 수 있습니다. 아래는 인터페이스를 이용한 다중 상속을 보여주는 예시입니다.
Flyable과 Swimmable이라는 두 개의 인터페이스와 두 인터페이스를 모두 구현하는 Duck 클래스를 정의해 보겠습니다.
public interface Flyable { void fly(); }
public interface Swimmable { void swim(); }
public class Duck implements Flyable, Swimmable { @Override public void fly() { System.out.println("Duck is flying"); } @Override public void swim() { System.out.println("Duck is swimming"); } public static void main(String[] args) { Duck duck = new Duck(); duck.fly(); duck.swim(); } }
인터페이스:
수업:
주요 방법:
Duck is flying Duck is swimming
다음은 관계를 설명하는 간단한 다이어그램입니다.
+----------------+ | Flyable |<--------------->Interface |----------------| | + fly() | +----------------+ ^ | | Implements | +----------------+ | Duck |<--------------->Class |----------------| | + fly() | | + swim() | +----------------+ ^ | | Implements | +----------------+ | Swimmable |<--------------->Interface |----------------| | + swim() | +----------------+
이 예에서 Duck 클래스는 Flyable 및 Swimmable 인터페이스를 모두 구현하여 다중 상속을 보여줍니다. 이를 통해 Duck 클래스는 두 인터페이스에 정의된 메소드에 대한 구현을 상속하고 제공할 수 있으며, 이는 Java가 인터페이스를 통해 다중 상속을 달성하는 방법을 보여줍니다.
Java의 추상 클래스는 관련 클래스 제품군에 대한 공통 기반을 제공하는 데 사용됩니다. 여기에는 추상 메서드(본문이 없는 메서드)와 구체적인 메서드(본문이 있는 메서드)가 모두 포함될 수 있습니다. 다음은 추상 클래스의 사용을 보여주는 예입니다.
추상 클래스 Animal과 Animal 클래스를 확장하는 두 개의 하위 클래스 Dog 및 Cat을 정의해 보겠습니다.
public abstract class Animal { // Abstract method (does not have a body) public abstract void makeSound(); // Concrete method (has a body) public void sleep() { System.out.println("The animal is sleeping"); } }
public class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog says: Woof!"); } public static void main(String[] args) { Dog dog = new Dog(); dog.makeSound(); dog.sleep(); } }
public class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat says: Meow!"); } public static void main(String[] args) { Cat cat = new Cat(); cat.makeSound(); cat.sleep(); } }
추상 클래스: 동물
하위 클래스: 개
하위 클래스: 고양이
개 수업의 경우:
public interface Flyable { void fly(); }
고양이 수업의 경우:
public interface Swimmable { void swim(); }
다음은 관계를 설명하는 간단한 다이어그램입니다.
public class Duck implements Flyable, Swimmable { @Override public void fly() { System.out.println("Duck is flying"); } @Override public void swim() { System.out.println("Duck is swimming"); } public static void main(String[] args) { Duck duck = new Duck(); duck.fly(); duck.swim(); } }
이 예에서 Animal 추상 클래스는 Dog 및 Cat 하위 클래스에 대한 공통 기반을 제공합니다. Animal 클래스는 모든 하위 클래스에서 구현해야 하는 추상 메서드 makeSound()와 기본 구현을 제공하는 구체적인 메서드 sleep()을 정의합니다. Dog 및 Cat 클래스는 Animal 클래스를 확장하고 makeSound() 메서드의 자체 구현을 제공합니다.
Duck is flying Duck is swimming
인터페이스는 일반적으로 API, 프레임워크 및 라이브러리를 정의하는 데 사용됩니다. 예를 들어, java.util.List 인터페이스는 ArrayList 및 LinkedList와 같은 목록 구현에 대한 계약을 제공합니다.
+----------------+ | Flyable |<--------------->Interface |----------------| | + fly() | +----------------+ ^ | | Implements | +----------------+ | Duck |<--------------->Class |----------------| | + fly() | | + swim() | +----------------+ ^ | | Implements | +----------------+ | Swimmable |<--------------->Interface |----------------| | + swim() | +----------------+
추상 클래스는 관련 클래스 계열에 대한 기본 클래스를 제공하는 데 자주 사용됩니다. 예를 들어, java.util.AbstractList 클래스는 List 인터페이스의 기본 구현을 제공하여 하위 클래스가 구현해야 하는 코드의 양을 줄입니다.
public interface Flyable { void fly(); }
SNo | Interface | Abstract Class |
---|---|---|
1 | Interfaces cannot be instantiated | Abstract classes cannot be instantiated |
2 | It can have both abstract and non-abstract methods | It can have both abstract and non-abstract methods |
3 | In interfaces, all fields are automatically public, static, and final, and all methods that you declare or define (as default methods) are public | In abstract classes, you can declare fields that are not static and final, and define public, protected, and private concrete methods |
4 | Interface supports multiple inheritance. Multiple interfaces can be implemented | Abstract class or class can extend only one class |
5 | It is used if you expect that unrelated classes would implement your interface. Eg, the interfaces Comparable and Cloneable are implemented by many unrelated classes | It is used if you want to share code among several closely related classes |
6 | It is used if you want to specify the behavior of a particular data type, but not concerned about who implements its behavior. | It is used if you expect that classes that extend your abstract class have many common methods or fields, or require access modifiers other than public (such as protected and private) |
참조: https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
추상 클래스가 하위 클래스로 분류되면 하위 클래스는 일반적으로 상위 클래스의 모든 추상 메서드에 대한 구현을 제공합니다. 그러나 그렇지 않은 경우 하위 클래스도 abstract로 선언해야 합니다.
"Effective Java"의 저자인 Joshua Bloch에 따르면 인터페이스는 더 유연하고 다중 상속을 지원하기 때문에 유형 정의에 추상 클래스보다 선호됩니다. 그러나 추상 클래스는 공유 기능을 제공하고 코드 중복을 줄이는 데 유용합니다.
"인터페이스는 믹스인을 정의하는 데 이상적입니다. 이와 대조적으로 클래스는 고유한 속성을 갖는 객체를 정의하는 데 이상적입니다."
- 조슈아 블로흐
자신의 Java 프로젝트에서 인터페이스와 추상 클래스의 강력한 기능을 살펴보세요. 인터페이스를 사용하여 계약을 정의하고 추상 클래스를 사용하여 공유 기능을 제공하는 방법을 실험해 보세요. 여러분의 통찰력과 경험을 Java 커뮤니티와 공유하여 집단지식과 성장에 기여하세요.
이 게시물에 대한 모든 수정이나 추가를 환영합니다.
public interface Flyable { void fly(); }
위 내용은 Java의 인터페이스 및 추상 클래스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!