レコードからクラスへ
表に情報を整理するとき、行はレコードと呼ばれることが多い。レコードはいくつかの項目(フィールド)から成っている。
名前 | 数学 | 国語 | 英語 |
---|---|---|---|
Taro | 50 | 90 | 100 |
Hanako | 70 | 30 | 80 |
Kenji | 60 | 50 | 70 |
Aya | 40 | 100 | 90 |
各レコードは、名前、数学、国語、英語という4項目から成っている。どのレコードも同じ構成、型をもっている。この型をクラスと考えることができる。各レコードはこのクラスのインスタンスである。
今回は、クラスとそのインスタンスをレコードの型と各レコードとみる。上記の表におけるレコードの型はJavaでは次のようなクラスで実現することができる。
package j2.lesson01_2; public class ExamRecord { String name; int math; int japanese; int english; }
インスタンス生成、フィールドへの代入、フィールドの参照
以下のExamRecordActionはこのクラスのインスタンスを生成し、フィールドを埋めて、内容を表示する簡単なプログラムの例である。
package j2.lesson01_2; public class ExamRecordAction { public static void main(String[] args) { ExamRecord p; p = new ExamRecord(); p.name = "Taro"; p.math = 50; p.japanese = 90; p.english = 100; System.out.println(p.name + "の数学の成績 = " + p.math); System.out.println(p.name + "の国語の成績 = " + p.japanese); System.out.println(p.name + "の英語の成績 = " + p.english); } }
出力は以下のようになる。
Taroの数学の成績 = 50 Taroの国語の成績 = 90 Taroの英語の成績 = 100
Quiz
「変数の宣言」、「インスタンスの生成」、「フィールドへの代入」、「フィールドの参照」をキーワードとしてExamRecordActionの動作を説明せよ。
クラスのインスタンスをメソッドの引数や戻り値としてやり取りする
package j2.lesson01_2; public class ExamRecordAction2 { public static void main(String[] args) { ExamRecord p = createExamRecord("Taro", 50, 90, 100); showExamRecord(p); } public static ExamRecord createExamRecord( String name, int math, int japanese, int english){ ExamRecord r = new ExamRecord(); r.name = name; r.math = math; r.japanese = japanese; r.english = english; return r; } public static void showExamRecord(ExamRecord r){ System.out.println(r.name + ", 数学 = " + r.math + ", 国語 = " + r.japanese + ", 英語 = " + r.english + ", 3科目の平均 = " + ((r.math + r.japanese + r.english) / 3.0)); } }
実行結果は以下の通り。
Taro, 数学 = 50, 国語 = 90, 英語 = 100, 3科目の平均 = 80.0
Quiz
- 各メソッドの引数、戻り値、機能を説明せよ。
- 「メソッド呼び出し」、「引数」、「戻り値」、「変数」をキーワードとしてmainメソッドの動作を説明せよ。
クラスのインスタンスを配列に格納する
package j2.lesson01_2; public class ExamRecordAction3 { public static void main(String[] args) { ExamRecord[] rec = new ExamRecord[4]; rec[0] = createExamRecord("Taro", 50, 90, 100); rec[1] = createExamRecord("Hanako", 70, 30, 80); rec[2] = createExamRecord("Kenji", 60, 50, 70); rec[3] = createExamRecord("Aya", 40, 100, 90); for (int i = 0; i < rec.length; i++) { showExamRecord(rec[i]); } } public static ExamRecord createExamRecord(String name, int english, int math, int japanese) { // 省略。ExamRecordAction2 と同じ。 } public static void showExamRecord(ExamRecord r) { // 省略。ExamRecordAction2 と同じ。 } }
Quiz
- 紙と鉛筆を用意せよ。
- 配列変数recにExamRecordクラスのインスタンスが格納されている様子を前回の講義資料を参考にして概念図を描きながら説明せよ。
クラスのインスタンスを格納している配列をメソッド間でやり取りする
package j2.lesson01_2; public class ExamRecordAction4 { public static void main(String[] args) { ExamRecord[] rec = new ExamRecord[4]; rec[0] = createExamRecord("Taro", 50, 90, 100); rec[1] = createExamRecord("Hanako", 70, 30, 80); rec[2] = createExamRecord("Kenji", 60, 50, 70); rec[3] = createExamRecord("Aya", 40, 100, 90); for (int i = 0; i < rec.length; i++) { showExamRecord(rec[i]); } System.out.println("全員の数学の平均点 = " + averageMath(rec)); System.out.println("全員の国語の平均点 = " + averageJapanese(rec)); System.out.println("全員の英語の平均点 = " + averageEnglish(rec)); } public static ExamRecord createExamRecord(String name, int english, int math, int japanese) { // 省略 } public static void showExamRecord(ExamRecord r) { // 省略 } public static double averageMath(ExamRecord[] ra){ int sum = 0; for(int i=0; i<ra.length; i++){ sum += ra[i].math; } return (double)sum / ra.length; } public static double averageJapanese(ExamRecord[] ra){ // 省略 } public static double averageEnglish(ExamRecord[] ra){ // 省略 } }
出力は以下のようになる。
Taro, 数学 = 50, 国語 = 90, 英語 = 100, 3科目の平均 = 80.0 Hanako, 数学 = 70, 国語 = 30, 英語 = 80, 3科目の平均 = 60.0 Kenji, 数学 = 60, 国語 = 50, 英語 = 70, 3科目の平均 = 60.0 Aya, 数学 = 40, 国語 = 100, 英語 = 90, 3科目の平均 = 76.66666666666667 全員の数学の平均点 = 55.0 全員の国語の平均点 = 67.5 全員の英語の平均点 = 85.0
ExamRecord[] rec = new ExamRecord[4];
これを実行した直後の様子は以下の概念図で説明できる。「null」とあるのはオブジェクトのIDが入るべきところだが、この時点では何も参照していないということを意味する。
rec[0] = createExamRecord("Taro", 50, 90, 100);
を続けて実行すると次の図のような状況になる。
rec[3] = createExamRecord("Aya", 40, 100, 90);
ここまで実行するとExamRecordのインスタンスの詳細を省いて以下の図のようになっている。
Quiz
- 「引数」、「戻り値」をキーワードとしてaverageMathメソッドの機能を説明せよ。
- 「メソッド呼び出し」、「引数」、「戻り値」をキーワードとしてmainメソッドの動作を説明せよ。