レコード ( record ) とは、(関連性のある)いくつかのデータをひとまとめにしたものです。 次の図はレコードのイメージを表しています。
レコードの構成要素を フィールド ( field ) とよびます。
以前、データをまとめたものとして配列を取り上げました。 配列とレコードには次のような違いがあります。
int
[]などと規則的に決まりますが、レコード型の名前は個別に決めます。
ここで、レコード型とは、レコードを表すデータ型です。
レコード型は、データ型としての名前、フィールドの名前、およびそれぞれのフィールドのデータ型で定義されます。
上記のイメージの場合は、データ型としての名前をTime, フィールドの名前を
hour
と
minute
, フィールドのデータ型を整数型(
int
型)と定義します。
実は、Javaにはレコードはありません。 しかし、 インスタンス ( instance ) というものがレコードの機能を持っています。 レコードとインスタンスの対応は次の通りです。
一般 | Java |
---|---|
レコード | インスタンス |
フィールド | インスタンス変数 |
レコード型 | クラス |
この授業では、インスタンス、フィールド、およびクラスという用語を用います。
ちなみに、プログラミング言語によっては、レコードのことを構造体とよびます。
レコードとしてのインスタンスを使うには、まず、クラスを定義します。
フィールドのデータ型が整数型(
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行目で、インスタンス x の hour フィールドに9が格納され、6行目で、 minute フィールドに30が格納されます。
インスタンスのフィールドに格納されたデータを取り出すには、式
変数.フィールド
を用います。 この式の値は、「 変数 」に格納されているインスタンスの「 フィールド 」に格納されているデータです。 7行目で、インスタンス x の hour フィールドと minute フィールドからデータを取り出して、出力します。
インスタンスの例として、以前考えた買い物の問題を再び取り上げます。
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$
今後の予定は以下の通りです。
この授業の成績は、レポートの提出が80%, 試験の得点が20%という割合で決まります。 レポートについては、「余力のある人」のための問題にも取り組んでいれば加点します。 逆に、レポートが未提出なら、そのレポートは0点です。
ある小学校で国語と算数の試験が行われました。 太郎君は国語が70点、算数が80点でした。 花子さんは国語が90点、算数が100点でした。 インスタンスを利用して、これらの得点データを格納し、全体の平均点を計算してください。
asiaa1:~/comp2b b08a001$ java ScoreMain 85 asiaa1:~/comp2b b08a001$
Score.javaでは、試験の得点を格納するするために、クラスScoreを定義します。 フィールド japanese には国語の得点を格納し、フィールド arithmetic には算数の得点を格納します。
ScoreMain.javaでは、Scoreクラスの変数 taro と hanako を宣言・生成します。 インスタンス taro には太郎君の得点を格納し、インスタンス hanako には花子さんの得点を格納します。 最後に、すべての得点を合計し、4で割ります。
(今回は余力のある人の問題はありません。)
今日の演習13の答案(Javaプログラム)をメールで提出してください。 差出人は学内のメール・アドレス(b08a001@cis.twcu.ac.jpなど)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(7月22日)を明記してください。