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


インタフェースと抽象クラスは、オブジェクトを生成できない共通点を持つ設計図として使用できます.
もちろん,ここでより詳細に言えば,両者とも継承して用いることができる点と,継承関係を利用して多形性を利用することができる.
違いを選ばなければならないなら、大きな差をつかまえなければならない.
1)コネクタ
-重傷かもしれない
-implementsキーワードを使用します.
-定数組成のみです.
2)抽象クラス
-重傷を負うわけにはいかない
-extendsキーワードを使用します.
-定数ではなく、通常のメンバー変数を宣言できます.
元のインタフェースには抽象クラスと具体的な方法はありません.
인터페이스는 Java8버전 부터 디폴트메소드 , 
정적메소드를 지원하여 구체화된 
메소드를 명시하고 사용할 수 있게 되었으며 
Java9버전 부터는 private 메소드를 구현하여 사용할 수 있다. 
단 ,상속받은 클래스에서 재정의하여 사용은 불가능하다.
注:インタフェースで指定した定数とメソッド
コンパイル中、定数を明示的に書き込む必要がなく、予約項目と抽象メソッドの予約項目を実現し、定数と抽象メソッドに自動的に変換できます.
ex)
定数:
int ERROR = -999; コンパイル時
public static final int ERRORとなります.
方法:
int add(int num1 , int num2); コンパイル時
public abstract int(int num1,int num2); に変化
理論的にはこのような大きな違いがあり、受け入れやすいが、あまりにも似ているため、このような区別の原因を解決することができなかった.だから!!!
使い方の違いについてお話ししたいと思います.
要するに,抽象クラスはIS−A関係である.
インタフェースはHAS-A関係を表現するのに適している.
では、この関係の違いは何でしょうか.
IS-A関係:一般概念と具体概念の関係.例えば、Human.classとAnimal.classがあると仮定します.この時、人は人間でも動物でもいいです.この関係を意味する.
HAS-A関係:例えば、Student.classとSubject.classがあると仮定するこの場合、学生の情報は、カリキュラムの情報であってもよいし、カリキュラムの情報であってもよいが、学生はカリキュラムである.科目が学生だとは思えない.
これは,あるクラスが別のクラスを持つ関係であるといえる.
言語で説明するより、コードで説明したほうがいいです.
public abstract class Animal{

private int age;

public Animal(){
	age = 1
}
public void oneYear(){
	age++;
}

public abstract void move();
public abstract void sound();
}
生成者とage値を用いて生命の最初の出生である1歳を設定し,抽象法は異なる動物が異なる機能を実現する必要があるため,抽象法として宣言した.
public class Human extends Animal{

@Override
public void move(){
	System.out.println("두 발을 이용하여 걷는다");
}

@Override
public void sound(){
	System.out.println("언어를 이용하여 말한다.");
	}
}
public class Bird extends Animal{

@Override
public void move(){
	System.out.println("날개를 이용하여 이동합니다.");
}

@Override
public void sound(){
	System.out.println("짹짹 울음소리를 낸다.");
	}
}
このような総合的な概念から具体的な概念に延びる過程に適した表現.
では、ここでインタフェースを適用すると、どのように使えばいいのでしょうか.
それぞれの動物は自分たちの能力を持っているはずで、上でAnimal類を実現したクラスの中には、可能なものもあれば、不可能なものを抽象的な方法に実現するのに適していないものもあります.
インタフェースは多中速であってもよいので、機能別に実施した後、これらの機能は必要なクラスで部分的に継承および使用することができる.
このように,抽象クラス間の結合度は高いが,インタフェースは結合度が低下するとともに柔軟性を提供する.
次の例では、クラスでSwimable、Flyable、Playbalインタフェースを使用します.
SWIMMMABLEは泳ぎ方、Flyableはfly方法を使います
PlayballインタフェースはPlayメソッドを抽象的なメソッドとする.
public class Turtle extends Animal implements Swimmable{

@Override
public void move(){
	System.out.println("4개의 발을 이용합니다.");
}

@Override
public void sound(){
	System.out.println("거북거북(??)이라 말한다.");}     

@Override
    public void swim(){
    	System.out.println("헤엄을 칠 수 있다.");
    }
}
public class Bird extends Animal implements Flyable{
@Override
public void move(){
	System.out.println("날개를 이용하여 이동합니다.");
}

@Override
public void sound(){
	System.out.println("짹짹 울음소리를 낸다.");}     

@Override
    public void fly(){
    	System.out.println("날 수 있다");
    }
 
 }
public class Human extends Animal implements 	Swimable , Playball{

@Override
public void move(){
	System.out.println("두 발을 이용하여 걷는다");
}

@Override
public void sound(){
	System.out.println("언어를 이용하여 말한다.");
}

@Override
    public void swim(){
    	System.out.println("수영을 할 수 있	다.");
    }

@Override
public void play(){
	System.out.println("공을 가지고 논다.");
  	}
}
これにより、各実装クラスは、必要な機能に応じて、必要なインタフェースをそれぞれ設定および使用することができる.各クラスが異なるクラスを継承しているが、同じ機能が必要な場合に便利です.
もちろん,重複するコードの数を減らすことは抽象クラスほど難しくない.
複数の中間層を利用してそれぞれの機能を独立して使用し、メンテナンスが容易で、柔軟に変更することができます.
だから最後にもう一度整理したら.
両方とも継承クラスで共通するメソッドを宣言します.
単一の継承のみが可能であるため、結合度が高いため、重複するコードを減らすことができるが、抽象クラスは祖先クラスが変更された場合、すべてのサブクラスが一緒に変更しなければならないIS-A関係を表すのに適していない.
マルチ継承の可能性があるため、分散結合されたコードを抽象クラスの重複レベルに減らすことは難しいが、インタフェースのメンテナンスと変更が容易で、HAS-A関係を表現するのに適している.
そう言ってもいいです.
余分な勉强の部分があれば、后でまた追加して整理します!!
(何か間違いや訂正があったらコメントで教えてください!!)