オブジェクト指向プログラミング

プログラムを長大な1枚の料理レシピではなく、役割を持ったレゴブロックを組み立てるように作る手法です。

定義 オブジェクト指向プログラミング(OOP: Object-Oriented Programming)とは、データとそれを操作する機能を「オブジェクト(モノ・部品)」としてまとめ、それらを組み立ててプログラムを構築していく開発手法です。

レゴブロックで完成させる街

レンガを1個ずつ順番に積み上げて、巨大な建物を丸ごと建てることを想像してみてください。途中で壁の一部が歪んでしまうと建物全体がグラつき、構造を直すには最初から工事をやり直さなければなりません。

オブジェクト指向プログラミングは、こうした不便を減らすために、プログラムを独立した複数のレゴブロック(オブジェクト)に分けて作る手法です。たとえばカーレースゲームを作るなら、車・コース・天気・メーターパネルをそれぞれ独立した部品として別々に作ります。

各部品は、自分が持つ属性(データ)とできる行動(機能)をひとまとめにして管理します。タイヤのオブジェクトは現在の回転速度を記憶して「回転する」機能を持ち、エンジンのオブジェクトは馬力を記憶して「動力を生み出す」機能を担います。このように、各自の役割を持ったブロックを組み合わせることで、1つの完成したゲームを作り上げるのです。

OOPの部品組み立て概念図 エンジン ハンドル ホイール 組立 完成した車

オブジェクトを支える4つの柱

オブジェクト指向には、設計を助ける4つの重要な原則があります。1つ目はカプセル化で、部品内部の複雑な仕組みをカプセルの殻のように隠し、外側には必要なボタンだけを公開する方法です。リモコンの内部回路を知らなくても、電源ボタンを押すだけでテレビがつくのと同じです。

2つ目は継承です。基本となる車の設計図をもとにスポーツカーやトラックを作れば、タイヤやハンドルといった共通機能をそのまま受け継ぎ、特別な機能だけを新しく追加して作ることができます。これにより、同じコードを何度も書く手間が省けます。

3つ目と4つ目はポリモーフィズム(多態性)と抽象化です。ポリモーフィズムは同じ命令でも相手(オブジェクト)に応じて異なる動作をする性質であり、抽象化は複雑な現実から本質的な特徴だけを抜き出す手法です。これら4つの原則のおかげで、プログラムの一部を修正したり新機能を追加したりすることが格段に楽になります。

もう少し正確に言うと:いつでも万能というわけではありません

かつては、コンピュータにさせたい処理を上から順番に書いていく「手続き型」プログラミングが主流でした。料理本のレシピのように手順が明確な作業では、手続き型のほうが直感的で実行速度も速い場合があります。

一方、オブジェクト指向はプログラムの規模が大きく複雑になるほど真価を発揮します。部品単位で分割して管理するため、複数の開発者で役割分担して開発しやすく、壊れた部品だけを取り外して修理できるからです。ただし、丁寧な設計が必要なため初期の開発コストがかかり、単純なプログラムではかえって構造が無駄に複雑化することもあります。

そのため、現代のソフトウェア開発ではオブジェクト指向と関数型プログラミングの長所を組み合わせて使うケースが増えています。大切なのは手法へのこだわりではなく、変化に柔軟で読みやすいコードを作ることなのです。

🤔 よくある誤解

✕ 誤解

オブジェクト指向プログラミングは、現実世界のあらゆるモノをコンピュータ上にそのまま複製することである。

✓ 事実

現実を丸写しにするのではなく、プログラムの目的に必要な主要な特徴や動作だけを選び出して(抽象化して)定義する手法です。

🧺 日常で出会う場面

1 RPGゲームで、戦士や魔法使いのキャラクターが基本の「キャラクター」設計図を受け継ぎ(継承)、それぞれ固有のスキルを発揮する。
2 スマホ画面のボタンや入力欄、通知ポップアップがそれぞれ独立したUIオブジェクトとして作られ、ユーザーのタップに反応する。
💡 つまり ひとことで

データと機能を「オブジェクト」という部品にまとめて組み立てることで、大規模なプログラムの管理や再利用を容易にする開発手法です。