「オブジェクト指向」とは?基本概念とメリットをわかりやすく説明
[最終更新日]2024/08/16
システム開発において、オブジェクト指向は代表的な用語の1つです。
ITエンジニアを目指している方なら、一度は聞いたことがあるでしょう。
オブジェクト指向はプログラミング言語そのものではないため、その理解や習得については「なんとなく後回しにしている」という方もいらっしゃるかもしれませんね。
ですが、多くのプログラミング言語はオブジェクト指向の考え方を取り入れています。
このため言語の仕組みを理解する上で、オブジェクト指向の考え方を知っておくとわかりやすくなる場合も少なくありません。
また、そもそもオブジェクト指向自体は言語にとらわれない概念ですから、一度学べばさまざまな言語の習得に役立ちます。
目次
1)そもそも「オブジェクト指向」とは?基本概念について
オブジェクト指向の考え方には独特のものがあります。あなたが開発プロジェクトに入った場合は、オブジェクト指向の考え方を習得していることが前提となるケースも少なくありません。
このため、早めにオブジェクト指向の考え方を身につけておくことをおすすめします。まずは以下の項目に沿って、確認していきましょう。
- オブジェクト指向とは、プログラミングの作り方、考え方の一つ
- オブジェクト指向を取り入れているプログラミング言語の代表例
オブジェクト指向とは、プログラミングの作り方、考え方の一つ
オブジェクト指向は、プログラミングの概念を示すものです。概念とは、プログラミングの考え方や、どうやってプログラムを組むかという「考え方」を指します。
その根幹となる「オブジェクト」とは、現実世界に存在するあらゆるものを指します。
これは「犬」や「飛行機」といった形ある物体だけでなく、想像であらわされるものや概念なども含まれます。
オブジェクト指向は変数と関数などの組み合わせをオブジェクトごとに作ることで、「犬が鳴く」「飛行機が飛ぶ」といった、現実に近い方法でプログラムを動かせることが特徴です。
よく比較される「手続き型プログラミング」「関数型プログラミング」
プログラミング手法には、オブジェクト指向以外にもさまざまなものがあります。
オブジェクト指向プログラミングとよく比較される手法に、「手続き型プログラミング」と「関数型プログラミング」があります。それぞれどのような点に違いがあるか、以下の表で確認していきましょう。
プログラミング手法 | 概要 |
---|---|
オブジェクト指向プログラミング | 現実世界に存在するものや現象を、オブジェクトという「モノ」として考え、モノの作成と動作を一体として扱うことが特徴。 実際にはデータとメソッドをまとめた「クラス」を活用する。 クラスによりブラックボックス化ができ、システムを単純化することが可能。 |
手続き型プログラミング | それぞれの命令を組み合わせ、順番に処理するプログラミング手法。 動作の途中で得られた計算結果をもとにして処理するといったケースに向く。 一方で結果の値を他の命令を使って上書きすることも簡単なため、予期しない結果が出ないよう細心の注意が必要。 |
関数型プログラミング | プログラムは関数の組み合わせによって記述する。 手続き型プログラミングと異なり、一度値を設定した変数は他の値で上書きできない。 引数が同じなら返り値も同じになる「参照透過性」があり、バグが発生しにくくテストや保守が容易になる。 |
オブジェクト指向を取り入れているプログラミング言語の代表例
オブジェクト指向は、さまざまなプログラミング言語で採用されています。
どのような言語で採用されているか、代表的な例を以下にあげてみました。
言語 | 特徴 |
---|---|
Java | 広く使われている汎用プログラミング言語。強い型付けを持ち、エンタープライズシステムや大規模なWebアプリケーションの開発に適している。 |
Ruby | シンプルで読みやすい文法を持ち、WebアプリケーションフレームワークのRuby on Railsで有名。動的型付け言語。 |
C++ | 高性能で多機能なプログラミング言語。システムソフトウェアやゲーム開発、ハードウェアに近いレベルのプログラムに使用される。 |
C# | Microsoftが開発した言語で、.NETフレームワーク上で動作する。WindowsアプリケーションやWebアプリケーションの開発に広く使われる。 |
Swift | Appleが開発した言語で、iOSやmacOSのアプリケーション開発に使用される。安全性と性能を重視した設計が特徴。 |
Kotlin | JetBrainsが開発した言語で、主にAndroidアプリケーションの開発に使用される。Javaと互換性があり、簡潔で安全なコードが書ける。 |
JavaScript | Webブラウザ上で動作するプログラミング言語。フロントエンドの開発が中心だが、Node.jsによりサーバーサイドでも使用される。 |
PHP | サーバーサイドのWeb開発に広く使われる言語。動的なWebページの生成が得意で、WordPressなどのCMSでも使用 |
上記に示すとおり、多くの言語でオブジェクト指向の考え方が採用されています。
このためシステム開発に携わるならば、オブジェクト指向の考え方を必ず理解することが求められるでしょう。
2)オブジェクト指向による、メリット・優れている点
オブジェクト指向には、以下のようにさまざまなメリットがあります。
いずれも、オブジェクト指向を代表するメリットです。それぞれについて、詳しく解説していきます。
オブジェクトのひな形(スーパークラス)をもとに、差分だけを定義したサブクラスを作成できる
オブジェクト指向では、それぞれのオブジェクトを以下の方法で定義できます。
- 基本的な属性は、スーパークラスでまとめて定義する
- 個々の属性はスーパークラスを継承したサブクラスで、それぞれ定義する
たとえば犬や猫、ニワトリを例にとると、以下のようになります。
- スーパークラス「動物」を定義し、動物の基本的な特徴を定義する
- サブクラスで「走り方」「鼻づらの長さ」「前足の動き」「食事の方法」などをそれぞれ定義する
このため動物ごとにそれぞれ関数を設け、すべての属性を定義するといった手間がかかりません。
継承さえしておけば差分だけ実装すればよいため、開発スピードとバグの減少を両立できる点は主なメリットにあげられます。
同じ指示でサブクラスごとに動作(メソッド)を変えられる
オブジェクト指向では同じ指示をしても、サブクラスごとに動作を変えることができます。これは「スーパークラスで動作の名称だけ指定しておき、その内容はサブクラスで設定する」 ことができるためです。
たとえば「飛ぶもの」というスーパークラスを作った後、作成したサブクラスで「飛ぶ」指示をさせた場合、以下の動作ができます。
- 鳥は翼を羽ばたかせて飛ぶ
- ジェット機はエンジンを動作させて飛ぶ
- 人間は勢いよくジャンプする
このように同じ動作を指示しても、サブクラスごとに動作を変えられる「ポリモーフィズム」も特徴の1つです。もし新たなクラスを定義したいなら、継承によりサブクラスを作れば良いため簡単です。
他のオブジェクトからアクセスする方法を決められるため、勝手に情報を書き換えられるリスクを防げる
プログラムを実行する際には、他のオブジェクトにアクセスして値を得たいケースがあります。
オブジェクト指向では、各クラスで指定したメソッドを通してしかアクセスできないことが特徴です。
たとえば「dog」クラスの体長が40cm、体重が10kgと設定されていたとしても、「体長や体重を表示する」メソッドを指定していなければ、他のクラスから値を参照することはできません。
もちろん「更新する」「設定する」「削除する」といったメソッドを用意していなければ、外部から情報を書き換えることもできなくなるわけです。
このような「カプセル化」により、意図しない形で勝手に情報を書き換えるリスクを防げる点もメリットの1つです。
うっかりサブクラスで実装し忘れても、チェックする仕組みがある
オブジェクト指向が示すもう1つのメリットは、うっかりサブクラスで定義を忘れたとしても、コンパイル時にチェックするしくみがあることです。
たとえば「入力値をチェックした後に計算処理をする」といった業務をする場合、もし入力値のチェックをうっかり実装し忘れてしまうと、意図しない計算結果が出てしまうかもしれません。
しかしオブジェクト指向の場合は、あらかじめスーパークラスで「サブクラスで実装すべき動作」を指定できる仕組みが備わっています。
もし実装し忘れた場合はコンパイルエラーとなります から、テスト時やリリース後に上記のようなバグが見つかり対応に追われる…といった事態を防げます。
3)オブジェクト指向を身につけるためのポイント
オブジェクト指向を身につけるためには、以下のポイントを押さえた上で学習を進めることが重要です。
いずれも重要なポイントです。それぞれのポイントについて、以下で詳しく解説します。
オブジェクト指向でよく扱われるキーワード・概念に触れておこう
オブジェクト指向では、独特のキーワードや概念が用いられています。他の言語と同じキーワードでも意味が異なる場合がありますから、開発エンジニアには正確な理解が求められます。
現場で使われるキーワードなどにはさまざまなものがありますが、ここではオブジェクト指向で開発する際にまず押さえておくべきキーワードや概念についてまとめました。ぜひ理解しておきましょう。
よく使われるキーワード
キーワード | 概要 |
---|---|
オブジェクト | 現実世界で存在する、さまざまなモノを指す。たとえば人や自動車、犬や猫などがあげられる。プロジェクトや病気など、直接手で触れない抽象的な概念もオブジェクトに含まれる。以下で解説する「クラス」をインスタンス化することで作成される。 |
クラス | オブジェクトを定義する設計図のようなもので、データと処理内容(メソッド)をひとまとめにして定義したもの。クラスには上下関係があり、上位のクラスを「スーパークラス」、下位のクラスを「サブクラス」と呼ぶ。 |
インスタンス | 設計図であるクラスから、実際に動作するオブジェクトを作成すること。1つのクラスから、複数のオブジェクトを作成できる。また、オブジェクトを作成する行為を、「インスタンス化」と呼ぶ。 |
メソッド | クラスごとに定義された処理のこと。たとえば「歩く」「更新する」「表示する」などがあげられる。プログラム中にメソッドを指定することで、簡単に処理を行える。また、メソッドは必要な数だけ定義できる。 |
オブジェクト指向の概念、三大要素
キーワード | 概要 |
---|---|
継承 | 上位のクラス(スーパークラス)の値やメソッドを、他のクラスで使えるようにすること。Javaの場合は「extends」を使うことで継承を行える。 個々のクラスでは個別の部分だけを実装すればよいため、実装の手間が省け読みやすいプログラムとなる。また、継承後のクラス(サブクラス)で必ず実装すべき動作も指定できるため、実装漏れも防ぐ効果がある。 |
ポリモーフィズム (ポリモルフィズム) | 同じメソッドでも、オブジェクトにより違う動作をさせること。 たとえば「走る」という命令をした場合、人やダチョウなら2本足、犬や猫は4本足、自動車なら車輪を使って走るといった例があげられる。 スーパークラスが同じであれば、個々のサブクラスで「走る」部分の動作を実装させることでポリモーフィズムを実現できる。 |
カプセル化 | クラスごとにデータと動作をまとめ、パッケージ化することを指す。抽象化とも呼ばれる。 クラスを呼び出す側は相手の内部がどうなっているか知らなくても、メソッドを実行するだけで情報の入手や処理の実行ができる。 また、他のクラスなど、外部とのやりとりはメソッドを実行する必要があるため、不用意にデータを破損させるリスクも下げられる。 |
実際にあるものを、オブジェクト指向の目線で解釈してみる
これまで解説したオブジェクト指向ですが、実際に開発するとどのような動きになるのか、いまいちよくわからない方も多いと思います。ここでは猫とダチョウを例にして説明します。
猫やダチョウをクラスとして定義する際には、各々を最初から別のクラスとして作り始めるのではなく、事前に「動物」というスーパークラスを定義するとよいでしょう。
ここに動物一般にあてはまる内容を定義し継承することで、個々のサブクラスでは個別の動作などを定義するだけで済み、手間も省けます。
また、猫とダチョウが走る姿は異なりますが、同じ「走る」というメソッドを使えます。
猫に「走れ」と命令すれば4本足で、ダチョウならば2本足で走るわけです。このように同じメソッドでも違う動作をさせられる「ポリモーフィズム」ができることも、オブジェクト指向の特徴です。
オブジェクト指向の目線で解釈した例
スーパークラス | サブクラス | 属性 | メソッド |
---|---|---|---|
動物 | 猫 | 名前、年齢、性別、毛の色、ひげの長さ | 呼吸する(), 食べる(), 走る() {四足で走る}, 鳴く() {「ニャー」と鳴く} |
動物 | ダチョウ | 名前、年齢、性別、羽の長さ、体重 | 呼吸する(), 食べる(), 走る() {二足で走る}, 鳴く() {「ホホホ」と鳴く} |
乗り物 | 自動車 | 速度、定員、エンジンタイプ、燃料タイプ | 動く() {エンジンを使って動く}, 止まる(), クラクションを鳴らす() {「プー」と鳴らす} |
乗り物 | 自転車 | 速度、定員、ギア数、タイヤサイズ | 動く() {ペダルを漕いで動く}, 止まる(), ベルを鳴らす() {「チリンチリン」と鳴らす} |
家電製品 | テレビ | 製造会社、消費電力、画面サイズ、解像度 | 電源を入れる() {画面を表示}, 電源を切る(), チャンネルを変える() {チャンネルを切り替える} |
家電製品 | 冷蔵庫 | 製造会社、消費電力、容量、冷凍機能 | 電源を入れる() {冷却を開始}, 電源を切る(), 温度を調整する() {冷蔵室と冷凍室の温度を設定} |
従業員 | エンジニア | 名前、従業員ID、部署、プログラミング言語、プロジェクト | 働く() {コードを書く}, 出勤する(), バグを修正する() {ソフトウェアのバグを修正} |
従業員 | マネージャー | 名前、従業員ID、部署、管理チーム、プロジェクト予算 | 働く() {チームを管理}, 出勤する(), 会議を開催する() {チームミーティングを行う} |
書籍などから基礎知識を蓄える
ここまで解説したとおり、オブジェクト指向には基本的な概念やさまざまなキーワードがあります。
加えて基本的な開発の進め方や考え方といった、ルールのようなものもあります。これらは多くの開発現場で共通する内容ですから、自ら積極的に学び取る必要があります。
オブジェクト指向の基礎知識を学ぶには、書籍など体系的にまとめられたものがおすすめです。そもそもオブジェクト指向の考え自体はかなり前からありますから、学ぶべき知識はある程度確立されています。
さまざまな書籍がありますから、少々費用をかけても蓄積された「知」から学ぶことが、効率的に知識を身につけるコツです。
自分でプログラムを組んでみる
これからの開発者にとって、オブジェクト指向の知識を身につけることはもちろん重要です。
一方で開発者はプログラミングができることが重要という視点に立つと、本やWebで知識をつけただけでは十分といえません。
そのためオブジェクト指向を取り入れた言語を学び、実際にプログラムを組んでみることが必要です。
実際にプログラムを組むことで、本だけではわかりにくかった内容もスムーズに理解できることもあるでしょう。
本で読んだことをプログラムで試してみることも、理解を深める上でよい方法の1つです。プログラミング言語の技術を身につけられるという点では、一石二鳥の方法ともいえるでしょう。
まとめ)オブジェクト指向はすべてのITエンジニアにとって重要。必ず理解しよう
オブジェクト指向は、現実世界に近い概念を使って実装できることが1つの特徴です。
加えて継承によるサブクラスを作成することで、新しいオブジェクトを作成することも容易です。
不用意に値を書き換えられるリスクも減らせる、開発を効率的に進められるなどのメリットもあるため、この手法は多くのプログラミング言語に取り入れられています。
そのためオブジェクト指向は、すべてのITエンジニアが理解しておく必要があります。
とりわけこれからITエンジニアとして開発に携わる方の場合、オブジェクト指向を用いたプロジェクトに入る確率は高いです。
プロジェクトに入るとなかなかオブジェクト指向について学ぶ時間はとりにくくなりますから、今のうちにしっかり学んでおくことをおすすめします。