プログラムを「変更」しやすくする“インターフェイス”:【改訂版】Eclipseではじめるプログラミング(9)(1/3 ページ)
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります
プログラムの再利用を簡単にする「インターフェイス」
オブジェクト指向プログラミング言語では、「プログラムの再利用が簡単にできる」といわれます。それには、Javaのinterface(インターフェイス、境界面)を理解すると、なぜ、このようにいわれるのかが分かります。
今回は「インターフェイス」というオブジェクト指向言語Javaにとって非常に重要な概念について解説します。インターフェイスをうまく使用することによって、プログラムの実装変更を簡単に行えるようになります。これは、「プログラムを交換可能な部品とすることができる」という意味です。プログラム全体へ影響を及ぼすことなく、一部のプログラムを交換できるので、プログラムの再利用が簡単にできます。
Javaのインターフェイスは、具体的な処理が書かれていないメソッドの型だけを宣言している特別なクラスのようなものです。ただし、クラスと違ってnew演算子を使ってインスタンスを生成できません。このようにいわれても、メソッドの型だけを宣言したものが、一体どんな役に立つのか分からないでしょう。
「インターフェイスとは何か」を理解するには、具体的にどのようにして使うものなのかを見た方が早いので、とにかく使ってみることにしましょう。EclipseでJavaプログラミングを始める準備がまだの方は、連載第1回の「Eclipse 3.4で超簡単Javaプログラミング基礎入門」で準備をしておいてください。
リスト系クラスでインターフェイスを理解する
「配列」と「連結リスト」
Javaには、「配列」というデータ構造をオブジェクトとして扱えるようにしたjava.util.ArrayListというクラスがあります。また、これと似ているのですが、「連結リスト(リンクリスト)」というデータ構造をオブジェクトとして扱えるようにしたjava.util.LinkedListというクラスもあります。どちらもデータをリスト(ある順番で並んだオブジェクトの集合。一覧表を抽象化したものと考えてもよい)で扱いたいときに使います。
同じリストとはいえ、それぞれ特徴があるので、使用場面によってどちらを使うかを決めるのが普通です。ここでは、特徴の差については考えないで、単純に使ってみることに注目して、プログラムを作成してみます。
コラム 「ArrayListとLinkedListの違い」
java.util.ArrayListは、内部的に配列を使っていますが、サイズ変更可能です。配列は一度インスタンス生成をすると、そのインスタンスで扱える要素数は固定となるので、こちらの方が配列より柔軟です。固定数の要素を格納する必要がありますが、あるタイミングでその要素数が増減する場合には、配列ではなくjava.util.ArrayListを使うことを検討する価値があります。
java.util.LinkedListは、「連結リスト」と呼ばれるデータ構造を使って実装されていますが、こちらもサイズ変更可能です。配列やjava.util.ArrayListでは添字(インデックス)を指定したアクセスは一定時間で実行されますが、java.util.LinkedListでは「リストの先端か終端のうち指定されたインデックスに近い方から要素を探索してから処理を実行する」といった点が異なります。
格納する要素数がプログラム実行中によく変動するのなら、java.util.LinkedListを使うことを検討する価値があります。
プログラム作成の手順は、以下のとおりです。まずは、「Sample90」というクラスを作成してみましょう。Eclipseを起動し、パースペクティブを[Java]に切り替えておいてください。パースペクティブが[Java]になっていないときは、メニューの[ウィンドウ]→[パースペクティブを開く]→[Java]を指定すれば、切り替えができます。次のような手順で新規にクラスを作成することにします。
- [パッケージ・エクスプローラー]の[Sample]をマウス右ボタンでクリック
- 表示されるポップアップメニューで[新規]→[クラス]を指定
- 表示される[新規Javaクラス]ダイアログで、[名前]に「Sample90」と入力
- 同じ[新規Javaクラス]ダイアログで、[どのメソッド・スタブを作成しますか?]のところにある[public static void main(String[] args)]をチェック
- [終了]ボタンをクリック
出来上がったクラスSample90を、次のように編集します。
public class Sample90 { public static void main(String[] args) { new Sample90().execute(); } public void execute() { java.util.ArrayList alist = new java.util.ArrayList(); alist.add("A"); alist.add("B"); for (int i = 0 ; i < alist.size() ; i++) { String s = (String)alist.get(i); System.out.print(s + " "); } System.out.println(""); java.util.LinkedList llist = new java.util.LinkedList(); llist.add("A"); llist.add("B"); for (int i = 0 ; i < llist.size() ; i++) { String s = (String)llist.get(i); System.out.print(s + " "); } } }
mainメソッドでは、「new Sample90().execute();」とコーディングすることにより、Sample90クラスのインスタンスをnew演算子で生成して、executeメソッドを呼び出しています。executeメソッドではjava.util.ArrayListのalistとjava.util.LinkedListのllistのどちらにも「A」「B」という要素を追加(add)し、その後で繰り返し文を使って変数に含まれている要素を順に取り出す(get)という処理をしています。
Eclipseに警告が
なお、alistとllistに含まれている要素の数はsizeメソッドで取得しています。コンパイラの警告が出るため、黄色い波下線が表示されますが、ここではプログラムの動作に影響はないので、無視して構いません。
コンパイラの警告を表示させないためには、Generics(ジェネリクス)やAnnotation(アノテーション)について理解が必要です。なお、これらについては、本連載で後ほど取り上げる予定です(アノテーションについては、後述するコラムでも簡単に説明しています)。いますぐに知りたいという読者は、少し古いですが、下記記事を参照してください。
そっくりな2つ
実行結果は下記のようになります。
A B A B
ここで、alistとllistに関係する処理を見ると、変数の型と名前が違うだけで、どちらも同じ手順で同じメソッド(addメソッド、sizeメソッド、getメソッド)を使っていることに気付くはずです。これだけそっくりだと、もっと簡潔にコーディングできないかと思うことでしょう。こんなときにインターフェイスが役に立ちます。
次ページでは、java.util.ArrayListとjava.util.LinkedListのインターフェイスを紹介して、その有効性を解説し、インターフェイスの宣言の仕方も説明します。理解がより深まるので、Eclipseでインターフェイスを自作して使ってみましょう。
Copyright © ITmedia, Inc. All Rights Reserved.