[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 method
  • は、インタフェースのクラスを実装するための基本的な一般的な方法である.
  • インプリメンテーションクラスで必要に応じて再定義することもできます.
  • インタフェース内でdefaultメソッドがprivateメソッドを呼び出すと、privateメソッドとprivate静的メソッドの両方が呼び出されます.
  • default void description() {
    		System.out.println("정수의 사칙연산을 제공합니다.");
    		myMethod();  // private method
    		myStaticMethod();   // private static method
    	}
  • static method
  • Staticメソッドは、静的変数と同様に、インスタンスを作成することなく使用できます.
  • 静的メソッドからprivateメソッドを呼び出すと、private静的のみが呼び出されます.
  • static int total(int[] arr) {
    		int total = 0;
    		for (int num: arr) {
    			total += num;
    
    		}
    		//myMethod();  //private method라 오류발생
    		myStaticMethod();  // private static method라 호출 가능
    		return total;
    	}
  • private method
  • インタフェースの内部でのみ使用される方法では、インタフェースを実装するクラスでインタフェースを使用または再定義することはできません.
  • defaultメソッドまたは静的メソッドでのみ使用されます.
  • 	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
  • 継承の変換と同じ意味で、変換を行う場合は、インタフェースで宣言されたメソッドのみが使用できます.(クラスで新しく宣言されたメソッドは使用できません.)
  • クラス継承とは異なり、実装コードがないため、1つのクラスで複数のインタフェースを実装することができる.
  • 👨🏻‍💻 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

  • 「Fast Campas」を一度に完了したJava/spring Web開発主ハイパーパケットオンライン.