CodeGym /Java Blog /무작위의 /Java의 인터페이스
John Squirrels
레벨 41
San Francisco

Java의 인터페이스

무작위의 그룹에 게시되었습니다
아시다시피 Java의 모든 것은 객체로 구성되며 객체에는 상태(필드)와 동작(메서드에 의해 정의됨)이 있습니다. 클래스의 동작은 클래스를 다른 클래스에 바인딩할 수 있는 것입니다. 행동은 다양한 특성을 가질 수 있으며 때로는 클래스 외부로 이동하는 것이 더 편리할 수 있습니다. 특히 외부 세계와 상호 작용할 때 더욱 그렇습니다. TV의 리모컨이 "상자" 자체 외부에 있는 것과 같습니다. 리모콘은 TV 기능과 사용자 상호 작용을 위한 인터페이스입니다. 예를 들어 추상적인 비행기나 헬리콥터를 구현하는 클래스를 상상할 수 있습니다. 대부분의 새와 같은 두 클래스의 개체는 날 수 있으며 모두 다르게 수행합니다. 아마도 이 기능을 별도의 엔터티로 옮기는 것이 가치가 있으며 모든 잠재적 "전단지"가 이 엔터티에서 상속됩니까? 추상 클래스에 이미 익숙하다면 추상 클래스 Flyable을 만들고 여기에서 Copter 및 Plane 클래스를 "상속"할 수 있습니다. 그러나 그러한 속성이 여러 개 있다면 어떻게 될까요? 예를 들어, 비행기와 헬리콥터는 날 수 있지만 지상에서도 이동할 수 있습니다. Ride 클래스를 생성하더라도 더 이상 Copter 및 Plane을 여기에 할당할 수 없습니다. 결국 각 Java 클래스에는 상위 클래스가 하나만 있습니다. Java의 인터페이스 - 1Java 언어로 인터페이스를 사용하면 이 문제가 부분적으로 해결됩니다. Java의 인터페이스는 특정 구현이 없는 일부 기능을 정의하며, 이는 이러한 인터페이스를 사용하는 클래스에 의해 구현됩니다. 그리고 하나의 클래스는 여러 인터페이스를 구현할 수 있습니다. 실제로 Java로 인터페이스를 구현함으로써 클래스가 무언가를 수행할 수 있음을 선언하고 해당 동작을 보고합니다. 우리는 이미 클래스에서 동작의 구체적인 구현을 수행했습니다. 그래서. 비행기와 헬리콥터는 서로 다르게 이륙합니다. 비행기에는 활주로가 필요하지만 헬리콥터는 일반적으로 수직으로 이륙합니다. 이러한 세부 사항은 클래스 내에서 가장 잘 구현됩니다.

Java의 인터페이스

Java 언어로 인터페이스를 정의하려면 인터페이스 키워드가 사용됩니다. 예를 들어:
interface Voice {

    void talk();
}
위의 인터페이스를 Voice 라고 합니다 . Java의 인터페이스는 구현이 있을 수도 있고 없을 수도 있는 상수와 메소드를 정의할 수 있습니다. 일반적으로 인터페이스 메서드에는 이 예제와 같이 구현이 없습니다. 구현되지 않은 인터페이스의 메서드는 추상 클래스의 추상 메서드와 같습니다. 인터페이스 메서드에는 일반적으로 액세스 한정자가 없습니다. 그러나 인터페이스의 목적은 클래스 구현을 위한 기능을 정의하는 것이기 때문에 액세스는 실제로 기본적으로 공개됩니다. 따라서 구현을 위해서는 모든 기능이 공개되어야 합니다. 인터페이스를 구현하려면 클래스를 선언하는 동안 Implements 키워드를 사용하세요. 또한 인터페이스에 구현이 없는 메서드가 포함되어 있는 경우 해당 메서드는 구현 클래스에서 구현되어야 합니다.
public class Duck implements Voice {


@Override
public void voice() {
   System.out.println("Quack");
}


    }

인터페이스 코드 예

좀 더 완전한 예를 들어보겠습니다. 모든 (음, 거의 모든) 동물은 소리를 낼 수 있는 능력을 가지고 있습니다. 이 경우에 대한 Java 인터페이스 Voice를 만들어 보겠습니다 . 구현이 없는 talk() 메서드가 있습니다 .
public interface Voice {
   void talk();
}
이제 Voice 인터페이스를 지원하는 모든 클래스에는 talk() 메서드 구현이 있어야 합니다 . CatDog 라는 두 개의 클래스를 만들고 이들이 Voice 인터페이스를 구현한다는 것을 나타내겠습니다. 이 경우 클래스를 구현하지 않으면 프로그램이 작동하지 않습니다. 메소드 구현은 매우 간단합니다. Cat 클래스 객체의 talk() 메서드 를 호출하면 야옹에 해당하는 텍스트가 화면에 표시됩니다. Dog 클래스 의 경우에는 짖는 소리가 나타납니다. 또한 클래스에 getter, setter 및 생성자를 추가합니다.
public class Cat implements Voice {
   String name;
   String breed;
   int year;

   public Cat(String name, String breed, int year) {
       this.name = name;
       this.breed = breed;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getBreed() {
       return breed;
   }

   public void setBreed(String breed) {
       this.breed = breed;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("meow...");
   }
}
public class Dog implements Voice {
   String name;
   String color;
   int year;

   public Dog(String name, String color, int year) {
       this.name = name;
       this.color = color;
       this.year = year;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       System.out.println("WOF WOF");
   }
}
실제로 클래스와 메서드 구현은 매우 유사합니다. 음성을 지원 하는 또 다른 클래스인 Parrot을 만들어 보겠습니다 . talk() 메서드 만 다르게 작동합니다. 사용자가 콘솔에 문자열을 입력하면 앵무새는 talk () 메서드를 사용하여 이를 "반복"합니다.
import java.util.Scanner;

public class Parrot implements Voice {
   String name;
   String color;
   int year;

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getYear() {
       return year;
   }

   public void setYear(int year) {
       this.year = year;
   }

   @Override
   public void talk() {
       Scanner scanner = new Scanner(System.in);
       System.out.println("WHat should I repeat after you?...");
       String s =  scanner.nextLine();
       System.out.println(s);
   }
}
이제 테스트 클래스를 만들고 Cat , DogParrot 클래스 개체의 talk() 메서드를 차례로 호출하면 프로그램이 어떤 결과를 생성하는지 살펴보겠습니다 .
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Parrot parrot = new Parrot();
       parrot.talk();
   }
}
출력은 아래와 같습니다. 녹색 텍스트는 콘솔에 인쇄된 사용자 1명입니다.
야옹... 으아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아아

기본 방법

JDK 8 릴리스 이전에는 Java로 인터페이스를 구현할 때 모든 메서드를 클래스에서 구현해야 했습니다. 동시에 Java 인터페이스 자체에는 특정 구현 없이 메소드 정의만 포함될 수 있습니다. JDK 8에는 새로운 기능인 기본 메소드가 추가되었습니다. 이제 Java 인터페이스는 메소드 정의뿐만 아니라 기본 구현도 가질 수 있습니다. 클래스가 인터페이스를 구현하지만 메서드를 구현하지 않는 경우에 사용됩니다. 예를 들어 Voice 인터페이스 의 talk() 메서드를 기본 메서드로 변경해 보겠습니다 . 또한 talk 메서드 가 구현되지 않은 새로운 Voice 지원 Duck 클래스를 작성하겠습니다 .
public interface Voice {
   default void talk() {
       System.out.println("I can talk...");
   }
}
public class Duck implements Voice {

   public void moveForward() {
       System.out.println(" Quack, I am moving forward...");
   }

   public void TurnRight(){
       System.out.println("I am turning right...");
   }
   public void TurnLeft(){
       System.out.println("I am turning left...");

   }

   public void Stop() {
       System.out.println("Quack. I am relaxing on the surface of the water...");
   }

   public void fly(){
       System.out.println("I am flying!!!");
   }

}
이제 테스트 클래스를 약간 변경해 보겠습니다.
public class InterfaceDemo {
   public static void main(String[] args) {
       Cat cat = new Cat ("Mewie", "Siam" ,2021);
       cat.talk();
       Dog dog = new Dog("Snoopy", "White and black", 2020);
       dog.talk();
       Duck duck = new Duck();
       duck.talk();
   }
}
출력은 다음과 같습니다.
야옹... WOF WOF 얘기할 수 있어요...
보다? DogCat 클래스 의 객체에서는 재정의된 메서드 talk()가 호출되지만 Duck 클래스 의 객체에서는 인터페이스의 기본 메서드가 호출됩니다. 따라서 기본 메서드는 수정자가 없는 메서드일 뿐이며 default 키워드로 표시됩니다. 인터페이스를 구현하는 클래스에서 기본 메소드를 구현할 필요는 없지만 이를 재정의할 수 있습니다.

정적 방법

JDK 8 정적 메서드는 Java 인터페이스에서 사용할 수 있으므로 클래스 메서드와 유사합니다.
interface Voice {

    void talk();

    static void check(){

        System.out.println("checked...");
    }
}
인터페이스의 정적 메서드를 참조하려면 클래스의 경우와 마찬가지로 인터페이스 이름과 메서드를 작성합니다.
public static void main(String[] args) {

    Voice.check();
}

인터페이스의 다중 구현

Java 클래스에 여러 인터페이스를 적용해야 하는 경우 모두 Implements 라는 단어 뒤에 쉼표로 표시됩니다 .
public class Duck implements Swimmable, Flyable, Voice {

    public void moveForward() {
        System.out.println(" Quack, I am moving forward...");
    }

    public void TurnRight(){
        System.out.println("I am turning right...");
    }
    public void TurnLeft(){
        System.out.println("I am turning left...");

    }

    public void Stop() {
        System.out.println("Quack. I am relaxing on the surface of the water...");
    }

    public void fly(){
        System.out.println("I am flying!!!");
    }

}
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION