クラスとインスタンス
2007/03/30 (Fri) 22:07:46 JST
クラスの役割
これまでクラスという単語がちらほらと出てきました。これからはますます出てくるようになるので、ここでクラスについて整理しておきます。ただし「クラスとは何か」から始めるのでは禅問答に近いものがありますから、クラスの役割から見ていくことにします。クラスが何に使われるかを次に書き並べてみました。
- ブラウザで見る
- メソッドを定義する
- クラス名を問い合わせる
- オブジェクトを生成してもらう
- クラスに所属するすべてのオブジェクトを問い合わせる
- オブジェクトが使うインスタンス変数の名前・数を問い合わせる
- (オブジェクトが使用する) メソッドをクラスから探す
このことからクラスの主な二つの役割が見えてきます。
- オブジェクトを生成する
- オブジェクトに関する情報を管理する
オブジェクトを生成する
オブジェクトを生成するには、一般的にはクラスに new
メッセージを送ります。例えばSqueakで可変長配列を生成するには、?OrderedCollectionクラスにメッセージnewを送ります。(これまでに使った文字列と配列はSqueakのリテラルなので明示的にnewする必要はありませんが、 String new
, Array new
とすることもできます)
OrderedCollection new
ここでインスタンスのことを「◯◯から発生した、ある『もの』」と説明したことを思い出してください。「ある『もの』」は個々のオブジェクトのことでした。上の例で言えば一つ一つの?OrderedCollectionオブジェクトがこれにあたります。では「◯◯」ですが、これがクラスです。つまり、インスタンスとはクラスが生成した個々のオブジェクトです。
インスタンスと言えば、オブジェクトが持つ変数のことを「インスタンス変数」と言いました。それならわざわざインスタンスなんて小難しい単語を使わずに「オブジェクト変数」と呼べばいいですね。そうしないのは、Squeakではクラスもまた一つのオブジェクトだからです。少々混乱してきたと思いますが、次の図を見てください。
基本的に「クラス・インスタンス」と「オブジェクト」は別の概念です。オブジェクトは「メッセージに反応するもの」であり、クラスとインスタンスは「オブジェクトをめぐる役割」を意味します。クラスは「オブジェクトを生成するもの (オブジェクトとは限らない) 」のことで、インスタンスは「クラスによって生成されたオブジェクト」です。Squeakのイメージに存在するデータはすべてオブジェクトですから、したがって「クラス」も「インスタンス」も「オブジェクト」であると言えます。
ここでは「クラスとオブジェクト」を対の概念のように扱ってきましたが、次のことを指していました。
- クラス
- クラスの役割をするオブジェクト (クラスオブジェクト) 。
- オブジェクト
- 何らかのクラスのインスタンス。?OrderedCollectionオブジェクトなら?OrderedCollectionクラスのインスタンス。
クラスのクラス
ところで、クラスがオブジェクトであるか、誰によってどのように生成されるかは、言語によって異なります。クラスもまたオブジェクトである言語の場合、クラスオブジェクト自身はどのクラスに所属するのでしょうか。これもまた言語によって異なります。クラスがオブジェクトではないデータ型であるとしても、たいして困りません。
クラスもオブジェクトになる言語では、クラスのクラスをメタクラスと言います。非常に話がややこしくなるので、メタクラスについては別の機会に取りあげることにします。
オブジェクトに関する情報を管理する
もう一つのクラスの役割は、オブジェクトに関する情報を管理することです。主な情報は「インスタンス変数の名前・数」と「メソッド」です。例えば?OrderedCollectionクラスをインスペクトして、インスタンス変数 "instanceVariables" を見てみましょう。
右のウィンドウに表示されているのが、?OrderedCollectionクラスのインスタンスが持つインスタンス変数です。?OrderedCollectionクラスのインスタンスをインスペクトして確認してみましょう。
インスタンス変数のウィンドウに、先ほど?OrderedCollectionクラスをインスペクトして確認した名前が並んでいます。プログラム中でオブジェクトの持つインスタンス変数を調べたい場合は、オブジェクトのクラスに問い合わせればいいわけです。次の式を「式を表示」してみましょう。インスタンス変数のリストが表示されるはずです。
OrderedCollection instVarNames
まとめ
- クラスの主な役割は二つある。オブジェクトを生成することと、オブジェクトに関する情報を管理すること。
- オブジェクトを生成するには、クラスに
new
メッセージを送る。 - 「クラス・インスタンス」と「オブジェクト」は別の概念だが、「クラス・インスタンス」も「オブジェクト」だと言える。
- クラスは「インスタンス変数の名前・数」と「メソッド」を知っている。
クラスの定義に続きます。
Inverse Pages: CoreData用語集 クラスの定義 メソッドの定義 Squeakによるオブジェクト指向プログラミング入門