インターフェース (1) 基本

2010 年 7 月 1 日 木曜日  【 カテゴリー: Javaの基本


今回はインターフェースについてみていきます。

インターフェースとは

インターフェースとは何か?「IT用語辞典 e-Words」さんから引用します。

二つのものの間に立って、情報のやり取りを仲介するもの。また、その規格。
ソフトウェアインターフェースは、プログラム間でデータをやり取りする手順や形式を定めたもの。

Javaでのインターフェースは、定数とメソッドの形式を定めたものの集まりです。「メソッド名」、「引数」、「戻り値の型」などを決め、具体的な処理は書きません。具体的な処理はインターフェースを実装したクラスで記載します。クラスを使う人はインターフェースをみるだけでどのような機能があるのかわかり、同じインターフェースを実装していれば処理内容が違っていても、同じようにメソッドを使うことができます。

インタフェースの宣言

【CompareInterface.java】

interface CompareInterface {
    //比較する
	int compareTo(Object obj);
}

java090

「比較」に関するインターフェースです。このサンプルでは「compareTo」というメソッドがあり、結果は整数型で返します。サンプルをみてもわかるようにインターフェースのメソッドには具体的な処理の記述はありません。このインターフェースを実装したクラスで「compareTo」メソッドをオーバーライドし具体的な処理を記述します。

インターフェースについて簡単に言えば、「比較する」という機能は様々なクラスで使うだろうから、クラスを使う人が使いやすいようにメソッド名や引数、戻り値の型を統一しましょうってことです。メソッドの作り方の規約です。当然、比較するという具体的な処理はクラスごとに違いインターフェースでは記述できないので、インターフェースを実装したクラスで記述します。

インターフェースは設計図で例えられるクラスとは性質が異なります。そこでインターフェースの宣言では「class」の代わりに「interface」というキーワードを使って宣言します。

interface インターフェース名 { ・・・ }

インターフェースの実装

【Test.java】

class Test implements CompareInterface{
    int math;		//数学
    int English;	//英語
    int science;	//理科

    //コンストラクタ
    Test(int math , int English , int science){
    	this.math    = math;
    	this.English = English;
    	this.science = science;
    }
    //平均値
    public int average(){
    	return (math + English + science) / 3;
    }
	//【比較する】 ※インターフェースのメソッドをオーバーライド
	public int compareTo(Object x){
		Test obj = (Test)x;
		return this.average() - obj.average();
	}
}

java091

class Test implements CompareInterface{

インターフェースを実装していきます。インターフェースはクラスとは別の性質であり、「インタフェースを拡張する」 という感じではありません 。そこで「extends」ではなく「implements」キーワードを用いて実装します。

class クラス名 implements インタフェース名 { ・・・ }

	public int compareTo(Object x){

17行目でインターフェースにあるメソッドをオーバーライドしています。インターフェースのメソッドには具体的な処理が記述されていないので、実装したクラスで記述しなければなりません。もしオーバーライドしなければエラーになります。

Exception in thread "main" java.lang.Error:
                     Unresolved compilation problem:
型 Test は継承された抽象メソッド CompareInterface.compareTo(Object)
を実装する必要があります

【Human.java】

class Human implements CompareInterface{
    String name;  //名前
    int height;   //身長
    int weight;   //体重

    //コンストラクタ
    Human(String name , int height , int weight){
    	this.name   = name;
    	this.height = height;
    	this.weight = weight;
    }
	//【比較する】 ※インターフェースのメソッドをオーバーライド
	public int compareTo(Object x){
		Human obj = (Human)x;
		return this.height - obj.height;
	}
}

java092

もうひとつ「CompareInterface」インターフェースを実装したクラスをつくります。
Testクラスの
compareToメソッドはテストの平均点を比較する処理が記載されていましたが、HumanクラスのcompareToメソッドは身長を比較しています。

【Sample.java】

public class Sample {
    public static void main(String[] args) {
    	Test  Taro_test   = new Test(65 , 40 , 70);
    	Test  Hanako_test = new Test(55 , 80 , 60);
    	Human Taro        = new Human("太郎" , 170 , 60);
    	Human Hanako      = new Human("花子" , 160 , 50);

    	System.out.print("テスト比較:");
    	System.out.println(Taro_test.compareTo(Hanako_test));
    	System.out.print("身長比較:");
    	System.out.println(Taro.compareTo(Hanako));
    }
}
テスト比較:-7
身長比較:10

インターフェースを実装したクラスをインスタンス化して使ってみます。Javaマニュアルのようにインターフェースの仕様書を作成すれば、それを見ることによりどのようなクラスにそのインターフェースが使われているかわかります。逆に言えば、そのインターフェースを実装したクラス全てにおいて、インターフェースで宣言したメソッドを含まれおり、さらにメソッドの使い方が同じです。
ではサンプルをみてみます。「compareTo」メソッドはオブジェクト同士を比較し、結果を整数の差で返してきます。

System.out.println(Taro_test.compareTo(Hanako_test));

9行目はテストの平均点を比較しています。結果から太郎の平均点は花子の平均点より7点低いことがわかります。

System.out.println(Taro.compareTo(Hanako));

11行目は身長を比較しています。結果から太郎の身長は花子より10cm高いことがわかります。

処理内容は全く違いますが、「compareTo」メソッドの使い方は全く同じことが確認できたと思います。インターフェースを実装することによりメソッドの使い方を強制的に同じにしてるともいえます。処理は違うが同じように使えるというオブジェクト指向の特徴のひとつ「ポリモーフィズム(=多様性)」です。


にほんブログ村 IT技術ブログ Webサイト構築へ
にほんブログ村
【WEBサイト構築・プログラムブログ】
ランキング参加中!よろしければ「クリック」お願いします。
にほんブログ村 IT技術ブログ プログラム・プログラマへ
にほんブログ村
2010 年 7 月 1 日 木曜日  【 カテゴリー: Javaの基本

コメントをどうぞ

※管理者による確認後に表示されます。表示までしばらくお待ちください。