クラスの中身をチェックする
ここで作成した「Yokin」クラスは預金を管理するためのクラスです。kingakuというint型のフィールドが1つ、nameという預金の名前を示すString型のフィールドが1つ、そして預金を預けるazukeruメソッド、預金を引き出すhikidasuメソッドが用意されています。
フィールドは、ここにあげたように、普通の変数の宣言文とほぼ同じように記述します。この部分がフィールドです。
int kingaku = 0; String name = "タンス貯金";
ここでは初期値を設定していますが、単にint kingaku;というように記述されることもあります。一般の変数の宣言文と違うのは、メソッドの中ではなく、クラスの中(つまりメソッドの外側)に書く、という点です。
フィールドは、このクラスのインスタンスを作成すると、そのインスタンスがある間は常に値を保持し続けます。そのインスタンスが消えるまで、いつでもフィールドには値が保管され、利用できるようになっているのです。変数は、構文やメソッドを抜けてしまうとそこで消えてしまいますから、この点もだいぶ性質が違います。
続いてメソッドを見てみましょう。メソッドは、azukeruとhikidasuというものが用意されています。これらは、いずれもこんな形で書かれています。
public void azukeru( 引数 ){ ……略…… } public void hikidasu( 引数 ){ ……略…… }
メソッドの定義は、原則として「戻値」「メソッド名」「引数」の3つの要素からなります。これに加え、冒頭に「修飾子」というものがつけられることもあります。ここでのメソッドを見ると、
- public
- void
- azukeru/hikidasu
- int n
nに渡された値を入れておきますよ、という意味。このようなものがメソッドの定義に使われています。メソッドの定義は、次のようにいくつかの要素を記述して行います。
各種修飾子 戻値 メソッド名 ( 引数 ){ …… }
この基本形と、先ほどのメソッドの定義をよく見比べてみると、それぞれの単語の働きがわかってきます。
それぞれのメソッドが行っていることは、単純に引数の値をkingakuに加算減算しているだけです。ただし、hikidasuの場合は、預金額がマイナスになってしまうと変ですので、とりあえずここではゼロ以下になった場合はゼロに戻すようにしておきます。
本当はマイナスになってしまうときはエラー(Javaでは例外と言います)を出すなど、もっと適した対応は考えられますが、今回はそこまで厳密に考えなくともよいでしょう。
Yokinクラスを利用する
とりあえず「クラスの書き方」「メソッドの書き方」「基本的な計算と構文」が既に頭に入っていれば、ここにあげたクラスの働きは大体理解できることと思います。では、これを具体的に利用したプログラムを考えてみましょう。
public class Sample { public static void main(String[] args) { Yokin c1 = new Yokin(); c1.name = "山田銀行"; c1.azukeru(100000); System.out.println(c1.kingaku); } }

これは、前回まで利用したSample.javaを修正したものです。ここでは、new Chokinで新しいChokinインスタンスを作成し、これをc1に設定しています。そして、後はnameで名前を設定し、azukeruメソッドを呼び出して預金を預け、それからkingakuを出力させています。
インスタンスの作成、フィールドやメソッドの呼び出しといったことは、第1回で簡単に説明をしてありますが、実際にクラスを作って利用してみるとその働きがわかってくるはずです。c1.name = "山田銀行";として、Chokinクラスのnameフィールドに値が設定されたり、c1.azukeru(100000);でazukeruメソッドが実行されたりしています。
このようにして、作成したインスタンスのフィールドやメソッドを呼び出し、そのインスタンスを操作して利用していくことになります。「クラスを作ってプログラミングする」というのは、ただクラスができただけでは意味がありません。それを実際に使い、動かしてさまざまな処理を行っていくのです。
Gaika_Yokinクラスを作る
では、ドルやユーロで保管する外貨預金のクラスを作ってみましょう。既に預金のクラスはありますから、これをうまく利用できれば、また一から同じような処理を書かなくても済みます。こういう場合、Javaでは「継承」と呼ばれる機能を利用します。
継承というのは、既にあるクラスをそのまま受け継いで新しいクラスを作成する機能のことです。これは、次のような形でクラスを定義して作ります。
class クラス名 extends 受け継ぐクラス名 { ……略…… }
これで、新しいクラスは、extendsの後に指定したクラスの機能をすべて受け継ぎます。「受け継ぐ」とはどういうことか? つまり、そのクラスに用意されているすべてのフィールドとメソッドがそのまま利用できるようになる、ということです。それらは「既にあるもの」として利用できるのです。
では、実際にやってみましょう。先ほどのYokinクラスを継承して、外貨預金のクラス「Gaika_Yokin」を作ります。
class Gaika_Yokin extends Yokin { String syurui = "ドル"; int rate = 110; public int getByYen(){ return kingaku * rate; } }
ここでは、「extends Chokin」というようにして新たなクラスを定義しています。これで、Chokinクラスの機能をすべてGaika_Yokinクラスで使えるようになります。
このGaika_Yokinクラスでは、新たに預金の種類を示すsyuruiフィールドと、円への換算レートを示すrateフィールドを追加してあります。そして、getByYenというメソッドを用意し、円に換算した金額を得られるようにしました。
public int getByYen(){ …… }
このように定義されているメソッドです。さあ、このメソッドはどういう性質があり、どんな動きをするものか、定義を見ただけで分かるでしょうか。「どこからでも利用可能で、呼び出すときに引数は必要ない。そして実行後、int型の整数を返す」――これが、定義部分が示しているメソッドの特徴です。1つ1つの単語の意味を考えながら、働きを確認しておきましょう。
このgetByYenメソッドでは、kingakuとrateをかけて円換算の金額を計算しています。この「kingaku」というフィールドは、このGaika_Yokinクラスには書いてありません。それでも、extendsしたYokinクラスにあるために、こうして利用できるのです。もちろん、azukeru/hikidasuメソッドも、kingakuフィールドもそのまま利用できます。
Gaika_Yokinを利用する
では、先ほどのYokinクラスと、このGaika_Yokinクラスを使って、通常の預金と外貨預金を用意し、表示させてみましょう。
public class Sample { public static void main(String[] args) { // 預金インスタンスを作る Yokin c1 = new Yokin(); c1.name = "山田銀行"; c1.azukeru(100000); // 外貨預金インスタンスを作る Gaika_Yokin g1 = new Gaika_Yokin(); g1.name = "USA銀行"; g1.syurui = "ドル"; g1.azukeru(10000); g1.rate = 112; // 情報を出力 System.out.println(c1.name + ":" + c1.kingaku + "円"); System.out.println(g1.name + ":" + g1.kingaku + g1.syurui); int total = c1.kingaku + g1.getByYen(); System.out.println("合計:" + total + "円"); } }

Yokinインスタンスを作る部分は、前回と同じです。今回は、それにGaika_Yokinを作成し利用しています。new Gaika_Yokin後、syuruiを設定し、azukeruを呼び出して10000ドルを預金します。そしてレートを112円に設定してからそれぞれの預金額を書き出しています。
このGaika_Yokinでは、金額のkingakuはsyuruiで設定されたお金の単位で預金されます。syuruiがドルなら、azukeru(10000)で1万ドルを預ける、というわけです。が、実際に合計金額を計算するときには、すべて円換算された金額にそろえておく必要があります。そこで、合計を計算するときには、getByYenで円換算の金額を取り出しています。
こんな具合に、クラスにすると1つの値(金額)をさまざまな形(円やドルで取り出す)で利用することもできます。値を変更すれば、もちろんドルの金額も円の金額も変わりますし、レートを変更することで円換算の額を今の状況に合わせることもできます。
