オブジェクト指向とは?

オブジェクト指向とは、ソフトウェアの開発現場においての開発効率を上げることを目的とした考え方・概念です。具体的にいうと、「ある共通点を持ったモノ」をひとまとまりにし、さらにその「モノ」と「モノ」との関係性を定義していくことでシステムを作り上げるシステム構成の概念を指します。このようにオブジェクト指向に沿った開発をすることで、1つのモノ・部品の独立性が高まり、プログラムの保守や再利用もしやすくなるというわけです。
オブジェクト指向という考え方自体は、ルールとして明確に定められているわけではありません。プログラムを設計するときのベースとなる考え方として覚えておくと良いでしょう。
そもそも、「オブジェクト」とは、直訳すると「モノ」、「対象」という意味ですが、プログラミングにおいてはデータと処理の集まりを意味しています。
例えば、ゲームのシステムを作るうえで、ゲームの登場人物をそれぞれ一つの「モノ」として定義し、一つひとつがどのように動作するかをプログラミングしていきます。
オブジェクト指向を使わない手法もありますが、1から全てを作ろうとすると大変です。
しかし、一度「モノ」を作り、ルール付けをすれば、後で簡単に変更や追加ができるため、オブジェクト指向のプログラミングが主流になっています。
オブジェクト指向は例えるとわかりやすい

具体的なものに例え、オブジェクト指向を理解していきましょう。
オブジェクト指向は、たびたび「車」で例えられます。
「車」でオブジェクト指向を理解しよう
運転免許を持っている人であれば、基本的な車の操作方法を知っていて、だいたいどの車種であっても運転できるでしょう。
しかし、車の免許を持っている人全員が車の動く仕組みを理解しているわけではありません。むしろ、車の構造などに関する知識は持っていない人のほうが多いでしょう。
これはどういうことかというと、車を運転するうえで、車の仕組みや構造の知識は必要ないということです。
つまり、車という「モノ」と、車の操作という「役割」を切り分けられており、これがまさにオブジェクト指向の考え方だと言えます。
オブジェクト指向と手続き型の違い
プログラミングにはいくつかのアプローチがあり、代表的なものには以下のようなものがあります。

「手続き型プログラミング」とは、上から順番にコンピュータが実行すべき命令や手続きを記述していくプログラミングのことです。処理の順番はわかりやすいですが、機能ごとに分けづらいため、大規模なソフトウェア開発にはあまり向いていないといわれています。
車のゲームを例に考えてみましょう。
「プリウスはAボタンを押すと前進し、Bボタンで停止する」といったプログラムを手続き型で記述したとします。ジムニーやアルファード、プリウスなど、どの車種でも同じ挙動をする場合、一つひとつを同じように手続き型プログラミングで記述していっても構いません。
しかし、これが100車種、1000車種と対象の数が多くなるとどうでしょうか。一つひとつプログラムを書いていると作業に膨大な時間がかかってしまいます。また、もし、Bボタンを押したときの動作を「停止する」から「後進する」への仕様変更があった場合、一つずつ書き直す必要が出てきます。
こういった非効率な作業を解消するのが、オブジェクト指向のプログラミングです。オブジェクト指向では、あらかじめ車という「モノ」を、「Aボタンを押すと前進し、Bボタンで停止する」と定義しておきます。すると、ジムニーやアルファード、テスラのプログラムを記述するにも、「車」のプログラムを利用し、デザインや色を変えるだけで済むのです。また、これによって「Bボタンで後進する」という仕様変更があっても「車」のプログラムの書き換えのみで済むのです。
大規模な開発向き
前述したような特徴から、オブジェクト指向は大人数が携わる大規模な開発向きだと言われます。
手続き型プログラミングだと、そのプロジェクトに関わっているエンジニア全員がプログラムの内容をわかっていなければなりませんが、オブジェクト指向であれば、「車のプログラム」を作成したエンジニアがその内容を理解していればいいので、他のエンジニアは「Aボタンで前進し、Bボタンで停止する」ことを知ってさえいれば問題ないのです。
複雑化への対応
オブジェクト指向への理解を深めるため、スマホ用のオセロゲームを例にあげて説明します。これは、ユーザとコンピュータが操作する石や時間を計るタイマーといった付随コンテンツも含めると多くのパーツで構成されています。
手続き型プログラミングで作る場合、これらを一括りにしてコーディングしていきますが、オブジェクト指向では、ゲームを構成するパーツごとに1つの「もの」とみなして開発します。
個々に開発されたパーツは単独でも動作しますが、連携も可能なので、パーツ単体や組み合わせ方よって、より複雑な演出や操作を追加していくこともできるのです。このことからオブジェクト指向という概念は、ゲームの開発以外のプログラミングやプログラミング以外にも応用できる考え方だといえます。
関連用語
ここからは、オブジェクト指向の概念を理解する上で重要な用語を紹介していきます。
オブジェクト
前述のとおり、オブジェクトは「もの」という意味で、プログラミングにおいては、データや処理の集まりを指します。
たとえば、車というオブジェクトは、「メーカー」や「色」などのデータのほか、「前進する」「停止する」などといった処理を含みます。
クラス
クラスは、データと処理をまとめた、オブジェクトを作成するための抽象的な設計図のようなものです。
自動車を例に考えてみると、自動車を作る元となる設計図にあたります。
インスタンス
抽象的な設計図であるクラスから生成した実体のことです。
たとえば「車」というクラスをもとに「トラック」や「パトカー」などのさまざまな種類の車を作るとすると「トラック」や「パトカー」がインスタンスに該当します。
プロパティ
プロパティは、オブジェクトが持つ性質や属性のことを指します。
自動車を例に例えてみると、メーカーや色、ガソリン量や走行距離などにあたります。
メソッド
オブジェクトが持っている処理を指します。
自動車を例に考えてみると、「前進する」や「止まる」といったものにあたります。
オブジェクト指向の三原則

継承
共通した性質を持つプログラムをまとめることでコードを再利用しやすくする仕組みです。同じようなオブジェクトを複数作る際、それぞれを別々に開発することなく一度作ったものを使いまわすことで、時間をかけずに同じ機能を実装できます。たとえば、ゲームを作成した際、「車」に「トラック」も追加する場合、基本操作は同じであるため、追加も簡単にできます。
カプセル化
要素同士が干渉しあわないという考え方をカプセル化(=抽象化)と言います。プログラムの追記や変更の際などに、ほかのプログラムに影響が出ないようにするのもその一つです。また、クラスをもとに開発された「モノ」自体は複雑な仕組みで成り立っていますが、その詳細までを開発に関わる全員が理解するのは困難であるため、機能をひとまとまりにし、直接使わない箇所を隠すことで簡単に使えるようにするのもこの考えに基づいています。
前述のとおり、車の内部には複雑な仕組みがありますが、その仕組みを理解していなくとも、「アクセルを踏めば進む」という使い方さえ知っておけば、誰でも簡単に車を動かすことができます。
ポリモーフィズム
ポリモーフィズムとは、全く同じものでなくても共通する要素を見つけて汎用的に利用できるようにする考え方です。複数のいろんな種類の対象物に対して同じメッセージを送れば、同じ目的の挙動が行われるようにすることを指します。どの種類の車であっても「アクセルを踏む」と「前進する」ということを決めておくことで、使う側は同一のルールでさまざまな種類の車を操作することができるようになるというわけです。
オブジェクト指向のメリット
プログラミングの全体像を把握しやすい
要素ごとに分けれたプログラムは視認性も高く、把握・管理がしやすいです。プログラム全体の構造を明確に把握してプログラムを設計できるため、開発の全体像も掴みやすく、全体から細部を練っていくという企画の進め方ができます。また、大規模開発でも分業がしやすいです。
エンジニア同士で情報を共有しやすい
オブジェクト指向での開発では、多くのパーツで構成されるものでも細部まで作業者が理解しながら作業を進められるため、作業者同士で認識の共有をしやすくなり、スムーズな作業につながります。
再利用しやすい
オブジェクト指向で開発された製品やクラスは、再利用しやすく、新しく同じような仕組みの製品を作る場合、開発作業の効率化が図れます。
保守性が高い
プログラムの可読性が高いので、エラーが発生した場合でも問題個所も発見しやすく、要素ごとの影響範囲を把握しやすいなど、メンテナンスしやすいです。
オブジェクト指向のデメリット
設計に時間がかかる
オブジェクト指向プログラミングはしっかりと設計されてはじめて実力を発揮します。逆に言えば、この一番重要な設計に問題があると、オブジェクト指向を用いる本来のメリットを享受できないばかりか、新たな問題が生じる場合もあります。抜け目がないよう設計するのが重要です。
知識やスキルが求められる
オブジェクト指向プログラミングを行うにはそれだけ知識やスキルが求められます。
オブジェクト指向のプログラミング言語

オブジェクト指向の歴史は長く、今ではほとんどすべての言語が対応しているオブジェクト指向ですが、なかでも代表的なオブジェクト指向言語を紹介します。
Java
オブジェクト指向言語の代表格で、プラットフォーム開発など幅広く使われています。
特にデスクトップアプリ、Androidアプリの開発で多く使われている言語です。オブジェクト指向であるため、高い汎用性や柔軟性があります。
PHP
PHPは、Webアプリ分野で活躍している言語で、文法が比較的簡単で、初心者でも習得しやすいのが特徴です。オブジェクト指向により、大人数での大規模開発にも適しています。
JavaScript
Webアプリ分野のフロントエンドで活躍している言語で、Webサービスを開発には必要不可欠です。
フロントエンド
サイトの表側のことで、レイアウトや表示後の処理を指します。
Python
プログラミング初心者から上級者まで広く使われている言語です。
シンプルで覚えることが少ない構文で、1行で多くの処理を記述でき、Webアプリやゲームの開発だけでなくAI開発などにも使用されています。
C++
C++は、C言語をオブジェクト指向で書けるようにした言語で、スマホアプリやゲームの開発など、商用のプログラミング言語として重宝されています。
Swift
iOSアプリ開発で使われる言語で、文法が比較的簡単であるため、初心者でも扱いやすいのが特徴です。
従来はiOS分野の開発にはObjective-Cの使用が主流でしたが、習得難易度や処理速度という点で優れているSwiftが次第に主流になっていきました。
Ruby
日本人によって開発されたプログラミング言語で、コードの量も少ないので初心者にも扱いやすい言語です。主にWEBアプリの開発に使用されます。
終わりに
ここまで、オブジェクト指向について、その考え方やメリットについて解説してきましたがいかがでしたか?
オブジェクト指向は特に大規模な開発では活用するメリットが大きく、今ではプログラミングを用いる開発現場において、欠かせない存在になっています。本記事を通してオブジェクト指向に興味を持った方は、ぜひ勉強してみてください。
【おまけ】オブジェクト指向の実装具体例
以下の記事では、実際にプログラミング言語(PHP)を用いてオブジェクト指向について具体的に解説しています。
オブジェクト指向|エンジニアが具体的なコードで分かりやすく解説