イカサマサイコロを作成しただけでは満足できない読者のために、ランダムな値を戻すようにDiceクラスを改良する方法についても解説します。
ランダムな値を生成するクラスとしてJavaではjava.util.Randomクラスが用意されています。このインスタンスを得るために、new演算子を使います。整数のランダムな値を得るためには「nextInt」メソッドを使います。nextIntメソッドを呼ぶと、「0」から「パラメータで指定した値-1」のランダムな値が戻ってくるので、その値へ1を足して戻します。つまり、nextIntメソッドのパラメータとして6を指定すると、0から5(これは6-1の結果)までのランダムな値が戻ります。これを1から6までのランダムな値にして戻せばよいので、1を加算します。
以上をまとめると、次のようになります。ただし、6がサイコロの目の数の最大値だということが分かるように、「maxNum」というフィールドをint型で宣言して、rのnextIntメソッドへこれを渡しています。こうしておけば、6がどんな意味なのか分かりますし、万が一、気が変わって「この正六面体サイコロを正四面体サイコロにしたい場合は、maxNumの値を6から4へ変更するだけで済む」というメリットがあります。
public class Dice { java.util.Random r = new java.util.Random(); int maxNum = 6; public int roll() { return r.nextInt(maxNum) + 1; } }
イカサマサイコロの実装を書き換えて保存してから、DiceTestを実行してみましょう。このようにすると、毎回実行するたびに結果が変わるはずです。何回か実行して確認しましょう。筆者の環境で実行したところ、次のように1回目の実行、2回目の実行で確かに結果が変わりました。
2 1 4 1 1 2 6
4 3 4 6 3 6 6
今回は、「クラスの振る舞い」と「Javaのメソッド」とについて解説をしました。メソッドの基本は理解できたでしょうか。すでにお気付きの読者も多いと思いますが、これまでの連載できちんとした解説をせずに使っていた「System.out.println()」はメソッドです。Sysytem(正確には、java.lang.System)クラスが持つoutフィールドはjava.io.PrintStream型です。java.io.PrintStreamクラスはprintln()メソッドを持っています。このメソッドを呼び出しているのです。
また、よく使っていた「public static void main(String[] args) { 処理 }」もメソッドです。これは、「Stringの配列をパラメータとして持ち、戻り値がないmainという名のメソッドだ」ということです。このメソッドは特別なもので、Javaのクラスにあるmainメソッドはjavaコマンド(JDKに付属するJavaプログラム実行コマンド)で呼び出せます。
このコマンドを使ったクラスの実行はこれまでしていませんが、実はEclipseではメニューの[実行]→[次を実行]→[Javaアプリケーション]を指定することにより、内部的にjavaコマンドを実行します。ですから、実は知らないうちにこのmainメソッドを使ってクラスの実行をしていたのです。これらのことからも分かるように、Javaのプログラムを作成するに当たって、メソッドは重要な文法事項なのでよく理解しておきましょう。
さて、これでクラスの基本についての解説はおしまいです。これまでの説明で、プリミティブ型だけでなく、配列やクラスといった型を利用できるようになりました。ただし、プリミティブ型とほかの型(配列やクラス)は使い方がちょっと違いました。実は配列、クラスは「参照型」と呼ばれる型でプリミティブ型とはまったく別物です。そこで、次回は参照型について解説します。
今回作ったサンプルのソースコードはこちらからダウンロードできます。
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。
著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。
Copyright © ITmedia, Inc. All Rights Reserved.