「オブジェクト指向」はシステム開発における重要かつ基本的な考え方・アプローチ法です。JavaやPython、PHP、Ruby、VBAなどをはじめとするプログラミング言語の多くもこの考え方を取り入れた「オブジェクト指向言語」です。正しく理解しておけばプログラミング学習や開発の効率を高められる「オブジェクト指向」ですが、その過程で「クラス」や「インスタンス」など、聞き慣れない単語も出てきて、難しく感じてしまう人も少なくないでしょう。そこで本記事では、オブジェクト指向についてより理解しやすいよう、例えを交えて解説していきます。
<読めばわかること>
オブジェクト指向とはなにか
オブジェクト指向を学ぶ上で知っておくべき4つのキーワード
オブジェクト指向を学ぶメリット
オブジェクト指向とは
オブジェクト指向とは、「処理を部品化し、それらを組み合わせることで1つのプログラムを構築していくやり方」のことです。部品化することで共通の処理を再利用・転用して開発作業を効率化できる上に、プログラムを管理しやすくなるので、複雑な処理を行うプログラムの構築も容易に行えます。
プログラミング用語で説明すると、「属性(データ)」と「メソッド(指示に対する振る舞い)」をひとまとまりの処理として定義した「オブジェクト」をその定義ごとに「クラス」に分類し、そのクラス同士を組み合わせてシステムを組み立てていきます。
システム設計やコーディングを効率的に行うために作られた概念で多くのプログラミング言語に取り入れられています。なお、オブジェクト指向にもとづいてプログラムを組むことを「オブジェクト指向プログラミング」といいます。
オブジェクト指向を理解するには、「オブジェクト」「クラス」「インスタンス」それぞれについて、しっかり理解する必要があります。
オブジェクトとは?
まず、「オブジェクト」についてですが、属性(データ)とメソッド(手続き)という2つの要素を持ったすべてのモノをオブジェクトとみなします。これら2つを一体化させ、1つのオブジェクトとして定義します。
属性とは「オブジェクトを構成するデータ」
属性とは、そのオブジェクトにどんな特徴があるかという情報を表したデータです。プロパティともいいます。車で言うと車体の色や座席数などです。
プロパティとは、不用意にデータが編集されないよう、一部のデータのみを編集可能な状態にする機能です。プロパティの機能によってカプセル化されたオブジェクトが持つデータに対して部分的なアクセスを許可できるようになりです。
メソッドとは「指示に対する振る舞い」
メソッドとは、データに対する処理内容を記述したプログラムで、何かしらの指示があった時にどう動くかといった動作・ふるまいを指します。車で言うと「アクセルを踏む」といった指示に対する「前進する」といったふるまいを指します。
メソッドとは、クラス内で定義された関数のことで、クラスを通じて呼び出されます。
オブジェクト指向は、システムとして捉えられるものをすべて「オブジェクト」とします。私たちの世界を一つのシステムだとすると、人間や犬、猫はもちろん、生物といった抽象的なものや実体のない、天気や温度などもオブジェクトとなります。
オブジェクト指向は考え方でありイメージが付きにくいので「自動車」に例えてみます。
この共通機能をもとに各自動車を作っていくことをイメージすればわかりやすいでしょう。
各自動車に必要な共通の機能は、それをもとに作成し、各自動車に独自で備える機能は個別で実装する作り方です。これをプログラムに落とし込んだものが「オブジェクト指向プログラミング」です。
クラスとは?
オブジェクト指向には「オブジェクトのもつ性質ごとに定義・分類する」という特徴があり、その分類を「クラス」といいます。
オブジェクトの性質(どんな特徴があってどんな動きをするか)ごとに定義してクラス分けし、クラス同士の関係性を定義することで、上位のクラスには共通の性質が、下位のクラスはそのクラスに独自の性質が加わる形になります。
このようにクラス分けをすることで、全体におけるそのオブジェクトの位置づけが明確になり、ほかのオブジェクトとはどの性質が共通していてどの点で異なっているのかはっきりします。
インスタンスとは?
インスタンスは、クラスというモデルを基に作られた実体を指します。わかりやすく言うと、クラスが設計図の役割をし、インスタンスはそのモデルとなったクラスの性質をもちます。
実体であるインスタンスもオブジェクトですし、実体のない定義・概念といったクラスもオブジェクトなのです。
オブジェクト指向の目的
まず、「オブジェクト」というふわっとした概念が理解できたところで、次に、オブジェクト指向を理解するための前段階として、このようなオブジェクトに注目したシステムづくりが何のために用いられるのかについて説明します。
オブジェクト指向という概念をとらえるのは難しいですが、実は決して難しいことは言っていません。それに、私たちが日々している仕事もオブジェクト指向と通ずる部分があります。
ここで、オブジェクト指向をある出版社の仕事で例えてみましょう。編集者は小説の企画・編集・進行管理を行い、校閲部で文章のチェックをし、イラストレーターがデザインし、印刷所で製本し、営業部は多くの書店に足を運んで販促します。
このように、社員ごとに仕事の仕方や役割が違いますが、どの社員も同じ「本を読者に届ける」という目的をもって働いています。このように、各工程を分担して長けた人・専門の人が行うことで、成果物のクオリティも高くなるし、早く終わりますよね。
各オブジェクトにもそれぞれに役割が割り当てられていて、その役割を果たすために必要となるデータと仕事の処理に必要なアルゴリズムや手順を含んでいます。そして、処理単位ごとに分担して適切な処理を担当のオブジェクトが行うことで、効率を上げ、より膨大で複雑なシステムづくりが可能になっているのです。
このようにオブジェクト指向は、開発効率を上げることを目的として提唱された考え方・概念で、システム開発現場では、オブジェクト指向のプログラミングが主流になっています。オブジェクト指向自体は、ルールとして明確に定められているわけではありませんが、プログラムを設計するときのベースとなる考え方として覚えておくと良いでしょう。
オブジェクト指向の4大要素は?
オブジェクト指向には基本となる4つの考え方があります。順番に見ていきましょう。
カプセル化
プログラム内では、オブジェクト同士で情報の交換や書き換えが起こります。しかし、書き換えられたくない部分もありますよね。こうした事態を避けるため、膜で覆うことでほかのオブジェクトと干渉しあわないようにすることを「カプセル化」といいます。カプセル化することでデータにアクセスされ、勝手に書き換えられるのを防げます。
まさに、カプセルで薬を覆って外界から保護する医療用カプセルのようなもので、システム開発においては、その膜の役割をクラスで実現します。
カプセル化することでほかのオブジェクトからの干渉を受けずに済むだけでなく、オブジェクトの範囲が明確になり、管理しやすくなります。
抽象化
複雑な内部構造や原理を隠して、出す部分を限定することで内部を知らないユーザでも利用しやすくするという仕組みを「抽象化」といいます。
運転免許を持っている人であれば、基本的な車の操作方法を知っていて、だいたいどの車種であっても運転できるでしょう。
しかし、車の免許を持っている人全員が車の動く仕組みを理解しているわけではありません。むしろ、車の構造などに関する知識は持っていない人のほうが多いでしょう。これはどういうことかというと、車を運転するうえで、車の仕組みや構造の知識は必要ないということです。
このように車の内部には複雑な仕組みがありますが、車の「仕組み」と車の「操作」を切り分けることで、仕組みを理解していなくとも、「アクセルを踏めば進む」という使い方さえ知っておけば、誰でも簡単に車を動かすことができます。内部を見えないよう覆ってしまうという点で見ると、広義ではカプセル化ですね。
これは開発に携わる人数や開発するシステムの規模が大きい、大規模開発にも適した考えです。
継承
先ほど、上位のクラスには共通の性質が、下位のクラスはそこに独自の性質が加わると説明しましたが、オブジェクトが抽象化、または具体化する過程で定義される性質があります。
上図の「犬」は「生物」という性質を有する「哺乳類」という性質をもつように、下位のクラスは上位のクラスの性質を受け継ぐ、つまり、継承していますよね。
このように、既存のオブジェクトのコードを再利用して新しいオブジェクトを生成することを「継承」といいます。
継承とは、既存のクラスの機能をもとに新しいクラスを作ることを指します。既存のクラスから変数やメソッド(関数)を引き継げるので新しくコードを書くのを省けます。
親にあたる共通部分のクラスを「親クラス」「スーパークラス」、それを利用(継承)したクラスを「子クラス」「サブクラス」といいます。サブクラスは、スーパークラスを宣言することで、スーパークラスで定義されている属性やメソッドを定義したことになります。
クラス階層を作ることのメリットは、そのクラスにそのオブジェクト固有の特徴のみを記述すればく、ほかのクラスと共通した性質の記述を省けることです。これにより、まず、定義済みのクラスを流用してそこに属性やメソッドを追加することで簡単に新たなクラスを作れます。一度作ったコードを再利用できると開発効率も上がりますね。
また、スーパークラスを宣言するだけでいいため、コード量が減ることで視認性も高まります。開発が進むと、どうしても重複するコードも増え、コード量も膨大になってしまい、読むのだけで時間かかり、特定の箇所を見つけるのも難しくなってしまいます。その点、継承という仕組みを利用することでコードの冗長性を軽減でき、メンテナンスもしやすくなるのです。
ポリモーフィズム
同じ指示(メソッド)に対して、指示を受けた側のクラスによって異なるふるまいをすることを「ポリモーフィズム(多様性)」といいます。
ポリモーフィズムとは、同じ名前の機能でオブジェクトによって違うふるまいをする処理を実装することです。
ポリモーフィズムは「オーバーライド」と「オーバーロード」の2つの機能で実装できます。
オーバーライド:継承で引き継いだメソッドを名前を変えずに別の処理として上書きする機能
オーバーロード:同名の関数(メソッド)を引数の型や数に応じてそ個々に定義できる機能
継承したクラスのコードの一部を変更して別のクラスを定義する際に、継承元のメソッドをサブクラスで再定義して上書きすることを「オーバーライド」といい、オーバーライドすることでポリモーフィズムを表現できます。
※似た用語に「オーバーロード」がありますが、これは同名のメソッドを、引数の型や数に応じて個々に定義する(複数定義する)機能です。
異なるクラス間の類似したメソッドを共通化することによって、その共通化したメソッドを呼び出すだけで済みます。
ここまで説明してきたオブジェクト指向の4大要素は、オブジェクト指向の手段であって目的ではないということに注意が必要です。保守性や汎用性、拡張性などを確立することを目的としており、これによってオブジェクト指向の目的である設計開発・メンテナンスの効率化につながります。
オブジェクト指向と手続き型の違いは?
プログラミングにはいくつかのアプローチがあり、代表的なものには以下のようなものがあります。
手続き型プログラミング | プログラムの処理が順番に記述され、上から順に動作する C言語など |
関数型プログラミング | 数学の関数のようにデータに処理を加えて結果を取得する方法 |
オブジェクト指向プログラミング | 「モノ」と「モノ同士の関係性」を定義して組み立てる手法 |
マルチパラダイム | いくつかのアプローチが組み合わさった方法 Pythonはオブジェクト指向以外にも複数の考え方を組み合わせている。 |
「手続き型プログラミング」とは、上から順番にコンピュータが実行すべき命令や手続きを記述していくプログラミングのことです。処理の順番はわかりやすいですが、機能ごとに分けづらいため、大規模なソフトウェア開発にはあまり向いていないといわれています。
車のゲームを例に考えてみましょう。
「車はAボタンを押すと前進し、Bボタンで停止する」といったプログラムを手続き型で記述したとします。どの車種でも同じ挙動をする場合、一つひとつ手続き型プログラミングで記述していっても構いません。
しかし、これが100車種、1000車種と対象の数が多くなるとどうでしょうか。一つひとつプログラムを1から書いていると作業に膨大な時間がかかってしまいます。また、もし、Bボタンを押したときの動作を「停止する」から「後進する」への仕様変更があった場合、一つずつ書き直す必要が出てきます。
こういった非効率な作業を解消するのが、オブジェクト指向のプログラミングです。オブジェクト指向では、あらかじめ車という「モノ」を、「Aボタンを押すと前進し、Bボタンで停止する」と定義しておきます。すると、インスタンスを作成する場合も、「車」のプログラムを利用し、デザインや色を設定するだけで済むのです。また、これによって「Bボタンで後進する」という仕様変更があっても「車」のプログラムの書き換えのみで済みます。
大規模な開発向き
前述した点から、オブジェクト指向は大人数が携わる大規模な開発向きだと言われます。
手続き型プログラミングだと、そのプロジェクトに関わっているエンジニア全員がプログラムの内容をわかっていなければなりませんが、オブジェクト指向の場合「車のプログラム」を作成したエンジニアがその内容を理解していればいいので、他のエンジニアは「Aボタンで前進し、Bボタンで停止する」ことを知ってさえいれば問題ないのです。
複雑化への対応
手続き型プログラミングで作る場合、これらを一括りにしてコーディングしていきますが、オブジェクト指向では、1つのシステムが多くのパーツで構成されています。
個々に開発されたパーツは単独でも動作しますが、連携も可能なので、パーツ単体や組み合わせ方よって、より複雑な演出や操作を追加していくこともできるのです。
オブジェクト指向のメリットは?
プログラミングの全体像を把握しやすい
オブジェクトごとに分けれたプログラムは視認性が高くなるため、開発の全体像も掴みやすく、開発の統率・管理がしやすいというメリットがあります。また、プログラム全体の構造を明確に把握してプログラムを設計できるため、全体から細部を練っていくという企画の進め方もできます。
分業できる
オブジェクト指向は、機能ごとに分かれているため、細分化することで複数人で作業を分担して開発を進めることができます。
開発作業の効率化が図れる
オブジェクト指向で開発された製品やクラスは、再利用しやすく、新しく同じような仕組みの製品を作る場合、開発作業の効率化が図れます。
保守性が高い
コードの冗長性が軽減されたことでプログラムの視認性が高まり、エラーが発生した場合でも問題の原因となっている箇所を発見しやすくなります。また、1つの処理を修正することで同じ処理を適用しているほかの箇所全てに適用されるため修正漏れも削減できます。ほかにも、オブジェクトごとの独立性高いため、影響範囲を把握しやすいなど、メンテナンスしやすいです。
オブジェクト指向のデメリットは?
設計に時間がかかる
オブジェクト指向プログラミングはしっかりと設計されてはじめて実力を発揮します。逆に言えば、この一番重要な設計に問題があると、オブジェクト指向を用いる本来のメリットを享受できないばかりか、新たな問題が生じる場合もあります。抜け目がないよう設計するのが重要です。
知識やスキルが求められる
オブジェクト指向プログラミングを行うにはそれだけ知識やスキルが求められます。
オブジェクト指向のプログラミング言語は?
オブジェクト指向の歴史は長く、今ではほとんどすべての言語が対応しているオブジェクト指向ですが、なかでも代表的なオブジェクト指向言語を紹介します。
Java
Javaはオブジェクト指向言語の代表格で、プラットフォーム開発など幅広く使われています。
特にデスクトップアプリ、Androidアプリの開発で多く使われている言語です。オブジェクト指向であるため、高い汎用性や柔軟性があります。
PHP
PHPは、Webアプリ分野で活躍している言語で、文法が比較的簡単で、初心者でも習得しやすいのが特徴です。オブジェクト指向により、大人数での大規模開発にも適しています。
JavaScript
JavaScriptは、Webアプリ分野のフロントエンドで活躍している言語で、Webサービスを開発には必要不可欠です。
フロントエンド
サイトの表側のことで、レイアウトや表示後の処理を指します。
Python
Pythonは、プログラミング初心者から上級者まで広く使われている言語です。
シンプルで覚えることが少ない構文で、1行で多くの処理を記述でき、Webアプリやゲームの開発だけでなくAI開発などにも使用されています。
C++
C++は、C言語をオブジェクト指向で書けるようにした言語で、スマホアプリやゲームの開発など、商用のプログラミング言語として重宝されています。
Swift
iOSアプリ開発で使われる言語で、文法が比較的簡単であるため、初心者でも扱いやすいのが特徴です。
従来はiOS分野の開発にはObjective-Cの使用が主流でしたが、習得難易度や処理速度という点で優れているSwiftが次第に主流になっていきました。
Ruby
Rubyは、日本人によって開発されたプログラミング言語で、コードの量も少ないので初心者にも扱いやすい言語です。主にWEBアプリの開発に使用されます。
終わりに
ここまで、オブジェクト指向について、その考え方やメリットについて解説してきましたがいかがでしたか?
オブジェクト指向は設計・開発を効率的に進められるだけでなく、開発後のメンテナンスもしやすいなど、大規模な開発にも適しており、今ではシステム開発の現場において欠かせない存在になっています。
本記事を通してオブジェクト指向に興味を持った方は、ぜひ勉強してみてください。
【おまけ】オブジェクト指向の実装具体例
以下の記事では、実際にプログラミング言語(PHP)を用いてオブジェクト指向について具体的に解説しています。
オブジェクト指向|エンジニアが具体的なコードで分かりやすく解説
オブジェクト指向を身につけるには?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、オブジェクト指向に限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。