データと処理をオブジェクトとしてまとめて設計する考え方。
オブジェクト指向とは、関連するデータ(属性)とそれを扱う処理(操作)を「オブジェクト」という1つのまとまりにして設計する考え方です。オブジェクトとは、現実世界の「もの」をプログラム上に表したものと考えると分かりやすいです。
従来は「データ」と「処理」を別々に書いていました。オブジェクト指向では、たとえば「車」というオブジェクトに、色や速度といったデータと、加速する・止まるといった操作を一緒に持たせます。
身近な例で考えると、テレビのリモコンに似ています。内部の電子回路(データ)は隠したまま、利用者はボタン(操作)を押すだけで使えます。上の図解で、データと処理が1つの箱にまとまっている様子を確認してください。
オブジェクト指向を理解するうえで、次の3つの言葉が基本になります。
・クラス:オブジェクトの設計図。どんなデータ(属性)を持ち、どんな処理(操作・メソッド)ができるかを定義します。「たい焼きの型」にあたります
・インスタンス:クラスから実際に作られた実体。型から焼いた1個1個のたい焼きです。1つのクラスからいくつでも作れます
・メッセージ:オブジェクトが別のオブジェクトに処理を依頼するための要求。「加速して」と頼むイメージです
クラスの中の処理(操作)のことをメソッド(=オブジェクトが行う処理を書いた関数のこと)とも呼びます。プログラムは、たくさんのオブジェクトがメッセージをやり取りしながら協力して動く、という形で組み立てられます。
オブジェクト指向で設計すると、プログラムが独立した部品(オブジェクト)の集まりになります。これにより、大きく次のような利点が生まれます。
・再利用しやすい:一度作ったクラスを別のプログラムでもそのまま使い回せます
・保守しやすい:1つのオブジェクトを直しても他に影響が及びにくく、修正範囲が小さく済みます
・分担しやすい:オブジェクトごとに担当を分けて開発でき、大規模開発に向いています
・現実世界に対応づけやすい:「車」「顧客」など現実の「もの」をそのまま設計に写せるため理解しやすいです
身近な例で考えると、レゴブロックのようなものです。1つ1つは独立した部品ですが、組み合わせることで自由に大きな作品を作れます。1個のブロックを取り替えても全体を作り直す必要はありません。これがオブジェクト指向の便利さです。
オブジェクト指向には3つの重要な考え方があります。それぞれを押さえると、「なぜ便利なのか」がより深く理解できます。
・カプセル化(=データを内側に閉じ込めること):オブジェクトの内部のデータを外から直接いじれないようにします。操作(メソッド)を通じてだけ使えるので、「中身を知らなくても使える」状態になります。テレビのリモコンの内部回路は触れなくても、ボタンで操作できるのと同じ仕組みです
・継承(=親クラスの機能を子クラスが引き継ぐこと):「動物」クラスを作っておき、「犬」クラスはそれを引き継いで「吠える」という独自の機能だけ追加できます。共通部分を1か所にまとめられるので、同じ内容を何度も書かなくてよくなります
・多態性(ポリモーフィズム=同じ操作でも種類によって動きが変わること):「鳴け」という同じ命令を送っても、犬は「ワン」、猫は「ニャー」と返します。呼び出す側は種類を気にせず同じ書き方でよく、プログラムがシンプルになります
3つは独立した機能ではなく、組み合わせて使うことで力を発揮します。カプセル化で安全に閉じ込め、継承で共通部分を使い回し、多態性で柔軟に動かす、という流れです。
なぜクラスとインスタンスを分けるのか。答えは「設計を1か所にまとめることで、何個でも簡単に作り出せるようにするため」です。
たとえば、車工場のたとえを考えてみましょう。
・クラス(型)は「設計図と金型を1つ持つ」だけです。修正が必要なら設計図を直すだけで、以後作る車すべてに反映されます
・インスタンス(実体)は「その型から焼いた1台ずつの車」です。色や速度は1台ごとに違う値を持てます
・クラスは「同じ種類のものの共通ルール」、インスタンスは「そのルールを持った具体的な1個」です
プログラムでは、1つのクラスから何個でもインスタンスを作れます。上の図のように、myCar・taxi・busはすべて同じ Car クラスから作られた別々の実体です。色や速度の値は違いますが、「走る」という操作を全員が持っています。