[Java] Interface
Interface
インタフェースは、クラスまたはプログラムが提供する機能を明確に宣言するクラスまたはプログラムが提供するリストです.
インタフェースを使用すると、クライアント・プログラムはインタフェースで宣言されたメソッドのリストを表示するだけで、そのメソッドを実装するクラスを使用することができるので、非常に便利です.
オブジェクトはインタフェースタイプであり、提供されるすべての方法が実装されていることを意味します.(クラスインプリメンテーションインタフェースは、コードの継承ではなくタイプ継承です.)
Javaのプロパティの1つであるインタフェースとして宣言された宣言を使用して、複数のオブジェクトを実装します.
かいめんとくせい
実装コードのない抽象的なメソッドのみから構成される.
メソッドを宣言すると、すべてのメソッドがpublic abstractにコンパイルされます.
実装クラスは、インタフェース内のすべての抽象メソッドを上書きするか、クラスを抽象クラスにする必要があります.
実装コードがないため、メンバー変数を持つことができず、すべての変数が定数として宣言されます.
public static finalにコンパイルします.
interface 인터페이스 이름{
public static final float pi = 3.14F;
public void makeSomething();
}
Java 8はdefaultメソッドとstaticメソッドを生成し始め、いくつかの実装コードも存在する.default void description() {
System.out.println("정수의 사칙연산을 제공합니다.");
myMethod(); // private method
myStaticMethod(); // private static method
}
static int total(int[] arr) {
int total = 0;
for (int num: arr) {
total += num;
}
//myMethod(); //private method라 오류발생
myStaticMethod(); // private static method라 호출 가능
return total;
}
private void myMethod() {
System.out.println("myMethod");
}
private static void myStaticMethod() {
System.out.println("my Static Method");
}
変換インタフェースの形状
Calc calc = new CompleteCalc();
// Calc는 interface, CompleteCalc는 Calc를 구현한 class
👨🏻💻 Example Code
Calc.java (interface)
package ch14;
public interface Calc {
double PI = 3.14;
int ERROR = -999999;
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
// default method는 위의 method와는 다르게 이 interface를 implement하는 클래스에서
// 꼭 재정의를 하지 않아도 사용가능하다. (원하면 재정의도 가능)
default void description() {
System.out.println("정수의 사칙연산을 제공합니다.");
myMethod();
myStaticMethod();
// default method에서는 private메서드를 기본, static둘 다 호출 가능하다.
}
// interface에서 static으로 생성한 method는 인스턴스 없이 사용 가능하다!!
static int total(int[] arr) {
int total = 0;
for (int num: arr) {
total += num;
}
//myMethod();
myStaticMethod();
// static method에서 private method를 호출할때는 private static만 호출가능하다.
return total;
}
private void myMethod() {
System.out.println("myMethod");
}
private static void myStaticMethod() {
System.out.println("my Static Method");
}
}
Calculator.Java(Calcを実装するクラス)package ch14;
public abstract class Calculator implements Calc {
// interface를 implement하면 method들의 overriding을 하거나
// class를 abstract로 만들어야하는데 이 경우는 4개중 2개의 method들만
// overriding을 하였기에 class도 abstract가 된다.
@Override
public int add(int num1, int num2) {
// TODO Auto-generated method stub
return num1 + num2;
}
@Override
public int substract(int num1, int num2) {
// TODO Auto-generated method stub
return num1 - num2;
}
}
CompleteCale.JAva(計算機のクラスを継承)package ch14;
public class CompleteCalc extends Calculator{
@Override
public int times(int num1, int num2) {
// TODO Auto-generated method stub
return num1 * num2;
}
@Override
public int divide(int num1, int num2) {
// TODO Auto-generated method stub
if (num2==0)
return ERROR;
return num1/num2;
}
public void showInfo() {
System.out.println("모두 구현하였습니다. ");
}
/*
@Override
public void description() {
// TODO Auto-generated method stub
System.out.println("Complete overriding");
} // default method를 재정의한 예시
*/
}
CalculatorTest.java (Test code)package ch14;
public class CalculatorTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1,2,3,4,5};
System.out.println("Static method test: " + Calc.total(arr));
// interface에서 total은 static으로 생성한 method임으로 Calc를 통해 만든 class가 없더라도
// Calc interface를 통해 total method를 사용할 수 있다.
// 즉. interface에서 static으로 생성한 method는 인스턴스 없이 사용 가능하다!!
int num1 = 10;
int num2 = 2;
Calc calc = new CompleteCalc();
// CompleteCalc는 Clac로부터 타입 상속을 받았다.
// CompleteCalc는 Clac로부터 타입을 상속받아서 인스턴스 생성의 타입을 Calc로 해도 된다.
// 그대신 Calc에 정의된 method들만 사용 가능하다. (CompleteCalc에 추가적으로 method를 만들면 사용 불가.)
// CompleteCalc에 추가적으로 정의한 method를 사용하면 인스턴스의 타입을 CompleteCalc로 생성하면 된다.
System.out.println(calc.add(num1, num2));
System.out.println(calc.substract(num1, num2));
System.out.println(calc.times(num1, num2));
System.out.println(calc.divide(num1, num2));
// calc.showInfo();
calc.description();
}
}
複数のインタフェースの実装と継承
Javaのインタフェースには実装コードがなく,1つのクラスで複数のインタフェースを実装できる.
->インタフェースは、複数の継承が可能であることを示します
defaultメソッドが重複している場合は、実装クラスでdefaultメソッドを再定義する必要があります.
defaultメソッドの再定義では、superを使用してインタフェースのメソッドを読み取り、再定義することもできます.
インタフェース間でも継承できますが、extendsが使用されます.
複数のインタフェースを実装するクラスをインタフェースタイプに変換する場合は、変換インタフェースで宣言されたメソッドのみが使用できます.
ex)
上の図の構造でBuyとSellが同じdefaultメソッドを使用している場合、defaultメソッドはCustomer classで再定義する必要があります.インスタンスの作成時にUpcastingでclassを作成する場合は、インタフェースで宣言したメソッドのみ使用できます.
Reference
Reference
この問題について([Java] Interface), 我々は、より多くの情報をここで見つけました https://velog.io/@seongwon97/Java-Interfaceテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol