2021年1月7日木曜日

オブジェクト,クラス,インスタンスの関係

オブジェクト指向の用語はなかなか難しい.オブジェクトとインスタンスの違い,オブジェクトとクラスの関係がよく分からない,という議論が生じたので,ここで整理しておこう.

そもそも「オブジェクト」という言葉は抽象的な概念ではあるが,メモリ上にある何らかのデータのことと考えるのがいちばんしっくりくる.オブジェクト指向言語の場合は,そこに何らかのメソッドが紐付けられていることになる(Cで実装するなら,関数ポインタのテーブルが組み込まれてると考えると,イメージしやすいかな?)

クラスとインスタンスについては,「たい焼きの型がクラスで,そこから生産されるたい焼きがインスタンスだ」と説明できる.ひとつひとつの実体のことはオブジェクトと呼んでもよくて,クラスとの関係性で語るときには「インスタンス」という言葉を使う,という感じか.クラスオブジェクトなる概念が少し話をややこしくしている.この例でいえばクラスオブジェクト的なものは「たい焼きの型そのもの」のことだろう.

クラスを表すオブジェクト

「クラスオブジェクト」的なモノは何かについては,Rubyでの説明が分かりやすいのではないだろうか.

まず,Hogeというクラスを定義している.Hogeは new されて生成され,変数 fugaに代入される(というか,たぶんメモリ上のどこかに生成されて,そこへの参照が代入されている)モノが「オブジェクト」に相当する(Hogeのインスタンスとも表現できる).

fugaのクラスは何か?と問えば(fuga.class),Hogeである.Rubyは全てのモノが「オブジェクト」だから,その指しているものもオブジェクトなので,これがクラスのオブジェクトということになるわけだ.

Hogeのクラスは何か?と問えば(fuga.class.class),Classだそうな.すなわち,クラスオブジェクトのクラスはClassなんだって.そしてその親クラスはObjectだとのこと.

オブジェクト,キタ━━━━(゚∀゚)━━━━!!

実はその実体は何かといえば,クラスを表すオブジェクトも,メモリ上に確保されているデータである.繰り返しになるが,クラスとインスタンスは,雛形と実体と捉えればオーケー.オブジェクトはメモリ上の何か,と捉えれば,すっきり理解できるはず.

追記:

当初,クラスオブジェクトについて「ショウケースに飾ってある鯛焼きの食品サンプル?のこと.ちょっと違うかなあ.」と記述していたが,たい焼きの型そのものがオブジェクトであるという指摘を頂いた.たしかにそのとおり,というわけで,本文を修正した.

表現が難しいのは,クラスという「概念」はオブジェクトではないということだ.したがって,「クラス = オブジェクト」という表現は,受け入れがたい.クラスを表現するデータをオブジェクトと呼ぶということと,概念をオブジェクトと呼ぶということの区別,そこは重要なポイントであろう.

0 件のコメント:

コメントを投稿