Javaプログラミングでインターフェースを使うメリット


Javaプログラミングを学び始めた方のほとんどがインターフェースという機能に戸惑うのではないでしょうか。

抽象クラスとインターフェースのどちらを使えばいいのだろう。

そもそも、クラスにメソッドを定義するだけでいいんじゃないか。

色んな疑問が出てくると思います。

 

そんな人の背中を押せたらいいなと記事を書く事にしました。

 

はじめに

僕もJavaプログラミングを学んでいた時にインターフェースで躓きました。

インターネットで調べてみても、難しい言葉で説明されていたり、そもそもメリットが書かれていないなど、たくさん悩みました。

 

そういう事なので、こういう風に書いてくれていたら、もっと簡単に飲み込めたんじゃないかなっていう事を書きたいと思います。

 

ちなみにインターフェースの基本に関する説明はあまりしません。

それと、インターフェースのメリットが感じられるであろうサンプルをお見せしますが、使い方は他にも色々あります。

あなたの世界を広げていくためにも、ほんの一例だと受け取っていただけると嬉しいです。

 

Javaのインターフェースとは

インターフェースとは、抽象メソッドと定数のみ定義できるものです。

インターフェースの特徴は、多重継承が出来るという点にあります。

 

他のプログラミング言語では、クラスを多重継承出来る機能がサポートされている事があります。

しかし、Javaでは、複数のクラスを同時に継承出来るようになると様々な問題が出る設計になっています。

だから、その代わりにインターフェースという機能が用意されています。

 

階層を超える時にインターフェースは力を発揮する

初心者の方は、このインターフェースに戸惑う場合が多いと思います。

だって、インターフェースを継承させる事が出来るのは、抽象メソッドと定数だけなんだもん。

 

抽象クラスを使えばいいんじゃないの?

多態性?ポリモーフィズム?どういうこと?

実装のないメソッドとか面倒じゃない?

 

色々と思うことはあるかもしれません。

 

とりあえず、こうしたらメリットが分かるんじゃないかなと考えて、サンプルを作りましたので、見てください。

 

サンプル

 

まず、Sayableというインターフェースを定義します。

これは、何かを言わせるためのインターフェースになります。

次にAnimalという抽象クラスを定義します。

先ほどのSayableインターフェースを継承しています。

そして、Animalクラスを継承したCatクラスを定義します。

sayという抽象メソッドをオーバーライドして、実装しました。

先ほどのCatクラスと同じく、Animalクラスを継承したDogクラスを定義します。

そして、Mainという実行クラスを定義します。

さて、animals変数の型に気付きましたでしょうか。

インターフェースであるSayable型になっています。

こうする事でDogとCatという違う型のクラスを配列で扱うことができます。

ということは、sayメソッドを連続で呼び出したいとしたら、for文でシンプルにループ処理させることができますね。

 

じゃあ、実際に実行させてみることにします。

 

ところで、思いませんでしたか?インターフェースいらなくね?って。

この場合だと、Sayable型じゃなくて、Animal型でも一緒だよねって。

 

このサンプルだと、抽象クラスとインターフェースのどちらでも良いっていう事になってしまうんです。

 

じゃあ、以下のようなクラスが出てくるとしたら、どうでしょう。

今まではCatやDogがAnimalクラスを継承してきたので、インターフェースを利用するメリットが見えませんでした。

 

そこでGodクラスの登場です。

このクラスは、動物に分類できないということで、Animalクラスを継承する事ができません。

このようなクラスが登場した時にインターフェースでしか実現できない事が見えてきます。

 

インターフェースのメリットを簡単に説明すると、違う階層のクラスに同じ機能を持たせて、一緒に扱いたい時に便利だということです。

今回の場合、Sayable型の配列にCatクラス、Dogクラス、Godクラスを代入すれば、簡単にループでsayメソッドを呼び出す事ができます。

あまり、複雑な説明をしても、混乱を招くと思ったので、簡単な説明にしましたが、ほんの一例という事で参考になると嬉しいです。

 

もし、分からない、分かり難い、間違っている、そういう意見がございましたら、ぜひコメントをいただけると幸いです。

 


コメントを残す