クラスとインスタンス - その2 -

レコードからクラスへ

表に情報を整理するとき、行はレコードと呼ばれることが多い。レコードはいくつかの項目(フィールド)から成っている。

名前数学国語英語
Taro5090100
Hanako703080
Kenji605070
Aya4010090

各レコードは、名前、数学、国語、英語という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

クラスのインスタンスを配列に格納する

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

クラスのインスタンスを格納している配列をメソッド間でやり取りする

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