Java学習8週目:インタフェース


この文章は白奇仙の現場学習。の参加と学習内容の総括である.

学習目標

  • インタフェースを定義する方法
  • インタフェース
  • の実装方法
  • インターフェースを介してインプリメンテーション
  • の使用方法を説明する.
  • インタフェース継承
  • インタフェースのデフォルトメソッド(Default Method)、java 8
  • インタフェースの静的メソッドjava 8
  • インタフェースのプライベートメソッドjava 9
  • インタフェースの定義方法


    インタフェース(interface)とは、他のクラスを作成する際に基本フレームワークを提供し、他のクラス間で中間メディアとして機能する抽象クラスを指す.
    メソッドの宣言
    1.インタフェース宣言はinterfaceキーワードを使用する.
    2.インタフェースのすべてのメソッドはpublic abstractのすべてのフィールドがpublic static finalである必要があります.(java 8以降の静的メソッドとdefaultメソッドを除く)
    3.以上のキーワードは開発者が省略し、コンパイラが自動的に追加することができる.
    宣言の例
    interface InterfaceTest {  // 'interface' 키워드를 통해 선언
      public static fianl NUMBER = 1;
      public abstract testRun();  // 구현부가 없는 추상 메소드
    }
    インタフェースの利点
  • プロジェクト開発は一貫した構造化された標準化を実現できる
  • クラスと実装インタフェースを同時に作成することで、開発時間
  • を短縮することができる.
  • クラスとクラスの関係をインタフェースで接続することで、各クラスは独立して
  • をプログラミングすることができる.

    インタフェースの実装方法


    インタフェースも抽象クラスと同様に、自分でインスタンスを作成することはできません.これは,インタフェースに含まれる抽象メソッドのクラスを実現する必要がある.Javaでは、クラスがインタフェースを実装する場合、implementsキーワードを使用できます.クラス継承で使用されるextendsキーワードとは異なり、インタフェース実装は複数回で実現することができる.
    class Test implements InterfaceName {
    }
    しかし,インタフェース定義には抽象クラスという用語に疑問がある.Javaには抽象クラスがありますが、インタフェースも抽象クラスに似ているので理解できません.

    抽象クラス、インタフェースの違い


    Javaでは、抽象クラスに抽象メソッド、フィールド、ジェネレータ、および一般メソッドを含めることができます.しかし,インタフェースは抽象的な方法,定数しか持たない.(Java 8以降、defaultメソッドとstaticメソッドが追加されます)
    ここでは,上記の宣言方式に違いがあることは知っているが,開発者がどのような場合にこの2つの類似の宣言方式を使用するかについては,意味的な区別があいまいであるようだ.インタフェースと抽象クラスの役割の違いを参照するときに、他のブログの内容を参照しました.
    -注:https://myjamong.tistory.com/150
  • 抽象クラスはisa(~)
  • インタフェースはhas a(~)
  • であることができる.
    抽象クラスは、特定の共通オブジェクトを抽象化するために使用されるのが好ましく、インタフェースは、そのオブジェクトの動作を抽象化するために使用されるのが好ましい.
    例)次のテキストはコードによって実装されています.
    開発者は人間(公共の対象)です.
    開発者は符号化(動作)を行うことができる.
    class Person {
      String name;
      int age;
    }
    
    interface Development {
      public abstact void coding();
    }
    
    public class Developer extends Person implements Development {
      
      String language;
      
      public Developer(String name, int age, String language) {
        super(name, age);
        this.language = language;
      }
      
      @Override
      public void coding() {
        System.out.println(language + " 개발자는 " + language + "를 코딩중이다."); 
      }
      
    }

    インタフェースリファレンスによるインプリメンテーションの使用方法


    Javaはインタフェースを介して多形性を利用することができる.オブジェクトがAというクラスでBというインタフェースを実装している場合、Bタイプの参照変数でAクラスのオブジェクトを参照できます.
    interface B {
      void run();
    }
    
    class A implements B {
    
      @Override
      public void run() {
        System.out.println("running..");
      }
      
    }
    
    class Main {
      public static void main(String[] args) {
        B parent = new A();  // B 라는 인터페이스 타입에 A 객체를 주입
        parent.run();    
      }
    }

    インタフェースの継承


    インタフェース継承では、クラスとは異なり、多重継承が可能です.クラスでは、親クラスのメソッドは子クラスでの競合を防止するためであり、インタフェースでは、存在する抽象メソッドは宣言子のみが存在するため、競合は発生しないため、多重継承が可能である.
    ただし、複数を継承する場合、親インタフェースのメソッド名、パラメータタイプは同じですが、戻りタイプが異なる場合は、複数を継承できず、コンパイルエラーが発生します.

    以上のように,CインタフェースがAとBインタフェースを継承する場合,AとBは同じrun()メソッド名を持ち,パラメータタイプも同じメソッドを持つ.この場合run()メソッドが競合し、コンパイルエラーが発生します.
  • インタフェース継承構造では、サブインタフェースは、スーパーインタフェースのすべての方法を実装しなければならない.
  • インタフェースレポートは、インタフェースを実装するクラスインスタンスを参照することができ、インタフェースで宣言されたメソッドのみを呼び出すことができる.
  • インタフェースのオブジェクトは、トップレベルの親ではありません.
  • インタフェースのデフォルトメソッド


    Java 8から、インタフェースにデフォルトメソッド(default method)が追加されます.このメソッドが追加した背景は次のとおりです.Aインタフェースを実装しているクラスはAのすべての抽象メソッドを実装する必要があるが,Aインタフェースに新しいメソッドを追加するには,Aを実装しているすべてのクラスでこのメソッドを実装する必要がある.したがって,インタフェースに新しい方法を追加することは非常に負担である.これを補うために、既存のインタフェースで宣言される抽象的な方法とは異なり、defaultのキーワードを前に付けて宣言し、通常の方法のように実施部を有する基本的な方法が現れる.
    使用例
    public interface Foo {
    
      default void print() {
        System.out.println("default method!");
      }
      
    }
    注意事項
  • インタフェースのインプリメンテーションはdefaultメソッドがどのようにインプリメンテーションされるか分からない.
  • defaultメソッドの機能事項が正常に動作することは保証されません.
  • の問題が発生した場合、Runtime Exceptionが発生する可能性があります.
  • defaultメソッドを使用する場合は、ドキュメント化を行うことが重要です.
  • defaultメソッドは再定義できますが、上記の問題が発生する可能性があります.使用時に記録したほうがいいです.
  • インタフェースの静的メソッド


    Java 8から静的メソッドが追加されました.再定義(オーバーライド)可能な基本メソッドとは異なり、静的メソッドではオーバーライドは許可されず、オブジェクトをインスタンス化する必要はありません.
    interface Test {
    
      static void running(String name) {
        System.out.println(name + "을 실행중..");
      }
      
    }
    

    インタフェースのprivateメソッド


    Java 9から、インタフェースにprivateメソッドとprivate静的メソッドが追加されました.
    追加された背景
  • はjava 8の基本的な方法と静的な方法が依然として存在するが、いくつかの不便な点もあるため、
  • は、開示された方法を使用して作成する必要があるため、特定の機能のみを実行する内部方法である.
  • コードの重複を低減し、インタフェースのパッケージを維持し、
  • privateメソッド規則
  • プライベートメソッドは、実施部を所有しなければならない.
  • はインタフェースの内部でのみ使用できます.
  • プライベート静的方法は、他の静的方法および非静的方法にも用いることができる.
  • 非静的プライベートメソッドは、他のプライベートメソッドでは使用できません.使用例
    interface Tester {
      
      private void run() {
        System.out.println("private 메소드!");
      }
      
      private static void running() {
        run();
        System.out.println("private static 메소드");
      }
      
    }

    また、以下の内容を勉強するのもいいです。


    強結合と松結合の比較については,現時点ではこの内容の理解が明確ではなく,常に見,明確に指摘する必要がある.
    コメントブログ
  • https://ahnyezi.github.io/java/javastudy-8-interface/
  • https://velog.io/@damiano1027/Java-%EA%B0%95%ED%95%9C-%EA%B2%B0%ED%95%A9%EA%B3%BC-%EC%95%BD%ED%95%9C-%EA%B2%B0%ED%95%A9
  • https://norwayy.tistory.com/258
  • リファレンス

  • http://www.tcpschool.com/java/java_polymorphism_interface
  • https://myjamong.tistory.com/150
  • https://ahnyezi.github.io/java/javastudy-8-interface/