【オブジェクト指向入門】クラス・インスタンスとは?わかりやすく解説

宝箱

こんにちは、ハニ太郎(@82_taro)です♪

今回の記事では、オブジェクト指向の基本となる「クラス」と「インスタンス」について分かりやすく解説していきたいと思います。

  • クラスとは何か?
  • インスタンスとは何か?

記事を読み終わる頃には、以上2点について理解できた状態となっているはずです。

ハニ太郎

最後まで読んでね♪

仮想世界の作り方

オブジェクトを生み出す手順

オブジェクト指向を用いて開発されたプログラムは、動作時に現実世界をマネたそれぞれのオブジェクトが互いに連携して動く仮想世界を形成します。

なお、この時点で何を言っているのか分からない方は先に以下の記事を読んでみてください。

>【初心者向け】オブジェクト指向とは?世界一わかりやすく解説してみた

オブジェクト指向の本質を理解できていることを前提に考えると、プログラマーの仕事は以下の二つと言えます。

  1. 各オブジェクトが負うべき責務を考え、「属性(フィールド)」「操作(メソッド)」の種類と内容を定義する。
  2. 各オブジェクトを仮想世界に生み出し、それらを動かす。

これらから①オブジェクトを定義して、②オブジェクトを生成すればいいと考えるかもしれません。

しかし、基本的には仮想世界の中で動くオブジェクトそのものをプログラマが直接定義することは許されません。

その代わりに「オブジェクトが生み出される際に用いられる、オブジェクトの設計図」であるクラスを定義できます。

そのため厳密には①クラスを定義して②そのクラスに基づいてオブジェクトを生成するが正しいです。

オブジェクトを生み出す手順
  1. クラスを定義
  2. クラスに基づいてオブジェクトを生成

クラスとオブジェクトを分ける理由

なぜクラスを定義してからオブジェクトを生成するという面倒な手順を踏む必要があるのか?

オブジェクトを直接定義できた方がシンプルでラクだとは思いませんか?

わざわざ「クラス定義→オブジェクト生成」という手順を踏むのには理由があります。

オブジェクトを大量に作る必要がある場合がある状況を想像してみてください。

たとえば、100匹の”ハムスター”オブジェクトを生み出す必要がある場合、100匹それぞれに「属性」と「操作」を定義していたらプログラマの作業は膨大なものとなってしまいます。

そこでクラスの登場です。

オブジェクトの設計図であるクラスにあらかじめ「属性」と「操作」を定義しておけば、100匹でも1000匹でも必要な数だけオブジェクトを生み出すことができるのです。

ここで注意していただきたいのは、クラスとオブジェクトは全く違うものであるという点。

プログラム動作時に仮想世界の中で活躍するのはオブジェクトだけでありその生みの親であるクラスが仮想世界で活動することは基本的にありません。

注意
クラスとオブジェクトは全く違うもの。

以上のことを踏まえて。

クラスとオブジェクトを分ける理由
クラスとオブジェクトを分けることで必要な数だけオブジェクトを生成できるため。

クラスとオブジェクトを分ける理由はこのように言えるでしょう。

オブジェクトという用語について

開発現場においてオブジェクトという表現が用いられる場合、「生みの親であるクラスとそこから生まれた実体」を厳密に区別しないことがあります。

とても曖昧でややこしいですよね?

そこで、「生みの親であるクラスから生み出され、仮想世界で活動する実体」を厳密に示すために「インスタンス」という用語を用います。

また、クラスからインスタンスを生成する行為を「インスタンス化」と表現します。

クラスとインスタンスの関係
仮想世界で活動するのは「インスタンス」であり、そのインスタンスを生み出すための設計図が「クラス」である。

プログラムに登場する2種類のクラス

これまでの話を踏まえて、現実世界に登場する人物やモノを「クラス」として定義し「インスタンス」を生成すればいいとわかるでしょう。

しかし、実はもう一つ必要となるクラスが存在。

それは、「指示を出すクラス」です。

インスタンスを生み出す手順を踏み、実体を生成したとします。

それらの実体は「属性」と「操作」を持ち、与えられた指示通りに動きます。

しかし、指示を与えてやらないとプログラムは動きません。

いわゆる指示待ち状態になってしまうのです。

そこで「指示を出すクラス」の登場です。

これはJavaでいうとMainクラスに該当します。

この「指示出しクラス」だけは現実世界の登場人物を模したものではありませんし、インスタンス化して利用するものでもありません。

プログラムの組成に必要なクラス
  1. 指示出しクラス
  2. 現実世界の登場人物を模倣したクラス

オブジェクト指向の思想

前章までで「クラス」と「インスタンス」について理解できたでしょうか?

それらを踏まえ本章では、手続き型プログラミングとの比較を通じて、オブジェクト指向の思想について解説していきたいと思います。

「手続き型プログラミング」とは、プログラマが頭をひねり、コンピューターがどのように動けば良いかという手順を考え、プログラムの先頭から順番に命令として記述していく方法です。

一方でオブジェクト指向で開発する場合は、いきなりコードを書き始めることはしません。

まずプログラムで実現しようとする部分の現実世界を観察します。

その後、現実世界をプログラム上の仮想世界で再現するようにコードを書いていきます。

そのため「クラスを何のために用いるか」という思想が両者では異なるのです。

手続き型プログラミングの場合は何を基準にクラスとするかという明確な思想はありません。

強いて言うなら、「そろそろメソッドが大きくなり過ぎたから分割しよう」、あるいは「この機能のメソッドはこのクラスにまとめておこう」といった開発者の都合や機能単位などでクラスを使用します。

一方で、オブジェクト指向は「現実世界の登場人物単位で分割する」という明確な思想によってクラスが作られます。

言い換えると、オブジェクト指向を意識したプログラム開発とは、「現実世界の人や物、出来事をクラスに置き換えていく」作業に他なりません。

オブジェクト指向の思想
現実に似せて作り、現実に似せて動かす。

おわりに

ハニ太郎

ここまで記事を読んでいただきありがとうございました♪

オブジェクト指向は奥が深く難易度も高いと思いますが、物にできればあなたにとって強力な武器となるはずです。

是非マスターできるよう頑張ってみてください!

クラスとインスタンスについて理解できたらカプセル化という概念の学習をはじめましょう。

>【オブジェクト指向入門】カプセル化とは?わかりやすく解説

あなたがオブジェクト指向をマスターできるよう応援しております(^^)

ハニ太郎

ファイト!!!

コメントを残す