4-1: クラスとオブジェクトの関係

Javaのプログラムでは、データの多くは「オブジェクト(object)」と して取り扱われます。「オブジェクトとは何か?」 というところから解説していきましょう。


・ 「オブジェクト(object)」の取り扱いは、 オブジェクト指向言語の種類によって多少異なります。 ここでは Javaや C++ などが採用している「型」と「個々のデータ」を 区別して取り扱う考え方を説明します。
クラスはデータの持つべき性質を定義したものです。 たとえば「学生」を表すクラスを設計するとしましょう。 クラスの内部のメンバーとして、 「学年」、「所属学部・学科」、「学籍番号」、「氏名」など 多くの情報が定義されるでしょう。 しかし、 クラスそのものは1人1人の学生の実体に対応しているわけではありません。 クラスの情報そのものだけではなく、 個別の情報を記憶した存在が必要となります。 これらの個々のデータのことを、 クラスとは区別して「オブジェクト」と呼ぶことにしましょう。 (ここで言う「オブジェクト」の代わりに、 「インスタンス(instance)」という用語もしばしば用いられます。 以下の説明では、「オブジェクト」は「インスタンス」と同じ意味で用います。 同様に「クラス」は「クラスの定義」と同じ意味だと考えてください。) クラスとオブジェクトの違いをはっきり意識することは非常に大切です。 工業製品を比喩に用いるならば、クラスは製品の仕様を定めた設計図であり、 オブジェクトが1個1個の製品と言えるでしょう。 一般にプログラム内では、 1つのクラスを元にして複数のオブジェクトが生成され、 利用されるのが普通です。

・ Javaのプログラムの中では、 次のようにクラスは型としてオブジェクトは変数として表現されます。


Color  red, green, blue;

Color はクラスの名称で、どんな種類のデータであるかを表しています。 Color は、その名前のとおり色の情報を表すクラスです。 Colorクラスは JDKのクラスライブラリの java.awtパッケージに実在するクラスで、 以下に紹介するサンプルプログラムの中にもしばしば登場します。 red, green, blue はそれぞれ変数名(クラスのフィールドもしくはローカル変数) で個々のオブジェクトに対応します。 実際の色の情報を記憶するのは、これらのオブジェクトということになります。 (厳密にはJavaの変数はオブジェクトの実体そのものではありませんが、 その詳しい説明は後に回すことにします。)


クラスを元にオブジェクトが生成される

・ Javaのクラス定義の中でオブジェクトがどのように利用されるのか、 非常に単純なクラスのサンプルで見てみましょう。


/** 色の情報を持つクラス */
import java.awt.Color;
public class ColoredObject {

   /** 色の情報を記憶するフィールド */
     private Color color;

   /** 色の情報を取り出すメソッド */
     public Color getColor() {
          return color;
     }

   /** 色の情報を設定するメソッド */
     public void setColor( Color color ) {
          this.color = color;
     }
}

クラスの定義の中で直接宣言されたデータを「クラスのフィールド(field)」 もしくは単に「フィールド」と呼びました。 上の例では Colorクラスのオブジェクトが color という名前で宣言されています。
クラスのフィールドは、 クラス内のすべてのメソッドから共通して利用することができます。 getColor()メソッドは現在記憶しているオブジェクトを返値として返します。
メソッドもしくはさらに内側のブロック内で宣言された変数、 外部からメソッドに渡される引数は、「ローカル変数」と呼ばれます。 setColor()メソッドは外部から引数として与えられた colorのオブジェクトを、 クラスのフィールドに記憶させます。 フィールドとローカル変数の名前が衝突した場合には、 ローカル変数の方が優先されます。 上の例では setColor()メソッド内で、 フィールドのデータを示すため "this.color" という表現を用いています。 "this"は Javaのキーワードの1つで、その「クラス自身」を意味します。
またキーワード this の他に、もう一つ見逃してはならないのが "."(ピリオド) という記号の働きです。 フィールドやメソッドのことを合わせて「メンバー(member)」と呼びます。 Javaではクラスや個々のオブジェクトの内部のメンバーにアクセスするために "." を用います。 これは日本語の "の" という言葉だと思えば直感的に理解しやすいでしょう。
なお、Colorクラスが何の前触れもなく使用されたことを多少「気味悪く」 感じた人もいるかもしれません。 このクラスは色のデータを取り扱うために用いられます。 Colorクラスの定義は、 もちろん JDKのクラスライブラリの java.awtパッケージが提供する Color.java という名前のソースファイルの中に存在します。