クラスとインスタンス
オブジェクト指向型言語を勉強していると必ず出てくるのが、クラスとインスタンスという言葉です。
まず、この二つの用語について説明していきましょう。IT用語辞典によると、次のように定義されています。
クラス、インスタンス
しかし、解りにくいです。では、オブジェクト指向型言語が生まれたわけを説明しましょう。昔はプログラムの需要が低く、そのためプログラムを一から作り直しても
間に合う時代でした。しかし、時代は変わり、現在にかけて需要がますます高くなりました。すると、今までのように一から作り直すようでは間に合わなくなったのです。
そこで、今まで作ったプログラムを再利用しようとする考え方が生まれました。当然ですね。しかし、昔は再利用を考慮していないプログラムの設計だったので、非常に
修正するのが困難で、なかなか生産性が高まりませんでした。そこで登場したのがオブジェクト指向です。これは、全体のプログラムの中で、役割(role)を分け、その役割ごとに
プログラムを作成することで、非常に分かりやすく、生産性が高まるだろうという考え方です。当然ですよね。その観点から考えると、クラスとは全体のプログラムの中のこの役割
の一単位と考えることもできます。そしてインスタンスは、そのクラスの機能を使うために生み出された実体と考えることもできます。定義については深く考えずに、
これから行うクラスの作り方等をマスターしていただければ結構です。
フィールドとメソッド
クラスとインスタンスの部分で、「クラスの作り方等をマスターしていただければ結構です。」と言いました。では、「クラスはどうやって作るのか?」、です。
まず、クラスは次のようにフィールドとメソッドによって構成されています。

まず、フィールドですが、これはそのクラスの持っている属性を表します。例えば、「銀行の口座」というクラスを作ろうと思えば、銀行の口座には、
預金、預金者名という属性があるので、この属性を変数(フィールド)として定義します。次にメソッドですが、これはクラスのもっている機能を表します。
例えば先程と同じように「銀行の口座」を例にとると、「預金する」、「引き出す」、「残高照会」などの機能があるので、この機能をメソッドとして定義します。
練習問題でもたくさん問題として出しているのでぜひマスターしてください。
インスタンスの生成
さて、いままではクラスにスポットを当ててきました。しかし、クラスだけではプログラムは動きません。なぜなら、クラスはあくまでも「役割」について
記述したものであるからです。実際にクラスの機能を使うには、インスタンスの生成を行う必要があります。インスタンスの生成方法は下のように行います。

なんとなく配列と似ていると思いませんか?似ているのではなくて、そっくりです(ぁ
細かい記述は後に述べるとして、ではインスタンスを作成するとプログラム中でどのようなことが起こるのか?を説明します。仮に次のクラスがあるとします。

そして、下のようにインスタンスを作成したとします。

すると、変数領域のイメージは次のようにイメージされます

ここで仮に、r1のインスタンスの中の、widthを参照したいとする。すると、次のように記述できる。

このように記述する。.の前にはインスタンス名を記述する。.の後にはフィールド名あるいはメソッド名を記述する。
コンストラクタ
今までにクラスを作る方法について記述しました。ここで、「コンストラクタ」について記述します。例えば、インスタンスを作成した際、最初に値を入れたい
あるいは何か処理したいということもあるでしょう。例えば、上記の「銀行口座」の例で言えば、口座が作成された時の預金額は0なので、最初にセット
しておきたいところです。そこで使うのが、この「コンストラクタ」です。コンストラクタの使い方は下の図のとおりです。

この図では、4〜6行目が、「コンストラクタ」にあたります。コンストラクタはメソッドと似ていますが、次のような相違点があります。
・戻り値の型をかかない(voidでもない)
・名前はクラス名(この例で言えばBank)と同じである。
そしてインスタンスを生成する時、右側のnew〜()の中の()の型の組み合わせと、コンストラクタの()内の型の組み合わせは一致していなければいけません。
コンストラクタには、「最初に行っておきたい処理」を記述します。
クラスフィールドについて
次に「クラスフィールド」について説明します。そもそもフィールドとはクラスフィールドとインスタンスフィールドとがあります。両者はstaticがついているか
ついていないかで区別できます。staticのついていないほうがクラスフィールド、ついているほうがインスタンスフィールドです。クラスフィールドはインスタンスが
生成されるたびにフィールドが別個に作られます。しかし、インスタンスフィールドはいくつインスタンスが作られてもこのフィールドに限っては1つしか作られません。
例えば下の図のようなクラスがあるとします。

そして、次のようにインスタンスを生成したとします。

すると次のような変数領域のイメージになります。

このようにstaticの有無でプログラムが変わってしまうので注意してください。
修飾子
修飾子とは、intなどの型の前につくことで特別な働きをするものです。これには、final,staticなどがあります。finalとは、「固定」という意味があります。
finalがついた変数は、値を変更できないということを意味します。プログラム内で値を変更することのない変数の定義などに使われます。
staticとは、上述したように、クラスフィールド(メソッド)と、インスタンスフィールド(メソッド)とを区別するものです。
練習問題
クラスの作り方は次のとおりである。
(例)次の仕様を満たすクラスFoodを作成しなさい。

解答
これに基づいて次の問いに答えなさい。
問1 次の仕様を満たすクラスCardを作成しなさい。
ひとつの数字(int)がある。
ひとつのマーク(String>がある
数字を返すメソッドgetNumber()がある。
マークを返すメソッドgetMark()がある。
問2 次の仕様を満たすクラスAccountを作成しなさい。
ひとつの預金額(int)がある。
ひとつの預金者名(String)がある。
ひとつの口座番号(int)がある。
預金額を返すメソッドgetMoney()がある。
預金者名を返すメソッドgetName()がある。
口座番号を返すメソッドgetNumber()がある。
預金額を増やすメソッドaddMoney(int)がある。
預金額を減らすメソッドdealMoney(int)がある。
インスタンスを生成した時に預金額の初期値を1000にする
問3 問2のクラスのインスタンスを生成する処理を記述しなさい。
問1の解答
問2の解答
問3の解答 Account account = new Account();