連載
» 2005年07月13日 00時00分 公開

Eclipseではじめるプログラミング(10):Javaのインターフェイスを理解する (1/2)

[小山博史,@IT]
/fjava/index/index_eclipsejava.html

【改訂版】Eclipseではじめるプログラミング New!
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、本連載「Eclipseではじめるプログラミング」の改訂版となります

 今回はインターフェイスというオブジェクト指向言語Javaにとって非常に重要な概念について解説します。インターフェイスをうまく使用することによって、プログラムの実装変更を簡単に行えるようになります。

インターフェイス

 Javaのインターフェイスとは、具体的な処理が書かれていないメソッドの型だけを宣言している特別なクラスのようなものです。ただし、クラスと違ってnew演算子を使ってインスタンスを生成することはできません。インターフェイスが何かをつかむには、具体的にどのようにして使うものなのかを見た方が早いでしょう。ということで、とにかく使ってみましょう。

 Javaには、配列というデータ構造をオブジェクトとして扱えるようにしたjava.util.ArrayListというクラスがあります。また、これと似ているのですが、連結リストというデータ構造をオブジェクトとして扱えるようにしたjava.util.LinkedListというクラスもあります。どちらもデータをリスト(ある順番で並んだオブジェクトの集合。一覧表を抽象化したものと考えてもよい)で扱いたいときに使います。同じリストとはいえ、それぞれ特徴があるので、使用場面によってどちらを使うかを決めるのが普通です。ここでは、特徴の差については考えないで、単純に使ってみることに注目して、プログラムを作成してみます。

 手順は以下のとおりです。まずは、Sample100クラスを作成してみましょう。Eclipseを起動し、パースペクティブを[Java]に切り替えておいてください。パースペクティブが[Java]になっていないときは、メニューの[ウィンドウ]→[パースペクティブを開く]→[Java]を指定すれば、切り替えることができます。次のような手順で新規にクラスを作成することにします。

  1. [パッケージ・エクスプローラー]の[Sample]をマウス右ボタンでクリック
  2. 表示されるポップアップメニューで[新規]→[クラス]を指定
  3. 表示される[新規Javaクラス]ダイアログで、[名前]にSample100と入力
  4. 同じ[新規Javaクラス]ダイアログで、[どのメソッド・スタブを作成しますか?]のところにある[public static void main(String[] args)]をチェックする
  5. [終了]ボタンをクリック

 出来上がったクラスSample100に、次の水色部分を追加します。mainメソッドでは、new Sample100().execute(); とコーディングすることにより、Sample100クラスのインスタンスをnew演算子で生成して、executeメソッドを呼び出しています。executeメソッドではjava.util.ArrayListのalistとjava.util.LinkedListのllistのどちらにも“A”、“B”という要素を追加(add)し、その後で繰り返し文を使って変数に含まれている要素を順に取り出す(get)という処理をしています。なお、alistとllistに含まれている要素の数はsizeメソッドで取得しています。

 実行結果は画面1のようになります。

A B

A B

画面1

 ここで、alistとllistに関係する処理を見ると、変数の型と名前が違うだけで、どちらも同じ手順で同じメソッド(addメソッド、sizeメソッド、getメソッド)を使っていることに気付くはずです。これだけそっくりだと、もっと簡潔にコーディングできないかと思うことでしょう。こんなときにインターフェイスが役に立ちます。

 Javaには、java.util.Listという一般的なリストを表現するためのインターフェイスがあります。そして、APIリファレンスを見ると分かるのですが、実はjava.util.ArrayList とjava.util.LinkedList はどちらもjava.util.Listインターフェイスを実装(implements)しています。この意味するところは、「java.util.ArrayList もjava.util.LinkedListもリスト(java.util.List)として扱うことができます」ということになります。そして、addメソッド、sizeメソッド、getメソッドはどれもjava.util.Listのメソッドなので、Sample100のexecuteメソッドは次のように書き換えることができます。もちろん、行き当たりばったりでは、このようにうまくはいきません。今回は、最初からjava.util.Listを使えるように、説明の都合上仕組んであったので、うまく書き換えができるのです。

java.util.List list = new java.util.ArrayList();

list.add("A");

list.add("B");

for (int i=0 ; i

   String s = (String)list.get(i);

   System.out.print(s+" ");

}

System.out.println("");

list = new java.util.LinkedList();

list.add("A");

list.add("B");

for (int i=0 ; i

   String s = (String)list.get(i);

   System.out.print(s+" ");

}

System.out.println("");


 太字の部分に注目をしてください。書き換える前は違っていた変数の型と名前を同じにすることができています。繰り返しになりますが、「java.util.ArrayList もjava.util.LinkedListもリスト(java.util.List)として扱える」ということから、こういったことができるのです。インターフェイスを使うことにより、重複するコードが出てきたので、メソッドとしてまとめることにしましょう。次のように新しいtestメソッドを作成します。どうでしょうか、最初に示したコードに比べてずいぶんとスリムになりました。

 testメソッドではjava.util.Listインターフェイス型の仮引数listが宣言されています。このため、このlistへはjava.util.ArrayList型のインスタンスや java.util.LinkedList型のインスタンスを渡すことができます。このようにして、利用するクラスを簡単に変更できるように、メソッドを書くことができるわけです。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。