【改訂版】Eclipseではじめるプログラミング New!
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、本連載「Eclipseではじめるプログラミング」の改訂版となります
第7回「Javaのクラスとインスタンスを理解する」では、実際の世界に存在する人や物をクラスとして分類することができることを解説しました。これらの分類項目は名前を付けて区別することができました。クラスに属する実在の人や物を示す場合はクラスとは別にオブジェクトと呼ぶことや、プログラムにおいてオブジェクトの情報を格納するために作成されるものをインスタンスと呼ぶことも説明しました。また、各クラスの性質はクラスの属性として表現することも説明しました。これだけでもプリミティブ型や配列型を使うよりはるかに簡単にデータをプログラムで扱えるようになりますが、オブジェクト指向では、さらにクラスを特徴付ける「振る舞い」というものがあります。Javaでは「クラスの振る舞い」というのはメソッドとして表現されます。今回は「クラスの振る舞い」と「Javaのメソッド」について解説します。
それでは、「クラスの振る舞い」について説明します。例としてCDプレーヤーの機能をオブジェクト指向プログラムで実現することを考えてみましょう。一般的なCDプレーヤーに必要な機能は、聴きたいCDを挿入できること、挿入されているCDを再生できること、早送りができること、曲のスキップができること、挿入されているCDを取り出せること、などになります。物理的なCDプレーヤーでは、これらの機能に対応するボタンが用意されています。CDプレーヤーの使用者は、CDプレーヤーのボタンを使って自分の好きなようにCDプレーヤーを動作させます。
ここで、このプログラムをオブジェクト指向で実現することを考えてみます。オブジェクト指向ではCDプレーヤーに対応するクラスを用意します。つまりCDPlayerクラスを用意することになります。次にCDPlayerが持つ再生や早送りの機能を何らかの方法で表したいのですが、前回解説した属性ではこういった機能を表現することはできません。そこで、これらの機能についてもう1度よく考えてみることにします。CDプレーヤーを動作させることは、別のいい方をすれば、CDプレーヤーの使用者はCDプレーヤーのボタンを使ってCDプレーヤーへ指示を出しているということになります。CDプレーヤーを主体として考えると、CDプレーヤーは与えられた指示によって振る舞いを変えるということになります。このことから、これらの機能を表現するためには「クラスの振る舞い」という概念を導入すると良いことが分かります。
プログラミング言語Javaでは「クラスの振る舞い」というのはメソッドとして表現されます。「クラスの振る舞い」は1つとは限らないので、それぞれの振る舞いを区別できるようにメソッド名を付けます。何か振る舞い(動作と考えてもいいでしょう)をするに当たっては、何かの情報に基づいて行う場合があります。例えば、「再生をする」という振る舞いにしても、「1番目の曲を再生する」とか「3番目の曲を再生する」、のように曲番を指定したいこともあります。こういう指定ができるように、メソッドはパラメータ(引数ともいいます)を渡せるようにすることもできます。さらに、振る舞いの結果がどうなったかという情報を表現できることも必要です。そのため、メソッドの実行結果はどんな型で表されるデータになるかを指定することができます。これを「メソッドの戻り型」といいます。例えば、単純な振る舞いを行った結果として考えられる情報としては、振る舞いが成功したか失敗したかということがあるでしょう。これを表現するためにはメソッドの戻り型はbooleanとすれば良いということになります。
ここまでの内容を理解したうえでメソッドの文法を見てみましょう。パラメータを渡せるようにするためには、仮パラメータを指定します。仮パラメータは仮パラメータ型と仮パラメータ名から構成され、次のようになります。
戻り型 メソッド名(仮パラメータ型 仮パラメータ名) { 処理 }
複数のパラメータを指定することもできます。その場合は「,」を使って、パラメータ間を区切ります。例えば2つのパラメータを持つメソッドの場合は、次のようになります。
戻り型 メソッド名(仮パラメータ型 仮パラメータ名, 仮パラメータ型 仮パラメータ名) {
処理
}
なお、パラメータを必要としないメソッドの場合は、次のようになります。
戻り型 メソッド名() { 処理 }
結果を戻す必要がない場合はvoidという特別な型を使います。従って、次のようなコードになります。パラメータの指定については、上記で説明したことが同様に当てはまりますから、パラメータなしや、複数のパラメータを指定することもできます。
void メソッド名(パラメータ型 パラメータ名) { 処理 }
それでは、具体的にメソッドを持つクラスを考えてみましょう。例えば、正6面体のサイコロをプログラムで表現することを考えてみましょう。とても単純なので拍子抜けするかもしれませんが、サイコロを表現するクラスとしてはDiceクラスを用意します。
そこでまずはEclipseでDiceクラスを作成しておきましょう。手順は以下のとおりです。第2回の「Eclipseの基本操作に慣れる」と同様にEclipseを起動し、パースペクティブを[Java]に切り替えておいてください。パースペクティブが[Java]になっていないときは、メニューの[ウィンドウ]→「パースペクティブを開く」→[Java]を指定すれば、切り替えることができます。次のような手順で新規にクラスを作成することにします。
Diceクラスが次のように作成されます(コメントは除いています)。
public class Dice {
}
次に、このDiceの振る舞いとは何かと考えると、「サイコロを振る」ということを思い付くはずです。この振る舞いに名前を付けてrollと呼ぶことにしましょう。つまり、「サイコロを振る」ということをプログラムで実行したい場合は、Diceのオブジェクトへrollと命令をすれば良いということになります。このrollメソッドでは、1から6の整数のうちどれかがランダムに選ばれて戻り値となるようにプログラムを作成します。サイコロを振るに当たっては特に情報は要りませんので、パラメータは必要ありません。従って、この振る舞いを表現するメソッドの定義は次のようになります。
int roll() { }
次にこのメソッドの本体処理をコーディングします。ランダムに整数を生成するのはちょっと難しいので、ここでは1から6までの整数値のどれかを戻すようにします。複数の値を扱うには配列を使えば良かったですね。フィールドとして戻す値を保持する配列valuesと、この配列での位置を保持するcurrentを用意します。Javaのクラスにおけるフィールドはクラスの属性を表すことを思い出してください。つまり、このクラスはvaluesとcurrentという属性を持つということになります。これらを使ってrollメソッドの処理を次のように実現します。
int[]からint current=0;まではフィールドの宣言になり、残りはrollメソッドのコードになります。メソッドの戻り値はreturnという予約語を使って戻すことができます。ここでは、配列valuesの添え字currentの位置の値を戻しています。このメソッドが初めて呼ばれたときはcurrentの値は1となるのでvalues[1]の値である4が戻ることになります。次にメソッドが呼ばれるとcurrentの値は2となるのでvalues[2]の値である2が戻ることになります。配列の添え字は0から始まることに注意してください。こうしてメソッドが呼ばれていくとcurrentの値は6となります。そのときは0に戻して配列valuesの要素数以上の添え字が使われないようにしています。
この例では配列の値を順に戻しているだけなので、このサイコロは次にどんな値となるかがすぐに推測できてしまうイカサマサイコロとなります。これまで学んだ知識で作ったので仕方がありませんが、一応サイコロであることには変わりありません。ここは妥協して先に進みましょう。
Copyright © ITmedia, Inc. All Rights Reserved.