現金と不動産のクラス
ここまでの流れを見て、「クラスというのはどんな具合に作るのか」が、少しずつわかってきたことと思います。では、更に現金のクラスや不動産のクラスなどを作って、それらを統合管理する「資産クラス」のようなものを作ってみましょう。
とりあえず、現金クラスは、金額があるだけのシンプルなものにしておきます。不動産クラスは、ここでは土地に限定して、坪数と坪単価をフィールドとして持たせて価格を計算するメソッドを用意しておくことにしましょう。
// 預金クラス(作成済み) class Yokin { int kingaku = 0; String name = "なし"; public void azukeru(int n){ kingaku += n; } public void hikidasu(int n){ kingaku -= n; if (kingaku < 0) kingaku = 0; } } // 外貨預金クラス(作成済み) class Gaika_Yokin extends Yokin { String syurui = "ドル"; int rate = 110; public int getByYen(){ return kingaku * rate; } } // 現金のクラス class Genkin { int kingaku = 0; } // 不動産(とりあえず、土地)のクラス class Fudosan { int tsubo_su = 0; int tsubo_tanka = 0; public void kounyu(int hirosa,int tanka){ tsubo_su = hirosa; tsubo_tanka = tanka; } public int getShisanGaku(){ return tsubo_su * tsubo_tanka; } public double getHeibei_su(){ return tsubo_su * 3.3; } }
これで一通りのクラスが揃いました。全部で4つのクラスが定義されたことになります。新たに追加した「Genkin」と「Fudosan」は、それぞれ現金と不動産(ここでは、とりあえず土地に限定)のクラスです。Genkinは、なにしろ現金ですから金額のフィールドだけしかありません。Fudosanについては、坪数と坪単価を保管するフィールドを用意しました。そして、土地を購入するkounyuメソッド、現在の資産額を返すgetShisanGaku、また坪数だと分かりにくい場合もあるので平米数に換算するgetHeibei_suといったメソッドも用意しておきました。それぞれのメソッドがどういうものか、考えてみましょう。
kounyu
public void kounyu(int hirosa,int tanka){ …… }
働き――どこからでも利用でき、呼び出すときにint型の引数を2つ指定する必要がある。また実行後、何も値は返さない。
getShisanGaku
public int getShisanGaku(){ …… }
働き――どこからでも利用でき、呼び出す際には何も引数をつけない。実行後、int型の値を返す。
getHeibei_su
public double getHeibei_su(){ …… }
働き――どこからでも利用でき、呼び出す際には何も引数をつけない。実行後、double型の値を返す。
いかがですか。これらを読んで、すぐに理解できるようになって来ましたか?メソッドの定義を見ただけでこれぐらいが分かれば、だいぶメソッドに慣れてきたといってよいでしょう。
1つ1つのクラスをばらばらに利用する
では、これらのクラスを、1つ1つnewして設定し、内容を計算して表示するというプログラムを作成してみましょう。
public class Sample { public static void main(String[] args) { // 預金の作成 Yokin yokin = new Yokin(); yokin.name = "山田銀行"; yokin.azukeru(1000000); // 外貨預金の作成 Gaika_Yokin gaika = new Gaika_Yokin(); gaika.name = "ヨーロッパ銀行"; gaika.syurui = "ユーロ"; gaika.rate = 160; gaika.azukeru(10000); // 現金の作成 Genkin genkin = new Genkin(); genkin.kingaku = 350000; // 不動産の作成 Fudosan tochi = new Fudosan(); tochi.kounyu(45,100000); // レポート出力 System.out.println("預金:" + yokin.kingaku + "円"); System.out.println(gaika.name + ":" + gaika.kingaku + gaika.syurui); System.out.println("現金:" + genkin.kingaku + "円"); System.out.println("不動産:" + tochi.getShisanGaku() + "円"); int total = yokin.kingaku + gaika.getByYen() + genkin.kingaku + tochi.getShisanGaku(); System.out.println("資産総額:" + total + "円"); } }

既にクラス内のメソッドやフィールドの働きがわかっていれば、ここで行っていることはそれほど難しいものではないでしょう。1つ1つのメソッドやフィールドを確認しながら、何を行っているのか考えてみてください。
一応、さまざまなクラスを作って動かすということはできるようになりました。が、正直いって、これでは「てんでバラバラ」という感じがします。せっかくこれだけクラス類が用意できたんですから、もう少し整理して、簡単に使えるようにしたいものです。
複数のクラスを統合する資産クラスを作る
では、これらのクラスを統合管理する資産クラスを作成しましょう。資産クラスは、作成した1つ1つのクラスをまとめて管理するものです。資産クラスの中にフィールドとして作成した各種のクラスを保持し、必要に応じてそれらに預金を追加したりできるようにします。そして、すべての資産の状況をレポートするメソッドなどを盛り込みましょう。
// 列挙型の定義 enum Shisan_Shurui {YOKIN,GAIKA,GENKIN,TOCHI} // 資産を管理するクラス class Shisan { Yokin yokin; Gaika_Yokin gaika; Genkin genkin; Fudosan tochi; // コンストラクタ public Shisan(){ yokin = new Yokin(); gaika = new Gaika_Yokin(); genkin = new Genkin(); tochi = new Fudosan(); } // 預金をする public void yokin(int n,Shisan_Shurui s){ switch(s){ case YOKIN: yokin.azukeru(n); break; case GAIKA: gaika.azukeru(n); break; default: genkin.kingaku += n; } } // 土地を購入する public void tochi_kounyu(int hirosa,int tanka){ tochi.kounyu(hirosa,tanka); } // 資産を報告する public void printShisan(){ System.out.println("預金:" + yokin.kingaku + "円"); System.out.println(gaika.name + ":" + gaika.kingaku + gaika.syurui); System.out.println("現金:" + genkin.kingaku + "円"); System.out.println("不動産:" + tochi.getShisanGaku() + "円"); int total = yokin.kingaku + gaika.getByYen() + genkin.kingaku + tochi.getShisanGaku(); System.out.println("資産総額:" + total + "円"); } }
列挙型とは?
ここでは、今まで見たことのないものが1つ登場しています。それは「列挙型」と呼ばれるものです。最初にある、この部分です。
enum Shisan_Shurui {YOKIN,GAIKA,GENKIN,TOCHI}
これは、Java 5より新たにサポートされた文法です。これは「いくつかある選択肢の中から値を選ぶ」というために用意された、特別な値です。例えば、ここでは「預金、外貨預金、現金のどれかで預金する」というメソッドを作成しています。が、このとき、これら以外の値が設定されたりすると困ってしまいます。そこで、この「列挙型」というのを用意して、「この中から必ず選んでください」ということができるようにしているのです。
この列挙型は、次のようにして記述します。
enum 名前 { 値1, 値2, …… }
注意したいのは、「値はテキストではない」という点です。例えば、{"A","B"}というようには指定できません。必ず{A,B}というように記述します。こうして記述された列挙型は、名前.値という形で値を指定して利用できるようになります。例えば、ここで作成したShisan_Shuruiというものだと、この中のYOKINという値を使うならば、Shisan_Shurui.YOKINという具合に記述します。
ただし、これはいくつか例外があります。例えば、switch文での記述がそれです。switch文では、メソッドの引数に渡されたShisan_Shurui値を元に分岐を行っていますが、
switch(s){ case YOKIN: ……略……
このように記述されています。caseは、case Shisan_Shurui.YOKIN:ではなく、単にcase YOKIN:なのです。これは、switchの場合、条件にShisan_Shurui型変数を指定しているため、caseにはこのShisan_Shuruiの値を指定するだけでよいのです。
この列挙型は、知らなくてもJavaのプログラミングはできるのですが、覚えておくとけっこう重宝する機能です。とりあえず「こんなものがあるんだ」程度に記憶にとどめておいてください。
