オブジェクトとクラスの違いとは何か?オブジェクト指向開発のキホンを解説!

2023年1月6日

オブジェクト指向開発はプログラム設計をするときの考え方の1つです。
オブジェクト指向でプログラミングをする際は「オブジェクト」を作ります。そして、このオブジェクトを形成するためには「クラス」が必要ですが、プログラミング初心者ではオブジェクトとクラスの違いがわからず、つまずいてしまうことが多々あります。
そこでこのページではプログラミング初心者の方に向けて「オブジェクト指向とは何か?」そして「オブジェクトとクラスの違いとは何か?」を解説していきます。

オブジェクト指向とは何か?

クラスやオブジェクトの話を進める前に「そもそもオブジェクト指向とは何か?」を押さえておきましょう。

日常生活でオブジェクト指向が使われている

このオブジェクト指向もプログラミング初心者にとっては理解しづらい言葉ですが、決して難しいことは言っていません。
なぜなら普段私たちはオブジェクト指向で物事を考えているからです。

たとえば「洗濯をしたい」と考えた場合、「洗濯機に洗濯物を入れて、洗剤を入れて、洗濯機のボタンを押す」という一連の行動をとります。
あるいは「お風呂に入りたい」という場合は、「お風呂に栓をして、自動湯沸かし器のボタンを押す」ことでお風呂の準備をするはずです。

身の回りには様々な家電がありますが、こうしたものがオブジェクトです。

オブジェクト指向ではなかったら

もしオブジェクト指向を使わなかったら、プログラミングはどうなるのでしょうか?
先ほどのお風呂の例であれば「お風呂に栓をして、42℃のお湯を沸かし、そのお湯を160リットル給湯し、給湯し終わったら通知音を出す」というような表現に変わります。

つまり、お風呂の自動湯沸かし器が処理していたことを一つ一つを言葉にしなければなりません。
こうして見ると、オブジェクト指向プログラミングというものが、いかに現実に沿った手法で、理解しやすいものかわかるのではないでしょうか?

クラスとは?

クラスはオブジェクトを作成するための設計図のことで、データと処理内容(メソッド)をまとめて定義したものです。また、クラスには上下関係があり、上位のクラスを「スーパークラス」、下位のクラスを「サブクラス」と呼びます。

基本属性をスーパークラスで定義し、個々の個別属性を、スーパークラスを継承したサブクラスで定義します。

スーパークラスとサブクラスの関係のイメージ画像

例として、スーパークラスで「動物」を定義し、「鳴く」「食べる」などの基本的な特徴を定義します。
サブクラスでは、それぞれ「走り方」や「見た目」などの動物毎の特徴を定義します。こうすることで、動物毎にそれぞれ関数を設け、全ての属性を定義するといった手間を省くことができるようになります。

この上位の機能を引き継いで利用することを「継承」と呼びます。動物の設計図を引き継いで「『ワン』と鳴く犬」や「『キャットフード』を食べる猫」といった動物毎の特徴を引き出します。
上記の動物のスーパークラスの例でいうと「鳴く」や「食べる」といった機能は全ての動物において共通です。

このようにオブジェクト指向では、共通化できる機能を設計図に記録しておき、基本属性を引き継いで様々な動物を作成するといった考え方をします。

継承させておけば特徴となる差分のみを実装すればいいため、コードの再利用による効率化や不具合の減少を実現できる点がメリットとなります。

サブクラス毎の動作を変えることもできる

オブジェクト指向では、同じ指示を行ったとしても、サブクラス毎に動作を変えることができます。
スーパークラスで基礎となる動作の名称のみを指定し、動作の内容をサブクラスで設定することができるためです。

たとえば「動物」といったスーパークラスを作成し、サブクラスで「鳴く」を指示した場合、以下のような動作を行うことができます。

サブクラスで鳴き方を指定のイメージ画像
  • 犬は「ワン」と鳴く
  • 猫は「ニャン」と鳴く
  • ニワトリは「コケコッコー」と鳴く

このように同じ「鳴く」といった動作を指示しても、サブクラス毎に動作を変えられるため、新たなクラスを定義したい場合でも、継承によりサブクラスを追加すればいいため実装を簡単に行えるようになります。これを「ポリモーフィズム」と呼びます。
プログラム上では、複数のクラスで同じ名前の動作(メソッド)を使えるようにしておくことで、どのクラスであっても同じ名前のメソッドを呼び出せば、処理を行う内容が異なっていても同じ目的の動作が行われるようになる形となります。

オブジェクトとは?

クラスとは何かを確認したところで、再度オブジェクトとは何かを考えていきましょう。

オブジェクトは、設計図となるクラスから作成した実体のことです。1つのクラスを元に、複数のオブジェクトを作成することもできます。

動物を例に考えると、設計図であるクラスから作成した「『ワン』と鳴く犬」や「『ニャン』と鳴く猫」といった実物を指します。

オブジェクトを作成する際、クラスで定義してあった「動物の種類」属性に「犬」、「鳴き方」属性に「ワン」と設定することで、クラスから「『ワン』と鳴く犬」のオブジェクトを作成することができる形です。

このように、設計図であるクラスから実際に動作するオブジェクトを作成することを「インスタンス化」と呼びます。

オブジェクト指向の特徴の1つである「カプセル化」

カプセル化のイメージ画像

オブジェクト指向の特徴としてよく挙げられるものに「カプセル化」といった概念があります。

カプセル化では、機能をひとまとまりにし、直接使われない処理を隠して容易に利用できるようにすることを指します。電子レンジを例に考えてみると、ボタンを押したときに電子レンジの中で起こっている仕組みはわかりませんが「ボタンを押すと温めることができる」という動作からの結果を知っていれば、誰でも容易に操作できます。

プログラム上でも同様で、対象物を操作するために必要な情報だけを外部から見えるようにしておき、実際の中の処理をカプセルに包んで隠してしまうことをカプセル化と呼びます。
カプセル化を行うことで、内部にある処理やデータを勝手に改ざん、参照できないようにし、他のプログラムからの干渉が行えないようにすることができます。

カプセル化されたオブジェクトを組み合わせてプログラムを構築することで、オブジェクト内部の仕様変更が外部に予期せぬ影響を及ぼすことや、外部からの予期せぬ干渉でオブジェクトの状態が壊されることを防ぐことができるようになるため、オブジェクト指向開発において重要なアイデアです。

参考

  • Eric Freeman(著)、嶋田健志(監修)、木下哲也(翻訳)『Head First はじめてのプログラミング ―頭とからだで覚えるPythonプログラミング入門』オライリージャパン、2019年。