オブジェクト指向における「インスタンス」とは? 【オブジェクト指向の基本】

プログラミング

こんにちは、uni-browserの財前航介です。

このブログでは、極力ソースコードを書かず、初心者の方にも分かりやすい形でオブジェクト指向の「考え方」をご説明することを目指しています。

先日、「【オブジェクト指向の基本】クラス(class)とは」という記事の中で、「クラス」というものについて説明しました。

本日勉強するのは、「インスタンス」という概念で、よく「クラス」と対比して用いられる言葉です。

実は、この「クラス」「インスタンス」は、少し紛らわしい概念でもあるのです。

今日は、この2つの言葉の意味の違いも確認しながら、「オブジェクト指向」の最も基本的な用語のひとつである「インスタンス」というものについて学習していきましょう。

少し「オブジェクト指向」の復習

部品

オブジェクト指向とは、プログラムの部品を「もの」にたとえて作っていくような考え方でした。

この、「もの」のことを、「オブジェクト」と呼ぶのでしたね。

そうやってプログラミングの「部品」を作っておくことで、何度も同じプログラムを書かなくてよくなる上に、人間にも直感的に分かりやすくプログラムを作成できるのでした。

「オブジェクト指向」について、もう少し詳しく知りたい方は、「【初心者向け】オブジェクト指向とは」をご参照ください。

「クラス」と「インスタンス」

一人でクラスに残っている少女

以前「【オブジェクト指向の基本】クラス(class)とは 」の中で、「クラス」については説明をしましたが、その中で「クラスとは、オブジェクトの設計図だ」ということをお話ししましたね。

「インスタンス」とは、このクラスという「設計図」を元にして作られる、「実体」のことです。

「実体」と言われても、なんだかピンときませんね。

これには、上述のクラスに関する記事でのご説明に用いた、「格闘ゲームのキャラクター」の例に立ち返るのが分かりやすいのではないかと思います。

格闘ゲームのキャラクターの例

プログラミングオタク

そもそも「オブジェクト指向」が必要とされた背景としては、以下のようなダラダラ長ったらしく書かれたソースコードを、もっとわかりやすく、短くしたいという思いがありました。

「Aボタン」を押すと、「キャラクター1」がジャンプ!
「Bボタン」を押すと、「キャラクター1」が攻撃!
「→ボタン」を押すと、「キャラクター1」が右へ移動!
「←ボタン」を押すと、「キャラクター1」が左へ移動!

「Aボタン」を押すと、「キャラクター2」がジャンプ!
「Bボタン」を押すと、「キャラクター2」が攻撃!

「→ボタン」を押すと、「キャラクター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クラスのインスタンス生成 >>

この記事が、少しでも皆様の学習の助けになれば幸いです。
最後まで読んで下さり、ありがとうございました。

コメント

タイトルとURLをコピーしました