そうです! プログラムの何かです!
「オブジェクト・インスタンス・クラス」は、人がコンピュータとお話をするために必要なプログラミング言語たち。
犬語やサメ語が話せないのと同じように、私たちはコンピュータ語もしゃべることはできません。ですが、このような言語を使ってコンピュータとは意思の疎通(?)が図れるわけです。複雑で難しくて本気で嫌になるのですが、頑張れば話ができるようになるのですね。
「動物と話せる」のも魅力的ですが、こちらも相当魅力的です!
プログラミング言語は完璧に理解できていなくても、何となくプログラミングはできてしまうもの。
実際書かれたものによって(参考書や解説書など)、若干の解釈の違いなども見られます。
ですが「オブジェクト・インスタンス・クラス」、3つがどう違うのか、3つはどう関わり合っているのか、そこを始めに押さえておけば、その言葉を使っての説明が少しはわかりやすくなるかと思います。
難しいプログラミングの勉強の、ほんの微々たるお手伝いですが、お役立ていただければ幸いです。
目次
オブジェクトとインスタンスとクラス、どこが違うの?
♦Theme 1-2 料理で覚えるオブジェクト指向 Part.01
[youtube https://www.youtube.com/watch?v=q2pibQmexcs&w=560&h=315]「オブジェクト指向」、聞いたことがありませんか?
これは「オブジェクト」同士、互いに働きかけ合いながらみんなで複雑なシステムや巨大なライブラリ等を作り上げていこう、といった考え方、方法です。
それぞれに個性を持った「オブジェクト」が集まり、一つの大きな世界ができあがるわけです。
その際重要となってくるのが「オブジェクト・インスタンス・クラス」の3つです。
簡単に言いますと、
- 「オブジェクト」とは、目で見たり触ったりできる「もの」、または目で見たり触ったりはできないけれど自分には関わる具体的な「もの」。つまり「もの」すべて。Javaプログラムで言えば、すべて「オブジェクト」でできています。
- 「クラス」とは、同じ特性を持つ「オブジェクト」の集合。「このオブジェクトはこんな集団です」ということを示したものです。「オブジェクト」の具体的な部分をなくし、共通点のみを一般化した言い方(抽象化)とも言えますね。
- 「インスタンス」は、その「クラス」にいる「オブジェクト」たちの具体的な部分を指しています。「オブジェクト」が具体的な要素を得たものを指し「インスタンス」です。
「オブジェクトにクラスを与えるとオブジェクトはインスタンスにもなる」
……呪文です。
では例えばこう言い換えてみましょう。
「よし子ちゃん(オブジェクト)は1年生(クラス)で120㎝、かけっこの速い、おかっぱの女の子、あ! よし子ちゃ~ん(実体を伴った具体的なオブジェクトであるインスタンス:走り去るよし子ちゃんに手を振っているようです)!」
本当はこんなに単純ではないのです。プロの方に怒られそうですが、違いと関係性をとりあえず大まかにわかりやすく言えばこんな感じ、取り敢えず思っていてください。では続いて、それぞれの特徴や詳しい関係などを見ていってみましょう。
オブジェクトとは? クラスとの関係は?
オブジェクトは実は「インスタンス」「クラス」の総称でもあります。先ほどもちらっと書きましたが、「オブジェクト」を直訳すれば「もの・対象・目的」、オブジェクト指向では目で見て触れられる物理的なもの、見たり触れたりはできない、例えば「料理」や「会議」など抽象的なものも、すべて「オブジェクト」として扱われます。
ですが、そのままですと話(プログラミング)が進んでいきません。
「料理」ならただの「料理」という概念、漠然とした抽象的なもの止まりです。
そこで単なる「料理」を「懐石料理屋で食べた値段も味も高級だった料理」にするためにはそのオブジェクトを認識する主体があることが必要となってくるのです。
つまり、「何を目的とした視点から認識された対象」であるか、ということですね。
ここは大事です。
なぜならその対象を「何を視点として見るか」によって、それぞれに違いが出てくるからです。
例えば料理人ならその料理を「味付け」などの視点から見ますが、カメラマンなら「色合いや見栄えのする角度」などが気になるはずです。お客さんなら「味と値段のバランス」ですね。
そのため、自分に関わりのある具体的なものがオブジェクトとされるわけです。
目に見えるもの、花でも人でもいいのですが、単に花、人ではなく「自分の育てている朝顔」であったり「お母さん」などですね。
そして具体的でない一般的な「花・人」これらが「クラス」と呼ばれます。
先ほどの懐石料理でしたら「高いけどでもおいしい、何といっても懐石」などの具体的な部分を切り離した「料理」が「クラス」となります。
クラスとは? インスタンスとの関係はこう!
「クラス」には複数の「オブジェクト」が存在しています。先ほどの「懐石料理」もあれば「居酒屋で食べたホッケ」も「コンビニ弁当」も、みんな同じ「料理クラス」に含まれますね。
「クラス」とは、同じ特性を持つオブジェクトに集合体としての名前を付けたものだからです。「ほっけもコンビニ弁当も『料理』カテゴリ」です、といった感じですね。
しかし、視点を変えればまた違うクラスが生まれます。
今までは「どんな料理か?」に注目した分け方でしたが「どのような調理法で作られたか?」のクラスであれば「焼き物クラス」や「煮物クラス」「揚げ物クラス」と作られるクラスが変わってくるわけです。
そうなればクラスを共有するオブジェクトも自ずと変わってくることがおわかりいただけるかと思います。
「ほっけ」は「焼き物クラス」でOKですが、懐石料理の中には焼き物でない料理もたくさんあります。
このように「オブジェクト」は「クラス」を基に作られているわけです。
そのため「クラス」はよく「設計図」などと呼ばれます。何かしらのオブジェクトを作るための設計図、ですね。
(また「クラス」には抽象概念のままのものをまとめた言葉としての総称的なもの、「メニュー」なら「食べ物屋さんのお品書き」のようなものと、「メニュー」が「チンジャオロース丼」「天津飯」など含まれるオブジェクトを示すものとがあります。
前者を「内包」、後者は「外延」と呼ばれています)
これで○○オブジェクトを作るための手段は一旦整いました。
さて、ここで「インスタンス」です。
次に詳しく書きますが「焼き物」であることを共有している「ほっけ」や「鶏肉のソテー」、これらは「焼き物クラス」の
「オブジェクト」であり、また「インスタンス」でもあるのです。
イヤな感じです。ものすごくややこしくなってきました。
「インスタンス」とは「例」のこと。
「例えば」を表す英語といえば for exampleがまず思い浮かびますが、for instanceも同じ意味を持ちます。
「焼き物クラス」は「焼き物」である「オブジェクト」の集合です。その集合の要素を備えた「オブジェクト」のことを「インスタンス」と呼んでいるのです。
…………………… ?
大丈夫です! 次でちゃんと説明しますので、気を確かに持ってください!
インスタンスとは? オブジェクトとはこんな関係!
ここが一番皆さんの「はてなワールド」な部分かと思います。「△×〇□ー!」と文字で書けない叫びをあげているのはあなただけではありません。大丈夫です。
さてここで一度、今話していることは「プログラミング言語」について、というところまで立ち返ります。
プログラミング言語、つまり「プログラミング」がしたいのです。
「クラス」という設計図もあります。その中にはいくつもの「オブジェクト」も存在しています。
では足りないのは?
そう「実体化」です。このままでは「このプログラムはこんな感じです」で終わってしまうのですね。企画書を書き上げて帰ってしまうようなものです。
「オブジェクト指向」での「オブジェクト」とはいうなれば「そのプログラム上で実現したい概念を文字通りコレ、といって示したものでなく、類似点などを挙げて連想させつつ表現」しているものです。わかりずらいです……
ではまた冒頭の「よし子ちゃん」。
よし子ちゃんは「オブジェクト」です。一年生のカテゴリが先ほどは与えられいたので「一年生クラス」のオブジェクト、よし子。
何となく漠然としています。この世に一年生のよし子ちゃんは、いったい何人いるのでしょう。
そこで「インスタンス」が登場するわけです。
「120㎝でおかっぱ、あと足も速いの! あ、今走ってった女の子だよ!」ここが「インスタンス」。よし子ちゃん要素です。
「よし子ちゃん」の様々な情報が「『オブジェクト』として何となくよし子」だったよし子ちゃんを、実体を伴った「唯一無二のよし子ちゃん」という実在する女の子に生まれ変わらせたのです。
つまり、今までプログラム上にただ存在していただけの数々のデータが実行され、実体を持った「オブジェクト」となった時、それは「インスタンス」と呼ばれる「オブジェクト」に変化するわけです。
何となく漠然としています。この世に一年生のよし子ちゃんは、いったい何人いるのでしょう。
そこで「インスタンス」が登場するわけです。
「120㎝でおかっぱ、あと足も速いの! あ、今走ってった女の子だよ!」ここが「インスタンス」。よし子ちゃん要素です。
「よし子ちゃん」の様々な情報が「『オブジェクト』として何となくよし子」だったよし子ちゃんを、実体を伴った「唯一無二のよし子ちゃん」という実在する女の子に生まれ変わらせたのです。
設計レベルでは「オブジェクト」、実体となったものが「インスタンス」です。
インスタンスには同じものが存在し得ません。
例えば同じ「指輪」というクラスのオブジェクトも、あなたが婚約指輪として買えば「婚約指輪クラス」になるかもしれませんが、それは「指輪」でも「婚約指輪」でもなく「あなたがよし子ちゃんのために買った婚約指輪」というインスタンスを持つオブジェクトになります。
オブジェクトのまま終わらせないためには「よし子ちゃんの婚約指輪」としてあなたが購入する必要がありますね。この行動、プログラミング上で言えば「インスタンスを生成するためのプロセス」を「インスタンス化」といいます。
オブジェクト・インスタンス・クラス、違いや関係をまとめてみましょう!
オブジェクト指向では、様々な手続きを束ねられたデータ間でやり取りしています。「オブジェクト」とはその際の変数であり配列であり関数でもあります。またそれらの対象になるもの、受け取ることのできる実体も「オブジェクト」と呼ばれます。一つのテーマを持つ、データと処理の集合体のようなものです。
なおかつ自分自身に対して働きかける機能も持っています。「自身に対する振る舞い」と表現されます。
プログラムでさえ「オブジェクト」です。
つまり「クラス」も「インスタンス」も大きな括りでは「オブジェクト」で間違いないわけです。
このことを念頭に置き、もう一度「クラス」「インスタンス」の違い、「オブジェクト」に対する働き等を見ていってみます。
クラスはオブジェクトに何をする?
- 同じ特性を持つ「オブジェクト」の名前を表しています。
⇒ オブジェクトの特性の抽象化です(ひまわり、桜、たんぽぽなどが「花クラス」とまとめられるわけです)。 - オブジェクトの振る舞いを定義しています。
⇒ そのオブジェクトを作るための「クラス」には、その「オブジェクト」とはどういったものなのか、が示されています。大きく定義されていれば、その分作成できる「インスタンス(オブジェクト)」の数も簡単に増やすことが可能となります(狭い定義ですと、そこに合わないものに関しては改めて初めから新しいものを作る必要が出てきますね)。 - 設計図の役割を担っています。
⇒ これがないと「オブジェクト」は実体を伴うことができず「インスタンス」が生まれません。
クラスの指令を受けたオブジェクトはどうなる?
- 「オブジェクトの実装」段階に入ります。
⇒ 実体化した「オブジェクト」は「インスタンス(インスタンス・オブジェクト)」と呼ばれるようになります。
★そこが今ひとつわかりずらいんです!
はい、わかりました!
オブジェクトはもともと、自分のインスタンスを作成させるための手続きを持っています。
でも、ただ持っているだけ。
これを実行させようと「クラス」の設計図が活躍するわけですね。ですがやはり「クラス」だけではそれを実行することはできません。
ここで「オブジェクト指向」です。
関数も「オブジェクト」、データも「オブジェクト」。オブジェクト間のお互いのやり取りが「オブジェクト指向」の真骨頂でしたね。「クラス」の定義を基に、プログラム全体はこうして動き始めるのです。
このような流れにより設計図(クラスの定義文書とお考えください)に沿ってインスタンスを作成するための情報や操作がやり取りされ、ただのひな型、テンプレート(もしくはクッキー型、などとよく言われます)だったものに、生きたデータ(こちらはクッキー型に対しクッキーで表現されています)が与えられ(実装され)、データ上に現れるわけです。
これが「インスタンス化」された「オブジェクト」、つまり「インスタンス」となるのです。
ポイントをまとめてみましょう!
オブジェクト・ポイント
(何もかも「オブジェクト」ではありますが、ここでは他2つと比較できる部分を挙げていきます)- 「クラス」に基づいて作られる
⇒ そのため、目的を持った視点で対象を認識する必要があります。 - 自身のインスタンスを作るためのデータや振る舞いを持っている
- 設計段階で使われる用語
⇒ 実装段階では「インスタンス」に。
クラス・ポイント
- 同じ特性を持つ(種類の)オブジェクトをまとめて考える
⇒ オブジェクトの特性を抽象化しています。 - クラスは「型」のようなもの(設計図)
⇒ であればインスタンスは「実体」(製品)
・オブジェクトたちの振る舞いをあらかじめ定義しておく役割を持つ
インスタンス・ポイント
- オブジェクトと同じ意味で使われることも多い
⇒ 「クラス」があって初めて「インスタンス」になります。つまり「クラス」に属している「オブジェクト」が「インスタンス」です。 - 実装レベルで使われる用語
⇒ 設計レベルなら「オブジェクト」です。 - 実際にメモリ上に現れた「オブジェクト」がインスタンスと呼ばれます。
終わりに……
プログラミングの世界は本当に難しいです。その共通言語が英語と数字、もうこの時点で「共通」の文字に違和感を感じてしまうほど。
ですが、法則さえ知れば会話も成り立つ、というのは、考え方を変えれば圧倒的に「サメ語修得」より易しいこと……になるんでしょうか。何とも言えません。
今回ご紹介させていただいたのは、あくまで「違い」に関してのみです。
この違いを知った上で、今後様々な「英語と数字」の洗礼を受けつつ、プログラミング理論を修得していくことになると思います。
頑張ってくださいね!
今後、それほどコンピュータに明るくない人たちにも「コンピュータとの会話」が容易になるようなシステムを開発していただけるよう、期待しております!!!
(なお、よし子ちゃんは完全にフィクションです。もしかしてあのよし子ちゃんのこと? と思われることがあったとしても、それは別人のよし子さんです)
関連記事はこちらになります。
コメント