>  기사  >  Java  >  Java의 인터페이스 및 추상 클래스

Java의 인터페이스 및 추상 클래스

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 02:26:28823검색

인터페이스와 추상 클래스는 추상화와 다형성을 달성하는 데 필수적인 구성 요소입니다.

인터페이스란 무엇입니까?

Java의 인터페이스는 추상 메소드, 정적 메소드, 기본 메소드 및 정적 최종 변수(상수)만 포함할 수 있는 클래스와 유사한 참조 유형입니다. 인터페이스는 Java에서 추상화 및 다중 상속을 달성하는 데 사용됩니다. 인터페이스는 직접 인스턴스화되지 않을 수 있습니다.

Interfaces and Abstract Classes in Java

?Java 8 이전에는 인터페이스에 추상 메소드만 있을 수 있었습니다.
이러한 메서드의 구현은 별도의 클래스에서 제공되어야 합니다. 따라서 인터페이스에 새로운 메소드를 추가하려면 동일한 인터페이스를 구현하는 클래스에 해당 구현 코드를 제공해야 합니다.

?이 문제를 극복하기 위해 Java 8에서는 인터페이스를 구현하는 클래스에 영향을 주지 않고 인터페이스가 구현된 메서드를 가질 수 있도록 하는 기본 메서드 개념을 도입했습니다. .

필요한 경우 클래스를 구현하여 기본 메소드를 재정의할 수 있습니다.

인터페이스의 주요 특징

  • 추상 메소드: 본문이 없고 추상 키워드를 사용하여 선언된 메소드
  • 기본 메소드: Java 8에 도입된 본문이 있는 메소드로 인터페이스가 기본 구현을 제공할 수 있습니다.
  • 정적 메서드: 인터페이스 인스턴스가 아닌 인터페이스 자체에 속하는 메서드
  • 상수: static 및 final로 선언된 변수이며 암시적으로 공개됩니다.

추상 클래스란 무엇입니까?

Java의 추상 클래스는 자체적으로 인스턴스화할 수 없는 클래스이며 추상 메서드(본문이 없는 메서드)와 구체적인 메서드(본문이 있는 메서드)를 포함할 수 있습니다. 추상 클래스는 서브클래스에 대한 공통 기반을 제공하여 코드 재사용 및 공유 동작 정의를 허용하는 데 사용됩니다.

추상 클래스의 주요 특징

  • 추상 메소드: 본문이 없고 추상 키워드를 사용하여 선언된 메소드
  • 구체적인 메소드: 본문이 있는 메소드로 기본 구현을 제공합니다.
  • 생성자: 추상 클래스는 생성자를 가질 수 있지만 직접 인스턴스화할 수는 없습니다.
  • 인스턴스 변수: 추상 클래스는 인스턴스 변수와 정적 변수를 가질 수 있습니다.

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

다중 상속

  • 인터페이스: 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();
    }
}

설명

  1. 인터페이스:

    • Flyable 인터페이스는 fly() 메서드를 정의합니다.
    • 수영 가능 인터페이스는 swim() 메서드를 정의합니다.
  2. 수업:

    • Duck 클래스는 Flyable 및 Swimmable 인터페이스를 모두 구현합니다.
    • Duck 클래스는 fly() 및 swim() 메소드 모두에 대한 구현을 제공합니다.
  3. 주요 방법:

    • Duck 인스턴스가 생성됩니다.
    • fly() 및 swim() 메서드는 Duck 인스턴스에서 호출되어 Duck 클래스가 두 인터페이스 모두에서 동작을 상속받았음을 보여줍니다.

산출

Duck is flying
Duck is swimming

다음은 관계를 설명하는 간단한 다이어그램입니다.

+----------------+
|    Flyable     |<--------------->Interface
|----------------|
| + fly()        |
+----------------+
          ^
          |
          | Implements
          |
+----------------+
|     Duck       |<--------------->Class
|----------------|
| + fly()        |
| + swim()       |
+----------------+
          ^
          |
          | Implements
          |
+----------------+
|   Swimmable    |<--------------->Interface
|----------------|
| + swim()       |
+----------------+

이 예에서 Duck 클래스는 Flyable 및 Swimmable 인터페이스를 모두 구현하여 다중 상속을 보여줍니다. 이를 통해 Duck 클래스는 두 인터페이스에 정의된 메소드에 대한 구현을 상속하고 제공할 수 있으며, 이는 Java가 인터페이스를 통해 다중 상속을 달성하는 방법을 보여줍니다.


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();
    }
}

설명

  1. 추상 클래스: 동물

    • Animal 클래스는 추상 클래스로 선언되어 직접 인스턴스화할 수 없습니다.
    • 모든 하위 클래스에서 구현해야 하는 추상 메서드 makeSound()가 포함되어 있습니다.
    • 기본 구현을 제공하는 구체적인 메소드 sleep()도 포함되어 있습니다.
  2. 하위 클래스: 개

    • Dog 클래스는 Animal 클래스를 확장합니다.
    • 추상 메소드 makeSound()에 대한 구현을 제공합니다.
    • 기본 메소드는 Dog 인스턴스를 생성하고 makeSound() 및 sleep() 메소드를 호출합니다.
  3. 하위 클래스: 고양이

    • Cat 클래스는 Animal 클래스를 확장합니다.
    • 추상 메소드 makeSound()에 대한 구현을 제공합니다.
    • 기본 메소드는 Cat 인스턴스를 생성하고 makeSound() 및 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() 메서드의 자체 구현을 제공합니다.

인터페이스에 대한 핵심 사항

  1. 추상화: Java의 인터페이스는 추상화를 달성하기 위한 메커니즘입니다.
  2. 기본 메소드: 기본적으로 인터페이스 메소드는 추상적이고 공개적입니다.
  3. 메서드 유형: 인터페이스 메소드는 public, private, abstract, default, static 및 strictfp만 가능합니다.
  4. 필드 유형: 인터페이스 필드(변수)는 공개, 정적 또는 최종일 수 있습니다.
  5. IS-A 관계: Java 인터페이스도 IS-A 관계를 나타냅니다.
  6. 인스턴스화: 추상 클래스처럼 직접 인스턴스화할 수 없습니다.
  7. 느슨한 커플링: 느슨한 커플링을 달성하는 데 사용할 수 있습니다.
  8. 암시적으로 추상: 모든 인터페이스는 암시적으로 추상입니다.
  9. 기본 메소드: 기본 메소드는 인터페이스에서만 허용됩니다.
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 8 이전) 추상 클래스는 추상 메소드와 구상 메소드를 모두 가질 수 있습니다.
  • 사용법: 인터페이스는 API와 프레임워크를 정의하는 데 사용되는 반면 추상 클래스는 골격 구현을 제공하는 데 사용됩니다.

더 자세히 살펴보세요

자신의 Java 프로젝트에서 인터페이스와 추상 클래스의 강력한 기능을 살펴보세요. 인터페이스를 사용하여 계약을 정의하고 추상 클래스를 사용하여 공유 기능을 제공하는 방법을 실험해 보세요. 여러분의 통찰력과 경험을 Java 커뮤니티와 공유하여 집단지식과 성장에 기여하세요.

이 게시물에 대한 모든 수정이나 추가를 환영합니다.

public interface Flyable {
    void fly();
}

위 내용은 Java의 인터페이스 및 추상 클래스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.