1. 인터페이스 소개

오늘은 지식의 날입니다. 또 다른 새롭고 흥미로운 주제는 인터페이스입니다.

인터페이스 의 개념은 추상화 및 다형성 원칙의 자식입니다. 인터페이스는 모든 메서드가 추상인 추상 클래스와 매우 유사합니다. 클래스와 같은 방식으로 선언되지만 키워드를 사용합니다 interface.

interface Feline
{
   void purr();
   void meow();
   void growl();
}

다음은 인터페이스에 대한 몇 가지 유용한 사실입니다.

1. 인터페이스 선언

interface Drawable
{
   void draw();
}

interface HasValue
{
   int getValue();
}
  1. class키워드 대신 interface.
  2. 추상 메소드만 포함합니다(키워드를 작성하지 마십시오 abstract).
  3. 실제로 인터페이스에는 모든public 메서드가 있습니다.
2. 인터페이스 상속

인터페이스는 인터페이스만 상속할 수 있습니다. 그러나 인터페이스는 많은 부모를 가질 수 있습니다. 이것을 말하는 또 다른 방법은 Java가 인터페이스의 다중 상속을 가지고 있다고 말하는 것입니다. 예:

interface Piece extends Drawable, HasValue
{
   int getX();
   int getY();
}

3. 인터페이스에서 클래스 상속

클래스는 여러 인터페이스를 상속할 수 있습니다(하나의 클래스에서만). 이것은 implements키워드를 사용하여 수행됩니다. 예:

abstract class ChessItem implements Drawable, HasValue
{
   private int x, y, value;
   public int getValue()
   {
      return value;
   }

   public int getX()
   {
      return x;
   }

   public  int getY()
   {
      return y;
   }
}

ChessItem 클래스는 추상으로 선언됩니다. 를 제외한 모든 상속된 메서드를 구현합니다 draw. 즉, ChessItem클래스에는 하나의 추상 메서드인 draw().

extends및 키워드 의 기술적 의미는 implements동일합니다. 둘 다 상속입니다. 코드의 가독성을 높이기 위해 구분했습니다. extends우리는 또한 클래스가 상속되고( 통해 ) 인터페이스가 구현된다고 말합니다 ( 통해 implements).

4. 변수

여기에 가장 중요한 것이 있습니다. 일반 변수는 인터페이스에서 선언할 수 없습니다 (정적 변수는 가능하지만).

하지만 인터페이스가 필요한 이유는 무엇입니까? 그들은 언제 사용됩니까? 인터페이스는 클래스에 비해 두 가지 강력한 이점이 있습니다.



2. 구현에서 "메서드 설명"을 분리합니다.

이전에 클래스의 메서드가 다른 클래스에서 호출되도록 허용하려면 메서드에 키워드를 표시해야 한다고public 말했습니다 . 이러한 메서드 중 일부를 클래스 내에서만 호출하려면 키워드로 표시해야 합니다 private. 즉, 우리는 클래스의 메서드를 "누구나 사용할 수 있는"과 "우리 자신만 사용할 수 있는" 두 가지 범주로 나눕니다.

인터페이스는 이 구분을 더욱 강화하는 데 도움이 됩니다. 우리는 특별한 "모두가 사용할 수 있는 클래스"와 첫 번째 클래스를 상속할 "우리 자신만 사용할 수 있는" 두 번째 클래스를 만들 것입니다. 대략적인 모습은 다음과 같습니다.

전에 후에
class Student
{
   private String name;
   public Student(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return this.name;
   }

   private void setName(String name)
   {
      this.name = name;
   }
interface Student
{
   public String getName();
}

class StudentImpl implements Student
{
   private String name;
   public StudentImpl(String name)
   {
      this.name = name;
   }

   public String getName()
   {
      return this.name;
   }

   private void setName(String name)
   {
      this.name = name;
   }
}
public static void main(String[] args)
{
   Student student = new Student("Alibaba");
   System.out.println(student.getName());
}
public static void main(String[] args)
{
   Student student = new StudentImpl("Ali")
   System.out.println(student.getName());
}

클래스를 인터페이스 와 인터페이스 상속하는 클래스 두 가지로 나눕니다 . 그리고 여기서 장점은 무엇입니까?

많은 다른 클래스가 동일한 인터페이스를 구현(상속)할 수 있습니다. 그리고 각각은 고유한 동작을 가질 수 있습니다. 예를 들어 인터페이스 ArrayList LinkedList의 두 가지 다른 구현이 있습니다 List.

따라서 다양한 구현뿐만 아니라 구현 클래스 자체도 숨깁니다(코드에서 인터페이스만 필요하므로). 이를 통해 우리는 매우 유연해질 수 있습니다. 프로그램이 실행되는 즉시 한 개체를 다른 개체로 교체하여 개체를 사용하는 모든 클래스에 영향을 주지 않고 개체의 동작을 변경할 수 있습니다.

이것은 다형성과 결합될 때 매우 강력한 기술입니다. 지금은 왜 이렇게 해야 하는지 명확하지 않습니다. 인터페이스가 없는 것보다 삶을 훨씬 더 쉽게 만들 수 있다는 것을 이해하려면 먼저 수십 또는 수백 개의 클래스가 있는 프로그램을 접해야 합니다.


3. 다중 상속

Java에서 모든 클래스는 하나의 상위 클래스만 가질 수 있습니다. 다른 프로그래밍 언어에서 클래스는 종종 여러 부모 클래스를 가질 수 있습니다. 이것은 매우 편리하지만 많은 문제를 야기하기도 합니다.

Java 제작자는 타협에 도달했습니다. 클래스의 다중 상속은 금지했지만 인터페이스의 다중 상속은 허용했습니다. 인터페이스는 여러 상위 인터페이스를 가질 수 있습니다. 클래스는 여러 부모 인터페이스를 가질 수 있지만 부모 클래스는 하나만 가질 수 있습니다.

클래스의 다중 상속을 금지하고 인터페이스의 다중 상속을 허용한 이유는 무엇입니까? 소위 다이아몬드 상속 문제로 인해:

다중 상속

B 클래스가 A 클래스를 물려받을 때 C 클래스와 D 클래스에 대해 아무것도 모릅니다. 따라서 적합하다고 판단되는 A 클래스의 변수를 사용합니다. C 클래스도 마찬가지입니다. A 클래스의 변수를 사용하지만 방식이 다릅니다. 그리고 이 모든 것이 D계급에서 갈등을 낳는다.

다음의 간단한 예를 살펴보겠습니다. 3개의 클래스가 있다고 가정해 보겠습니다.

class Data
{
   protected int value;
}
class XCoordinate extends Data
{
   public void setX (int x) { value = x;}
   public int getX () { return value;}
}
class YCoordinate extends Data
{
   public void setY (int y) { value = y;}
   public int getY () { return value; }
}

데이터 클래스는 value변수를 저장합니다. XCoordinate 자손 클래스는 해당 변수를 사용하여 값을 저장 x하고 YCoordinate자손 클래스는 이를 사용하여 y값을 저장합니다.

그리고 그것은 작동합니다. 갈라져. 그러나 XYCoordinates 클래스가 XCoordinateYCoordinate클래스를 모두 상속하게 하려면 코드가 손상됩니다. 이 클래스는 조상 클래스의 메서드를 가지지만 동일한 value variable.

그러나 인터페이스는 변수를 가질 수 없기 때문에 이러한 종류의 충돌이 있을 수 없습니다. 따라서 인터페이스의 다중 상속이 허용됩니다.