자바 인터페이스



Interface(영어: Interface)는 JAVA 프로그래밍 언어에서 추상 유형이며 추상 메소드의 모음입니다. 인터페이스는 일반적으로 인터페이스로 선언됩니다. 클래스는 인터페이스를 상속하여 인터페이스의 추상 메서드를 상속합니다.

인터페이스는 클래스가 아닙니다. 인터페이스를 작성하는 방법은 클래스와 매우 유사하지만 서로 다른 개념에 속합니다. 클래스는 객체의 속성과 메서드를 설명합니다. 인터페이스에는 클래스가 구현하는 메서드가 포함되어 있습니다.

인터페이스를 구현하는 클래스가 추상 클래스가 아닌 이상 클래스는 인터페이스의 모든 메서드를 정의해야 합니다.

인터페이스는 인스턴스화할 수 없지만 구현은 가능합니다. 인터페이스를 구현하는 클래스는 인터페이스에 설명된 모든 메서드를 구현해야 하며, 그렇지 않으면 추상 클래스로 선언해야 합니다. 또한 Java에서는 인터페이스 유형을 사용하여 변수를 선언할 수 있고, 널 ​​포인터이거나 이 인터페이스를 구현하는 객체에 바인딩될 수 있습니다.

인터페이스와 클래스 간의 유사점:

  •                 인터페이스에는 여러 메서드가 있을 수 있습니다.

  •               인터페이스 파일은 .java로 끝나는 파일로 저장되며, 파일명은 인터페이스 이름을 사용한다.

  •               인터페이스의 바이트코드 파일은 .class로 끝나는 파일에 저장됩니다.

  •               인터페이스에 해당하는 바이트코드 파일은 패키지 이름과 일치하는 디렉터리 구조에 있어야 합니다.

인터페이스와 클래스의 차이점:
  • 인터페이스를 사용하여 개체를 인스턴스화할 수 없습니다.

  •               인터페이스에는 생성자 메서드가 없습니다.

  •               인터페이스의 모든 메서드는 추상 메서드여야 합니다.

  •               인터페이스에는 정적 변수와 최종 변수를 제외한 멤버 변수가 포함될 수 없습니다.

  •               인터페이스는 클래스에 의해 상속되지 않고 클래스에 의해 구현됩니다.

  •               인터페이스는 다중 상속을 지원합니다.


인터페이스 선언

인터페이스 선언 구문은 다음과 같습니다.

[可见度] interface 接口名称 [extends 其他的类名] {
        // 声明变量
        // 抽象方法
}

Interface 키워드는 인터페이스를 선언하는 데 사용됩니다. 다음은 인터페이스 선언의 간단한 예입니다.

/* 文件名 : NameOfInterface.java */
import java.lang.*;
//引入包

public interface NameOfInterface
{
   //任何类型 final, static 字段
   //抽象方法
}


인터페이스에는 다음과 같은 기능이 있습니다.


  •                     인터페이스는 암시적으로 추상적입니다. 인터페이스를 선언할 때 abstract 키워드를 사용할 필요가 없습니다.

  •               인터페이스의 모든 메소드도 암시적으로 추상화되어 있으며 선언할 때 abstract 키워드가 필요하지 않습니다.

  •               인터페이스의 모든 메소드는 공개됩니다.

Instance

/* 文件名 : Animal.java */
interface Animal {

   public void eat();
   public void travel();
}

인터페이스 구현

클래스가 인터페이스를 구현할 때 클래스는 인터페이스의 모든 메서드를 구현해야 합니다. 그렇지 않으면 클래스를 abstract로 선언해야 합니다.

클래스는 Implements 키워드를 사용하여 인터페이스를 구현합니다. 클래스 선언에서 Implements 키워드는 클래스 선언 뒤에 배치됩니다.

인터페이스의 구문을 구현하려면 다음 공식을 사용할 수 있습니다.

... implements 接口名称[, 其他接口, 其他接口..., ...] ...

Example

/* 文件名 : MammalInt.java */
public class MammalInt implements Animal{

   public void eat(){
      System.out.println("Mammal eats");
   }

   public void travel(){
      System.out.println("Mammal travels");
   } 

   public int noOfLegs(){
      return 0;
   }

   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

위 예제의 컴파일 및 실행 결과는 다음과 같습니다.

Mammal eats
Mammal travels

인터페이스에 선언된 메서드를 다시 작성할 때 다음이 필요합니다. 다음 규칙에 주의하세요.

  • 클래스가 인터페이스 메서드를 구현하는 경우 필수 예외를 발생시킬 수 없습니다. 인터페이스나 인터페이스를 상속하는 추상 클래스에서만 필수 예외를 발생시킬 수 있습니다.

  •               클래스는 메서드를 재정의할 때 일관된 메서드 이름을 유지해야 하며 동일하거나 호환 가능한 반환 값 유형을 유지해야 합니다.

  •               인터페이스를 구현하는 클래스가 추상 클래스인 경우 인터페이스의 메서드를 구현할 필요가 없습니다.

인터페이스를 구현할 때 몇 가지 규칙에도 주의해야 합니다.

  •                 클래스는 동시에 여러 인터페이스를 구현할 수 있습니다.

  •               클래스는 하나의 클래스에서만 상속할 수 있지만 여러 인터페이스를 구현할 수 있습니다.

  •               인터페이스는 다른 인터페이스를 상속할 수 있으며 이는 클래스 간 상속과 유사합니다.


인터페이스 상속

인터페이스는 다른 인터페이스를 상속받을 수 있는데, 이는 클래스 간 상속 방법과 유사합니다. 인터페이스 상속은 확장 키워드를 사용하고 하위 인터페이스는 상위 인터페이스의 메서드를 상속합니다.

다음 Sports 인터페이스는 Hockey 및 Football 인터페이스에서 상속됩니다.


// 文件名: Sports.java
public interface Sports
{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

// 文件名: Football.java
public interface Football extends Sports
{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

// 文件名: Hockey.java
public interface Hockey extends Sports
{
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

Hockey 인터페이스는 자체적으로 네 가지 메서드를 선언하고 Sports 인터페이스에서 두 가지 메서드를 상속합니다. 이러한 방식으로 Hockey 인터페이스를 구현하는 클래스에는 다음이 필요합니다. 여섯 가지 방법을 구현합니다.

마찬가지로 Football 인터페이스를 구현하는 클래스는 5가지 메서드를 구현해야 하며 그 중 2개는 Sports 인터페이스에서 나옵니다.


인터페이스의 다중 상속

Java에서는 클래스의 다중 상속이 불법이지만 인터페이스는 다중 상속을 허용합니다.

인터페이스의 다중 상속에서는 확장 키워드를 한 번만 사용한 다음 상속된 인터페이스를 사용해야 합니다. 아래와 같이:

public interface Hockey extends Sports, Event

위 프로그램 조각은 법적으로 정의된 하위 인터페이스입니다. 클래스와 달리 인터페이스는 다중 상속을 허용하며 스포츠와 이벤트는 동일한 메서드를 정의하거나 상속할 수 있습니다.


Mark 인터페이스

가장 일반적으로 사용되는 An 상속된 인터페이스는 메서드를 포함하지 않는 인터페이스입니다.

식별 인터페이스는 메서드나 속성이 없는 인터페이스입니다. 이는 해당 클래스가 다른 코드에서 테스트하고 작업을 수행할 수 있는 특정 유형에 속함을 나타냅니다.

식별 인터페이스의 기능: 간단하고 생생하게 말하면, 객체가 특정 또는 특정 권한을 갖도록 표시(스탬프)하는 것입니다.

예: java.awt.event 패키지의 MouseListener 인터페이스에서 상속된 java.util.EventListener 인터페이스는 다음과 같이 정의됩니다.

package java.util;
public interface EventListener
{}

메서드가 없는 인터페이스를 마커 인터페이스라고 합니다. 마커 인터페이스는 주로 다음 두 가지 목적으로 사용됩니다.

  • 공통 상위 인터페이스 구축:

    수십 개의 다른 인터페이스로 확장된 Java API인 EventListener 인터페이스와 마찬가지로 마커 인터페이스를 사용하여 다음을 수행할 수 있습니다. build 인터페이스 세트의 상위 인터페이스입니다. 예: 인터페이스가 EventListener 인터페이스를 상속하는 경우 JVM(Java Virtual Machine)은 해당 인터페이스가 이벤트 프록시 체계에 사용될 것이라는 것을 알고 있습니다.

  • 클래스에 데이터 유형 추가:

    이 상황은 마커 인터페이스의 원래 목적입니다. 마커 인터페이스를 구현하는 클래스는 인터페이스 메서드를 정의할 필요가 없습니다. (마커 인터페이스에는 메서드가 없기 때문입니다.) 전혀), 그러나 클래스는 다형성을 통과하여 인터페이스 유형이 됩니다.