抽象クラスとインタフェース

2868 ワード

抽象クラスとインタフェースは、コードの独立性と一貫性を維持するのに役立ちます.また,両クラスとも内部にabstract 키워드が付いた추상 메서드があり,抽象クラスのサブクラスと実装インタフェースを継承するクラスは,この抽象手法overrideを用いて共通の機能を自分に適合させなければならない.

抽象クラスとインタフェースの利点


抽象クラスとインタフェースは、コードの一貫性を維持します.これは、クラスがどのような機能を実装し、仕様を作成する必要があるかを継承または実装することを意味します.これにより,異なるサブクラスで異なる名前を用いて類似の機能を実現することができ,Javaの多形的な行為を破壊することを防止できる.
また、抽象クラスとインタフェースは、一般的な継承と同様に、関連付けられていないクラス間で関係を作成し、コンテナ(資料型)にバンドルします.複数のクラスを1つのデータ型に含めることができない場合、同じ抽象クラスまたはインタフェースを実装するクラス間で、いくつかのデータ型を少し変更したい場合でも、使用するすべてのコードを変更する必要がありますが、抽象クラスとインタフェースはこの状況を阻止します.
一方,インタフェースはクラスの宣言と実装を完全に分離しているようで,実際の実装とは独立したプログラムを記述することができる.また、クラスとクラス間の直接関係をインタフェースを使用する間接関係に変更すると、1つのクラスの変更は他のクラスに影響しないため、独立してプログラミングできます.
<抽象クラスを実施する際の注意事項>
  • 抽象クラスはクラスですが、インスタンス化は許可されません.
  • 抽象クラスを継承するクラスは、抽象クラスで定義されたすべての抽象メソッドを上書きすることによって実現する必要があります.そうでなければ、クラスも抽象クラスでなければなりません.
  • <インタフェースを実装する際の注意事項>
  • インタフェースはもちろんインスタンス化できません.
  • すべてのメンバー変数はpublic static final(定数)でなければなりません.省略できます.
  • すべての方法は共通の要約でなければならず、省略することができる.
  • 抽象クラスと同様に、インタフェースを実装するクラスも抽象クラスとして宣言する必要があります.すべての抽象メソッドが上書きされない限り.
  • インタフェースとクラス間の変換


    インタフェースは通常継承関係と同様(抽象クラスは通常継承の拡張範囲であり、もちろん可能)であり、インタフェースを実現するクラスのオブジェクトは自動的にインタフェースに変換することができる.(前回のリリースで述べたように、親と子の間で自動変換が実現された場合にのみ、同じインタフェースを実現する異なるクラスを1つの場所に集約することができるため、自動変換自体はJavaの多形性実装と密接に関連しています.)

    インタフェースの役割


    直接インタフェースを実現する際、インタフェースはコードの独立性と一貫性を維持する役割を果たす.すなわち、設計フレームワークを構築し、標準化することができる.
    またjavaプログラミングを行う場合にはAPI定義のインタフェースを用いることができ,この場合にはこれらのインタフェースで定義された抽象的な手法を上書きすることで容易に機能を実現することができる(ex.Thread).
    また、Java自体には複数の継承の問題があります(親が同じ名前のメソッドを持つ場合、どのメソッドを上書きするかを示すのは難しい...)したがって、インタフェースを使用すると、マルチ継承のような効果を生成することは許されません.
    では、インタフェースは同じように多重継承の副作用を持っていますか?
    そうではありません.インタフェース内のすべてのメソッドは抽象メソッドであり,メソッド名が重複しても問題は発生しない.インタフェースを実装するクラスで実際に実装されているからである.

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


    抽象クラス:クラスに1つ以上の抽象メソッドが含まれている場合.作成者または通常のメンバー変数またはメソッドを持つことができます.すなわち,抽象的手法を含む以外は一般クラスと区別されない.
    インタフェース:すべてのメソッドが抽象メソッドである場合(例外的にjdk 1.8からdefaultキーワードを使用して従来のメソッドを実装したりstaticメソッドを使用したりすることができます).変数には定数しかありません.
    cf.
    static 메서드 -> 인스턴스와 관계가 없는 독립적 메서드이므로 있어도 무관
    
    default 키워드 -> 인터페이스는 설계도를 만드는 작업인데, 이 설계도가 수정되지 않는게 가장 좋은 설계이겠지만, 
    어쩔 수 없이 수정해야할 경우 이를 implements한 모든 클래스를 수정하는 것을 막기 위해 추가되었다.

    抽象クラスとインタフェースの目的


    抽象クラス:抽象クラスの継承による機能の利用と拡張(通常の継承と同様)
    インタフェース:実装された機能は存在せず、メソッドのハウジングのみが存在し、いくつかの機能を強制的に実装します.
    cf.extendsとimplements、いつ使いますか?