[小西ホームページ]   [目次・索引]   [前の授業]

コンピュータIIB(Javaプログラミング入門)第13回

目次
13.1 レコードとしてのインスタンス
13.1.1 レコードとは
13.1.2 インスタンスの使い方
13.1.3 インスタンスの使用例
13.2 今後の予定
13.3 成績評価について
13.4 演習13
13.5 レポート課題
13.6 試験
13.7 参考文献
索引
インスタンス   フィールド   レコード  

13.1 レコードとしてのインスタンス

13.1.1 レコードとは

レコードrecord ) とは、(関連性のある)いくつかのデータをひとまとめにしたものです。 次の図はレコードのイメージを表しています。

レコードのイメージ
図 13.1  レコードのイメージ

レコードの構成要素を フィールドfield ) とよびます。

以前、データをまとめたものとして配列を取り上げました。 配列とレコードには次のような違いがあります。

ここで、レコード型とは、レコードを表すデータ型です。

レコード型は、データ型としての名前、フィールドの名前、およびそれぞれのフィールドのデータ型で定義されます。 上記のイメージの場合は、データ型としての名前をTime, フィールドの名前を hourminute , フィールドのデータ型を整数型( int 型)と定義します。

実は、Javaにはレコードはありません。 しかし、 インスタンスinstance ) というものがレコードの機能を持っています。 レコードとインスタンスの対応は次の通りです。

表 13.1  レコードとインスタンスの対応
一般 Java
レコード インスタンス
フィールド インスタンス変数
レコード型 クラス

この授業では、インスタンス、フィールド、およびクラスという用語を用います。

ちなみに、プログラミング言語によっては、レコードのことを構造体とよびます。

13.1.2 インスタンスの使い方

レコードとしてのインスタンスを使うには、まず、クラスを定義します。 フィールドのデータ型が整数型( int 型)なら、クラスの定義は次のようになります。

class クラス {
    int フィールド1;
    ...;
    int フィールドn;
}

ここで、「 クラス 」はクラス名、「 フィールド 」はフィールド名です。 上記の例なら、次の通りです。

/*  1*/ class Time { // クラス名
/*  2*/     int hour; // フィールド名
/*  3*/     int minute; // フィールド名
/*  4*/ }

これをファイルTime.javaに保存します。 このファイルがないと、以下のプログラムは動きません。

クラスが定義できたら、プログラムを作成します。 次のプログラムは、変数を宣言し、インスタンスを生成してそこに格納し、インスタンスのフィールドにデータを格納し、その値を表示するものです。

/*  1*/ class TimeTest { // Timeクラスのテスト
/*  2*/     public static void main (String[] args) {
/*  3*/         Time x; // 宣言
/*  4*/         x = new Time(); // 生成
/*  5*/         x.hour = 9; // hourフィールドに格納
/*  6*/         x.minute = 30; // minuteフィールドに格納
/*  7*/         System.out.println(x.hour + ":" + x.minute); // フィールドの値を出力
/*  8*/     }
/*  9*/ }
asiaa1:~/comp2b b08a001$ java TimeTest
9:30
asiaa1:~/comp2b b08a001$

変数に整数( int 型)を格納するには、変数の宣言が必要でした。 変数にインスタンスを格納するにも、同様に変数の宣言が必要です。 これは次のように書きます。

クラス 変数;

今まで int と書いていた部分をクラス名に変えます。 3行目で、変数 x をTimeクラスと宣言します。

クラスのインスタンスは、明示的に生成してはじめて使えます。 インスタンスを生成するには、キーワード new を用います。 「 クラス 」のインスタンスを生成して、「 変数 」に格納するには、

変数 = new クラス();

と書きます。 4行目で、Timeクラスのインスタンスを生成して、変数 x に格納します。

なお、次のように書くと、変数の宣言とインスタンスの生成、そしてその変数への格納が同時に行えます。

クラス 変数 = new クラス();

インスタンスのフィールドにデータを格納するには、次のような文を用います。

変数.フィールド = ;

これで、「 変数 」に格納されているインスタンスの「 フィールド 」に、「 」の値が格納されます。 5行目で、インスタンス xhour フィールドに9が格納され、6行目で、 minute フィールドに30が格納されます。

インスタンスのフィールドに格納されたデータを取り出すには、式

変数.フィールド

を用います。 この式の値は、「 変数 」に格納されているインスタンスの「 フィールド 」に格納されているデータです。 7行目で、インスタンス xhour フィールドと minute フィールドからデータを取り出して、出力します。

13.1.3 インスタンスの使用例

インスタンスの例として、以前考えた買い物の問題を再び取り上げます。

A子は店に行き、150円のペットボトルを1本と120円の缶ジュースを3本買いました。 A子はいくら支払わなければならないでしょうか。

/*  1*/ class SomeDrinks3 { // いくつかの飲み物3
/*  2*/     public static void main (String[] args) {
/*  3*/         int total = 0, pet = 150, can = 120;
/*  4*/         total = total + pet;
/*  5*/         total = total + 3 * can;
/*  6*/         System.out.println(total);
/*  7*/     }
/*  8*/ }

このプログラムでは、値段だけを変数に格納し、個数は変数に格納しませんでした。 インスタンスを利用すれば、値段と個数をまとめて格納できます。

ファイルBuy.javaでは、買った物を格納するために、Buyというクラスを定義します。 price というフィールドには値段を格納し、 count というフィールドには個数を格納します。

/*  1*/ class Buy { // 買った物
/*  2*/     int price; // 値段
/*  3*/     int count; // 個数
/*  4*/ }

ファイルBuyMain.javaでは、Buyクラスの変数 pet を宣言し、Buyクラスのインスタンスを生成して pet に格納します。 変数 can についても同様に宣言・生成します。 インスタンス pet にはペットボトルの値段と個数を格納し、インスタンス can には缶ジュースの値段と個数を格納します。 最後に、合計金額を計算します。

/*  1*/ class BuyMain { // 買った物のメイン
/*  2*/     public static void main (String[] args) {
/*  3*/         int total = 0;
/*  4*/         Buy pet = new Buy(); // 宣言と生成
/*  5*/         Buy can = new Buy(); // 宣言と生成
/*  6*/         pet.price = 150; // ペットボトルの値段は150円
/*  7*/         pet.count = 1; // ペットボトルの個数は1個
/*  8*/         can.price = 120; // 缶ジュースの値段は120円
/*  9*/         can.count = 3; // 缶ジュースの個数は3個
/* 10*/         total += pet.count * pet.price;
/* 11*/         total += can.count * can.price;
/* 12*/         System.out.println(total);
/* 13*/     }
/* 14*/ }
asiaa1:~/comp2b b08a001$ java BuyMain
510
asiaa1:~/comp2b b08a001$

13.2 今後の予定

今後の予定は以下の通りです。

7月31日(日)
この日までに、レポートの提出状況をメールで知らせます。
8月4日(木)
レポートの最終締切日です。 この日以後に提出されたレポートは採点しません。

13.3 成績評価について

この授業の成績は、レポートの提出が80%, 試験の得点が20%という割合で決まります。 レポートについては、「余力のある人」のための問題にも取り組んでいれば加点します。 逆に、レポートが未提出なら、そのレポートは0点です。


13.4 演習13

ある小学校で国語と算数の試験が行われました。 太郎君は国語が70点、算数が80点でした。 花子さんは国語が90点、算数が100点でした。 インスタンスを利用して、これらの得点データを格納し、全体の平均点を計算してください。

asiaa1:~/comp2b b08a001$ java ScoreMain
85
asiaa1:~/comp2b b08a001$

Score.javaでは、試験の得点を格納するするために、クラスScoreを定義します。 フィールド japanese には国語の得点を格納し、フィールド arithmetic には算数の得点を格納します。

ScoreMain.javaでは、Scoreクラスの変数 tarohanako を宣言・生成します。 インスタンス taro には太郎君の得点を格納し、インスタンス hanako には花子さんの得点を格納します。 最後に、すべての得点を合計し、4で割ります。

(今回は余力のある人の問題はありません。)


13.5 レポート課題

今日の演習13の答案(Javaプログラム)をメールで提出してください。 差出人は学内のメール・アドレス(b08a001@cis.twcu.ac.jpなど)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(7月22日)を明記してください。


13.6 試験


13.7 参考文献


[小西ホームページ]   [目次・索引]   [前の授業]

2011年7月22日更新
小西 善二郎 <konishi@cis.twcu.ac.jp>
Copyright (C) 2011 Zenjiro Konishi. All rights reserved.