こんにちは、uni-browserの財前航介です。
このブログでは、極力ソースコードを書かず、初心者の方にも分かりやすい形でオブジェクト指向の「考え方」をご説明することを目指しています。
先日、「【オブジェクト指向の基本】クラス(class)とは」という記事の中で、「クラス」というものについて説明しました。
本日勉強するのは、「インスタンス」という概念で、よく「クラス」と対比して用いられる言葉です。
実は、この「クラス」と「インスタンス」は、少し紛らわしい概念でもあるのです。
今日は、この2つの言葉の意味の違いも確認しながら、「オブジェクト指向」の最も基本的な用語のひとつである「インスタンス」というものについて学習していきましょう。
少し「オブジェクト指向」の復習

オブジェクト指向とは、プログラムの部品を「もの」にたとえて作っていくような考え方でした。
この、「もの」のことを、「オブジェクト」と呼ぶのでしたね。
そうやってプログラミングの「部品」を作っておくことで、何度も同じプログラムを書かなくてよくなる上に、人間にも直感的に分かりやすくプログラムを作成できるのでした。
「オブジェクト指向」について、もう少し詳しく知りたい方は、「【初心者向け】オブジェクト指向とは」をご参照ください。
「クラス」と「インスタンス」

以前「【オブジェクト指向の基本】クラス(class)とは 」の中で、「クラス」については説明をしましたが、その中で「クラスとは、オブジェクトの設計図だ」ということをお話ししましたね。
「インスタンス」とは、このクラスという「設計図」を元にして作られる、「実体」のことです。
「実体」と言われても、なんだかピンときませんね。
これには、上述のクラスに関する記事でのご説明に用いた、「格闘ゲームのキャラクター」の例に立ち返るのが分かりやすいのではないかと思います。
格闘ゲームのキャラクターの例

そもそも「オブジェクト指向」が必要とされた背景としては、以下のようなダラダラ長ったらしく書かれたソースコードを、もっとわかりやすく、短くしたいという思いがありました。
「Bボタン」を押すと、「キャラクター1」が攻撃!
「→ボタン」を押すと、「キャラクター1」が右へ移動!
「←ボタン」を押すと、「キャラクター1」が左へ移動!
「Aボタン」を押すと、「キャラクター2」がジャンプ!
「Bボタン」を押すと、「キャラクター2」が攻撃!
「←ボタン」を押すと、「キャラクター2」が左へ移動!
「Aボタン」を押すと、「キャラクター3」がジャンプ!
「Bボタン」を押すと、「キャラクター3」が攻撃!
「→ボタン」を押すと、「キャラクター3」が右へ移動!
「←ボタン」を押すと、「キャラクター3」が左へ移動!
上記の長ったらしいソースコードを、スッキリさせるためには、「キャラクターとはどのようなものなのか」という「設計図」を、最初に書いてしまえば良い、というお話でしたね。
・「Aボタン」を押すと、ジャンプする!
・「Bボタン」を押すと、攻撃する!
・「→ボタン」を押すと、右へ移動!
・「←ボタン」を押すと、左へ移動!
キャラクター1は、「キャラクター」である。
キャラクター2は、「キャラクター」である。
キャラクター3は、「キャラクター」である。
最初に「キャラクターはこのようなものである」ということを定義してしまえば、以降のプログラムでは、それを「利用して」ソースコードを書いていくことができます。
このように、「一度書いたプログラムを何度も使う」という、「再利用性の向上」が、「オブジェクト指向」によってもたらされる非常に大きな効用でした。
その「再利用性の向上」の結果として、スッキリしたソースコードになるのですね。
さて、「クラス」と「インスタンス」のお話に戻ると、上記の「キャラクターとは以下のようなものである」という記述が、まさに「クラス」なのでした。
・「Aボタン」を押すと、ジャンプする!
・「Bボタン」を押すと、攻撃する!
・「→ボタン」を押すと、右へ移動!
・「←ボタン」を押すと、左へ移動!
この部分が、「キャラクター」というオブジェクトの「設計図」になっているんですね。
先ほど、「インスタンスとは、設計図を元に生成される、実体である」というお話をしました。
この例で言うところの「実体」とは、具体的な、各キャラクターのことです。
つまり、「キャラクター1」「キャラクター2」「キャラクター3」という3人のキャラクターそれぞれが、「インスタンス」なのです。
この例では、3つのインスタンスを作っているのですね。
なぜ「インスタンス」が必要なの?

なぜ、「インスタンス」などというものを用いる必要があるのでしょうか。
「クラス」のまま、使うのではダメなのでしょうか。
実は、この「クラス」と「インスタンス」が分かれている構造が、「オブジェクト指向」を便利にしている一つの大きな要因なのです。
以前、「クラス」についてご説明をした際に、クラスの「フィールド」というものについてご説明をしました。
この「フィールド」とは各「インスタンス」が持っている「個性」のようなものだと考えてください。
たとえば上述の格闘ゲームの例で言えば、ゲーム内の全てのキャラクターが、みんな同じ強さ、同じ見た目ではつまらないですよね。
その為に、各インスタンス毎に特有の値を持っています。
「攻撃力:50」とか
「スピード:100」とか
「色:緑色」とか
そういった、各キャラクター毎の特有の「フィールド値」を持てるんです。
実は、「オブジェクト指向」以外のプログラムでも、プログラムの「再利用」を行える仕組みはあります。
「関数」と呼ばれるものです。
しかし「オブジェクト指向」に対応していないプログラム言語の「関数」とは、決められた処理を行うための、単純なプログラムの塊にすぎません。
「毎回決められた処理を行う」だけですから、「個々のキャラクター毎の個性を出す」などという話とは、少し縁遠いものですね。
このように、それぞれの「インスタンス」が固有の「フィールド値」を持つことによって、複数のインスタンスに、異なる振る舞いをさせることができます。
そうすることによって、たとえば異なるキャラクター達が登場するようなゲームプログラムも、簡単に実現できるのですね。
実はこれは、ゲームに限ったことではありません。
たとえば業務システムにおける「社員」なんていうものも、「オブジェクト指向」で効率的に扱うことができるでしょう。
社員の給料の計算を行うためのシステムであれば、「社員クラス」を一つ作って起き、「山田部長インスタンス」「藤野係長インスタンス」「新入社員の伊藤さんインスタンス」なんていう風に、インスタンスを生成して、プログラム内で処理をすれば良いのです。
このように、「社員」などの現実世界の「人」や「もの」を、プログラムの中で扱う上でも、「オブジェクト指向」は大変有用です。
銀行のシステムにおける、「口座」なんていうのも、「オブジェクト指向」で扱いやすい概念でしょう。
「口座というものは[口座番号]と、[支店番号]と、[利用者氏名]と、[残高]と、[普通 or 当座]というフィールド値を持っている」ということが、「設計図」である「クラス」に記載されていて、それを元に生成された各インスタンスが、具体的な値を持っているような構造が想像できますね。
「吉岡さんの口座インスタンス」「溝口さんの口座インスタンス」なんていう風にそれぞれの口座が違う値を持てます。
そしてそのどれもが、「口座クラス」という設計図をもとに作られたので、同じように取り扱うことができるのです。
このように、「クラス」と「インスタンス」というものを理解することは、オブジェクト指向を有効に活用する上でとても大事なことです。
まとめ

如何でしたでしょうか。
「オブジェクト指向」の一つのキモとも言うべき、「クラス」と「インスタンス」という概念、理解して頂けたでしょうか。
本日お話ししたのは、以下のような内容でした。
- クラスとは、オブジェクトの設計図
- インスタンスとは、その設計図を基にして生成された「実体」
- 1つのクラスを元に、複数のインスタンスを生成できる
- それぞれのインスタンスが、「個性」とも言うべき、固有の値を持てる
JavaScriptの具体的なソースコードを用いた説明は、以下の記事の中で行っているので、よろしければこちらも読んでみてください。
JavaScriptクラスのインスタンス生成 >>
この記事が、少しでも皆様の学習の助けになれば幸いです。
最後まで読んで下さり、ありがとうございました。
コメント