クラスの振る舞いを表すJavaの“メソッド”とは?:【改訂版】Eclipseではじめるプログラミング(7)(3/3 ページ)
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります
java.util.Randomでサイコロをイカサマじゃなくする
イカサマサイコロを作成しただけでは満足できない読者のために、ランダムな値を戻すように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
実は「System.out.println」「main」もメソッドだったんです
今回は、「クラスの振る舞い」と「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コレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。
- Javaの例外処理で知らないと損する7つのテクニック
- プログラマの宿命! 例外とエラー処理を理解する
- いまさら聞けない「Javadoc」と「アノテーション」入門
- 7ステップで理解するJavaでの列挙型/enum使用法
- 拡張for文の真の実力を知り、反復処理を使いこなせ
- キュー構造をJavaで実装してジェネリック型を理解する
- 強く型付けされているJavaの理解に必修の“型変換”
- あなたの知らない、4つのマニアックなJava文法
- “ネスト”した型で始める軽量Javaプログラミング!?
- Javaは「抽象クラス」で実装を上手に再利用できる
- 再利用性の高いクラス作成に重要な“アクセス制御”
- “コンストラクタ”と初期化、本当に理解できてる?
- 継承やオーバーライドで簡単にクラスを“拡張”しよう
- 「static」でクラス共有の変数・メソッドを使いこなせ!
- Javaの実案件に必須のパッケージとインポートを知る
- プログラムを「変更」しやすくする“インターフェイス”
- Javaの参照型を文字列操作で理解して文法を総復習
- クラスの振る舞いを表すJavaの“メソッド”とは?
- 複雑なデータを表現できるクラスやフィールドって?
- データ集合を扱うのに便利なJavaの配列と拡張for文
- プログラミングの真骨頂! Javaで“反復処理”を覚える
- プログラミングの醍醐味! Javaで“条件式”を理解する
- Javaで一から理解するプログラムの変数と演算子
- Eclipse 3.4で超簡単Javaプログラミング基礎入門
Copyright © ITmedia, Inc. All Rights Reserved.