Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
39
Help us understand the problem. What is going on with this article?
@DisneyAladdin

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

はじめに

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

interfaceとは

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

参考にした記事

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

ルール

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

インタフェースの定義(例)

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

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

できること

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

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」を利用するベストな瞬間

私はこのような場面でインタフェースとしての機能が活きると思いました.

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

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

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

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

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

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

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

更新日:2019/04/25

39
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
DisneyAladdin
Pythonが大好物です.

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
39
Help us understand the problem. What is going on with this article?