【Java】「interface」のメリットと使い所を考えてみた

#はじめに
つい最近クラスの継承方法を勉強したばっかのJava初心者です
間違った見解があればわかりやすくお伝えしてくださると助かります
今回はinterfaceの理解とどんな場面で使うと便利か，具体例をあげて紹介します．


#interfaceとは
>interfaceは初めに処理内容を具体的に書かず、後からメソッドの実装をして使用するために使う
後からメソッドの実装をするため、処理を変えたい場合に有効

[参考にした記事](https://www.sejuku.net/blog/25772)


以上のみを知ったときの自分の見解
--->**先のビジョンが具体的に見えてないときに使う？**
--->**自分一人でコード書くならわざわざ使う必要はない？**
--->**あとでどのみち使う変数を先に宣言してあとでまとめて利用したいときに役立つ？**


#ルール
**定数**と**メソッド**の定義しかできない
また，インタフェースのメンバ変数は自動的に「public static final」が付与されるので**定数**になる

インタフェースの定義（例）

```
interface インタフェース名 {
  int 定数1    = 1;
  int 定数2    = 2;
  String 定数3 = "hello";

  void あとで処理を書く予定の関数名();
}
```

#できること
インタフェースで定義した定数を，定義した関数名で使い回せること！✌️

例

```java:Main.java
interface Calc {
  int num1 = 1;
  int num2 = 2;
  String str1 = "multiplication";
  String str2 = "division";

  void calculation();
}

class Multi implements Calc {
  public void calculation() {
    System.out.println(str1);
    System.out.println(num1 * num2);
  }
}

class Divi implements Calc {
  public void calculation(){
    System.out.println(str2);
    System.out.println(num1 / num2);
  }
}

public class Main {
  public static void main(String[] args){
    Multi mlt = new Multi();
    mlt.calculation();

    Divi div  = new Divi();
    div.calculation();
  }
}
```

```:実行
$ java Main

multiplication
2
division
0
```

インタフェース名***Calc***で定義した定数と関数を，
掛け算用のクラス***Multi***と割り算用のクラス***Divi***で利用できてるのがわかる

#クラスの継承でいんじゃね？

っと思った方もいるのではないだろうか

そう，**親クラスで定義したものを子クラスに継承すれば同じこと！**

というのは間違いではない．

では**interface**のどこに利点があるのか?

それは，**同時に複数のインタフェースを継承できる**ことです

**クラスの継承**では親クラスを子クラスに継承する場合，
その継承する側の子クラスは**1つの親クラス**しか指定できないはずです．

**「先に作成した複数のインタフェースを同時に扱える（継承できる）」**

というのが，**クラスの継承**に対する**インタフェース**のメリットです．

#クラス継承ではなく「interface」を利用するベストな瞬間
私はこのような場面でインタフェースとしての機能が活きると思いました．

まずは以下のコードをみてください．
私自身の出身校の***生徒数, クラスルームの数, 学年数***を入力に，
各学校における**クラスルームあたりの人口と学年あたりの人口**を出力しています


```java:Main.java

// 小学校
  interface Primary_school {
  int p_people  = 500;
  int p_classes = 18;
  int p_year    = 6;
  String p_name = "Mine";
  void pcal();
}

// 中学校
interface Junior_high_school {
  int j_people  = 750;
  int j_classes = 27;
  int j_year    = 3;
  String j_name = "Yoto";
  void jcal();
}

// 大学
interface University {
  int u_people  = 10000;
  int u_classes = 50;
  int u_year    = 4;
  String u_name = "Tsukuba";
  void ucal();
}

// クラスの人口密度
class PopulationDensity implements Primary_school, Junior_high_school, University{//, Junior_high_school, University {
  public void pcal() {
    System.out.print(p_name+"--->");
    System.out.println(p_people / p_classes);
  }
  public void jcal(){
    System.out.print(j_name+"--->");
    System.out.println(j_people / j_classes);
  }
  public void ucal(){
    System.out.print(u_name+"--->");
    System.out.println(u_people / u_classes);
  }
}

// 学年の人口密度
class PopulationPerYear implements Primary_school, Junior_high_school, University{
  public void pcal(){
    System.out.print(p_name+"--->");
    System.out.println(p_people / p_year);
  }
  public void jcal(){
    System.out.print(j_name+"--->");
    System.out.println(j_people / j_year);
  }
  public void ucal(){
    System.out.print(u_name+"--->");
    System.out.println(u_people / u_year);
  }
}

public class Main {
  public static void main(String[] args){
    String pink   = "\u001b[00;35m";
    String cyan   = "\u001b[00;36m";
    String end    = "\u001b[00m";


    PopulationDensity PD = new PopulationDensity();
    System.out.println(pink+"【PopulationPerClass】: "+end);
    PD.pcal();
    PD.jcal();
    PD.ucal();

    PopulationPerYear PPY  = new PopulationPerYear();
    System.out.println(cyan+"【PopulationPerYear】: "+end);
    PPY.pcal();
    PPY.jcal();
    PPY.ucal();
    //div.calculation();
  }
}
```
実行結果
![Screen Shot 2019-04-25 at 15.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/4eb82f03-d760-258c-a7d1-8cf6519b6626.png)


各クラスの中で，定義した複数のインタフェースを継承できていることがわかると思います．

これは，複数人で別々の入力データを担当して開発する場合には，後々，大いに役立つ機能だと思います．

#クラス継承とインタフェースのメリット・デメリット

||クラスの継承|インタフェース|
|---|---|---|
|メリット|変数や親クラスで定義した関数を扱える|同時に複数のインタフェースを扱える|
|デメリット|一つの子クラスで継承できるクラスは一つだけ|定数のみしか扱えない|


ひとまず，今日はこんな感じです

更新日：2019/04/25