Java入門の第13回です。前回からの続きです。
前回は newキーワードを使ってクラスからインスタンスを生成しました。今回は、前回作成したコードを少し改変してみます。クラスとインスタンスの扱いに慣れましょう。
前回作成したコード
前回作成したコードをもう一度確認してみましょう。
//Pointクラス class Point { int x; int y; } //Test11クラス public class Test11 { public static void main(String[] args) { //インスタンスを生成 Point zahyo = new Point(); zahyo.x = 4; zahyo.y = 6; System.out.print("座標は("); System.out.print(zahyo.x); System.out.print(","); System.out.print(zahyo.y); System.out.print(")です"); } }
上記コードは、Pointクラスからzahyoインスタンスを生成してインスタンス変数に代入した値を表示させるだけのプログラムです。
代入したものを表示させるだけの当たり前の実行結果ですが、とにかくnewキーワードを使ってクラスからインスタンスを生成できました。
前回作成したコードを改変してみる
前回作成したコードを少し改変してみましょう。
class Point { int x; int y; } public class Test11 { public static void main(String[] args) { //配列zahyosを宣言 Point [] zahyos = new Point[10]; //配列zahyosに値をループで代入 for(int i=0; i<10; i++) { //インスタンスを生成 zahyos[i] = new Point(); //インスタンス変数xに値を代入 zahyos[i].x = (int)(Math.random()*10); //インスタンス変数yに値を代入 zahyos[i].y = (int)(Math.random()*10); } //配列zahyosの値をループで書き出し for(int i=0; i<10; i++) { System.out.print("座標[" + i + "]は("); System.out.print(zahyos[i].x); System.out.print(","); System.out.print(zahyos[i].y); System.out.print(")です"); System.out.println(); } } }
上記コードは、ランダムに10個の座標を作成するプログラムです。前回と同じく代入した値を表示するだけの内容ですが、インスタンスの生成やインスタンス変数への値代入の部分が、配列、乱数、forループなどに交じって登場します。
以下は、上記コードをEclipseで実行した結果画面です。
コンソールには、ランダムに作成した座標10個が表示されています。上記コードについて、簡単に確認しましょう。
//配列zahyosを宣言 Point [] zahyos = new Point[10]; //配列zahyosに値をループで代入 for(int i=0; i<10; i++) { //インスタンスを生成 zahyos[i] = new Point(); //インスタンス変数xに値を代入 zahyos[i].x = (int)(Math.random()*10); //インスタンス変数yに値を代入 zahyos[i].y = (int)(Math.random()*10); }
Point [] zahyos = new Point[10]; の部分は、配列zahyosを宣言しています。Point型の配列zahyosを作成しますと宣言して、newキーワードで10個分のデータの入れ物を確保しています。
forループの中では、zahyos[i] = new Point(); の部分で、ループ回数分のインスタンスを生成してます。forループによりiの値は0~9となるので、 zahyos[0], zahyos[1], zahyos[2], zahyos[3], zahyos[4], zahyos[4], zahyos[5], zahyos[6], zahyos[7], zahyos[8], zahyos[9] という具合に、全部で10個のインスタンスが生成されます。
生成されるインスタンスには、インスタンス変数xとyの値が代入されます。インスタンス変数xとyに代入される値は、乱数によって作成された0~9の数値です。
乱数作成について
乱数作成の部分は、クラスやインスタンスの解説とは直接関係ありませんが、大切な要素が詰まっているのでここで解説しておきます。乱数作成を行っている以下の部分に、あらためて注目してみましょう。
(int)(Math.random()*10)
上記のなかのMath.random()の部分は、「0.0以上1.0未満の実数」を生成する際の決まった書き方です。それをMath.random()*10という式にして10倍にすることで「0.0以上10.0未満の実数」が作成されます。
この Math.random()*10 で作成される「0.0以上10.0未満の実数」を、 (int)(Math.random()*10)という具合に括弧で囲むことでint型にキャストしています。キャストするとは型変換するということですが、int型にキャストすることで発生する乱数を整数に丸めます。
int型にキャストする際の書き方は (int)(キャスト対象となる式) です。 キャスト対象となる式は、全体を括弧で囲んでおく必要があります。(int)(Math.random()*10)ではなく、(int)Math.random()*10と書いた場合、 Math.random()をint型にキャストしたもの(この時点で0となる)を10倍するので、結果がすべて0になってしまいます。
(int)(Math.random()*10) の記述で Math.random()*10 をint型にキャストしているので、「0.0以上10.0未満の実数」の小数点以下が切り捨てられて整数に丸められます。結果として (int)(Math.random()*10) の記述から得られるのは、 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 のいずれかの整数です。
次回へ続きます。