【Java入門】interfaceの使い方

image
長野 透
書いた人 長野 透

こんにちは!フリーランスの長野です。

オブジェクト指向を勉強したての頃、”何のためにあるの?”と思ってしまう概念の一つが、interfaceではないでしょうか?
実は私がそうでした(笑)。

でも、使い方がわかるとこれがけっこう便利なんです。ですので・・・

この記事では、interfaceについて

・interfaceとは
・interfaceの使い方

という基本的な内容から、

・複数のインターフェースを実装する方法
・インターフェースと抽象クラスの違い

などの応用的な内容についても解説していきます。

今回は、"何のため?"とつい思いがちなinterfaceについて、使い方をわかりやすく解説します!

interfaceとは

interfaceとは、一言でいうと

「処理内容を具体的に書かかず、メソッドの型だけを宣言」

例えばこんな記述です。

プログラムを学んいると、"処理内容を書く"ことを当たり前のようにやってきているので、処理内容を書かないなんて、"どうして?"と思っちゃいますよね。

でも、具体的に書かないメリットがあるんです。

それは、実際に処理を実行する直前に処理を決められるんです。ということは、処理を後で変えることもできるんです。

後になって、処理を変えたい場合はありませんか?
そんな時に該当する場所をわざわざ探しに行って変える必要がないんです。これってとても便利ですよね。

では、実際の使い方について例を交えて解説していきます!

interfaceの使い方

interfaceでは、定数とメソッド名のみ定義できます。

以下は、定義する定数とメソッドについての注意です。
・メンバ変数は「public static final」が付いているものとみなされ、
 定数として扱われる

・実装したクラスでメソッドの実装が必須となる

基本的な使い方

インターフェースを実装する場合には、「implements」を使用します。

例をみてみましょう。

実行結果:

まずはCalc1インターフェースから見ていきましょう。
文字列型とint型の定数を定義し、5種類のメソッドの型だけを宣言しています。
method2とmethod3は引数の違うオーバーロードも使用しています。

これをAddクラスで実装します。「class Add」の後に「implements」句、そしてインタフェース名「Calc1」が続きます。

Calc1インターフェースで宣言したメソッドの処理を記述します。

メソッドの引数には、インターフェース内の定数を指定したり、引数から値を代入することもできます。

次に実行(Main)クラスを見ていきましょう。

Addクラスをインスタンス化します。Addクラスで記述した処理が実行されています。

処理を変える方法

それでは次に、処理を変える必要が出てきた場合をみていきましょう。
これまでは足し算の処理でしたが、掛け算に変えてみます。

実行結果:

このように、Multiplyクラスの追加とMainクラスの一部の変更で処理を変更することができました。

ここで、注意があります。足し算から掛け算に変更したので、表示する文字列を"掛け算"に変更しましたが、その際に
mul.STR = “掛け算”
とやってしまいたくなりますが、これは出来ません。

Calc1インターフェースで
public String STR
と定義していても、
「public static final」が付いているものとみなされ、定数として扱われる
からです。注意しましょう!

この例では、AddクラスとMainクラスの記述されている場所が近いので、このような書き方をすると確かに"なぜ?"となるのですが、例えばCalc1インターフェースとAddクラスがMainクラスとは別のファイルに記述されている場合はどうでしょうか?

処理を変更したい場合は、Addクラスを見つけ出して書き直す必要がありますね。

でもinterfaceを使えば、MultiplyクラスのようにMainクラスと同じファイル内に処理の変更を記述することができます。

探して書き換える手間が省けるのがメリットなのです。

処理が複雑になり記述量が多くなると、多数のファイルに分けて記述するという機会が増えます。

そんな場合はinterfaceでメソッドの型だけ宣言しておいて処理は別で記述する方が、後々の変更などが予想される場合には便利になってくるのです。

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

インターフェースの特徴は多重継承できることです。

多重継承とは1つのクラスが複数の親クラスを持つ事を言います。
多重継承をすることにより、1つのクラスは2つのクラスの性質を同時に受け継ぐ事になります。

同じように抽象クラスを使っても、別でメソッドの処理内容を決めることができます。
しかし、抽象クラスでは多重継承をすることができません。
クラスは多重継承することができず、したがってクラスである抽象クラスも多重継承ができないのです。

例えば、SuperAクラスとSuperBクラスを継承するCalcクラスを作りたいと思って
class Calc extends SuperA, SuperB{ }
などとすることはできないのです。

それに対して、インターフェースはクラスではなく、多重継承が可能なのがインターフェースと抽象クラスの大きな違いになります。

インターフェースを使った多重継承の例をみてみましょう。
足し算のメソッドを持つインターフェースと掛け算のメソッドを待つインターフェースから、足し算と掛け算の両方のメソッドを持つクラスを作ることができます。

実行結果:

このプログラムは以下の処理をしています。

AddインターフェースとMultiplyインターフェースを宣言します。

AddインターフェースとMultiplyインターフェースの両方を実装するCalcクラスを定義します。
AddインターフェースとMultiplyインターフェースで、文字列型定数のSTRとメソッドのmethod1、method2は同じ名称ですが、問題ありません。

ただしこの場合、文字列型定数のSTRを引数とすると、AddインターフェースとMultiplyインターフェースのどちらの定数を指定しているかあいまいなため、どちらか明示する必要があります。ここではAddインターフェースのSTRを指定しています。

その他にもAddインターフェースのaddメソッド、Multiplyインターフェースのmulメソッドをそれぞれ定義します。

実行(Main)クラスでは、Calcクラスをインスタンス化し、それぞれのメソッドの処理を実行しています。

まとめ

ここでは、"何に使うの?"と思ってしまうインターフェースについて、その使い方や抽象クラスとの違いについて説明しました。

処理の内容を決めずに型だけ宣言して別で処理を決めるメリットや、複数のインターフェースのメソッドを1つのクラスにまとめることができるメリットを感じて頂けましたでしょうか?

"処理を書くのがプログラム"という思いがあるので、慣れが必要かもしれませんが、そんな場合はこの記事を何度も参考にして下さいね!

Javaカリキュラム無料公開中!
この記事はJava入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Java学習に必要な情報を一つにまとめていますので効率よくJavaを学ぶことが出来ます。この機会に是非活用していただければと思います。


33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーでWEBエンジニアをやられている濱口直行さん。33歳で、プログラミングを学び始め、約半年という短い期間で独立までされた学習ログを余すことなくインタビューさせていただきました。

プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。


最短でJavaを習得したい方へ

もし、あなたが、

「難しすぎて学習が全然進まない」
「学習量が膨大でゴールが見えない」
「エラーを解決するのに何日もかかってしまう」

など、プログラミング学習やキャリアに関してお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_bannar-java2

プログラミング学習者必見

専属講師に質問し放題、レッスンし放題、最短1ヶ月でフリーランスエンジニア
プログラミング学習カリキュラム無料公開中
Ruby学習カリキュラム無料公開中
 1記事最大11,000円!テックライター募集


LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
info@sss-lab.com