【10分でわかる】Javaにおけるオブジェクト指向を徹底解説

佐野裕史
書いた人 佐野裕史


侍エンジニア塾ブログは、未経験からWebアプリ開発と仕事獲得をサポートする
侍エンジニア塾のオウンドメディアです。
プログラミング学習を覗き見

こんにちは!インストラクターの佐野(@HiroshiSano0711 )です。

Javaは人気の言語なので、学習中の方も多いのではないでしょうか。

しかしオブジェクト指向のプログラミング言語であるJavaは、「オブジェクト指向」を理解しないと自分で考えてプログラミングしていくことは難しいでしょう。

  • 「けっきょくオブジェクト指向ってどういうことなの?」
  • 「いまだにJavaがよく分からない」
  • 「Javaでどうやってプログラミングしていけばいいの?」

など、お困りの声をよくいただきます。

そこで今回の記事では、Javaにおけるオブジェクト指向の考え方が理解できるように徹底的に解説します。

Javaの具体的なコードは載せていませんが、

  • 「オブジェクト指向は何で生まれたのか?」
  • 「Javaではどういう仕組みでオブジェクト指向を実現しているのか?」

という根本的な概念や仕組みについて解説していきます。

参考にしていただければ幸いです。

オブジェクト指向って何?

いかに効率よく開発するかを突き詰めた考え方の1つ

オブジェクト指向プログラミングは、英語ではObject-Oriented Programmingと言います。

一言でいうと「効率よく開発するための考え方の1つ」のことです。

アプリは大規模になってくると内部のプログラムが複雑になり、プログラムの追加をしたり、修正を行ったりすることが難しくなります。

オブジェクト指向が生まれる前は、アプリ開発においてさまざまな問題がありました。

  • プログラムを追加したら他のプログラムに影響が出た
  • プログラムを一箇所修正したら、他の部分も合わせて修正する必要があった
  • プログラムを追加するためには、既存のコードにも変更を加えないといけない

などの問題は日常茶飯事で、大規模なアプリを作ることはとても難しく、至難の技でした。

開発にかける時間やコストがかかってしまい、思うように開発することができなかったのです。

そこで先人たちは、数々の経験から開発を効率よく行うには3つの要素が必要だと発見しました。

それは

  • 「プログラムの独立性」
  • 「プログラムの再利用性」
  • 「プログラムの拡張性」

の3つです。

これらを実現したのがオブジェクト指向なのです。

「独立性」「再利用性」「拡張性」を実現するためには

オブジェクト指向は、プログラムは「独立していて、再利用しやすく、かつ拡張しやすいほど良い」という考え方をしています。

それらをオブジェクト指向では、大きく

  • カプセル化(独立性)
  • 継承(再利用性)
  • ポリモーフィズム(拡張性)

という3つの仕組みで実現しています。

厳密にいうと、他にも数々の工夫がされていますが、最初はこの3つを押さえておけば十分です。

オブジェクト指向については、こちらの記事で詳しく解説していますので、合わせてご覧いただくと理解が深まるでしょう。

では、オブジェクト指向はなぜ生まれたのか、Javaではどのように実現しているのかを順番に解説していきます。

プログラムの独立性

依存し合っているプログラムは危険である

プログラムは独立しているほど良いとされています。

でも、なぜプログラムは独立しているといいのでしょうか?

そこで、A、B、Cの3つのプログラムが独立しておらず、それぞれ依存している状態を考えてみましょう。

図で表すと以下のような状態です。

スライド2

A、B、Cのそれぞれがお互いに結合していて、依存している状態です。

この場合は、Aのプログラムに追加や修正を行った場合、Bに影響が出ないか確認する必要があります。

さらに、Aのプログラムを変更したことでBを修正する必要があった場合は、Bを変更したことでCに影響が出るかもしれません。

そして、Bを変更したことでCに影響が出る場合は、Cを変更したことでAに影響が出ないか確認しないといけません。

すると、いつまで経ってもプログラムの変更が終わらない無限ループに入ってしまう可能性があります。

しかも、A、B、Cのどのプログラムを変更しても、それぞれに与える影響を常に考慮しないといけません。

これだと開発の効率が非常に悪いですよね。

そこで、それぞれが依存しないように独立させて、お互いに影響がでないようにしてみましょう。

スライド1

これは極端な例ですが、A、B、Cがそれぞれ完全に独立しています。

このようにすると、A、B、Cのどれを変更しても、他のプログラムに与える影響は考える必要がありません

このことからプログラムは独立していた方が良いことがわかるでしょう。

Javaではどうやって独立性を高めているのか?

そもそもプログラムの独立性とは何を指しているのかイメージが湧かないかもしれません。

具体的にいうと、これは「カプセル化」と呼ばれ、他のプログラムから中身が見えないように隠し、必要以上に干渉されないようにする仕組みです。

Javaでは「クラス」という仕組みを使うことで、プログラムをカプセル化して独立性を高めています。

ところで、クラスと聞くと「学校のクラス」が真っ先に思いつくのではないでしょうか。

実は、Javaにおけるクラスは学校のクラスとまったく考え方が同じなのです。

「学校ではなぜクラスごとに分けているのか?」を考えてみると、Javaのクラスの意味がわかってきます

学校では、2年A組、2年B組などのクラスに分けることによって、それぞれのクラスを独立させています。

すると、たとえ2年A組の一部の不良生徒(悪い動作をするプログラム)が、暴れて授業を妨害したとしても、2年B組には影響がありませんよね。

また、数学が得意な生徒、英語が得意な生徒などを集めて工夫してクラス分けを行えば、学校や先生からすると管理がしやすく授業の内容なども組み立てやすくなります。

Javaでプログラムを作っていく場合も同じで、

  • 通知機能に関するプログラムはこのクラスに
  • メール送信機能に関するプログラムはこちらのクラスに

といった具合に分けることで管理がしやすくなります

しかもお互いが干渉を受けにくいので、一方のプログラムを変更したり、たとえ一方で不具合が起こっても他のプログラムには影響がほとんどありません

そのため、安全に開発を行っていくことができるのです。

また、不具合があったとしても原因を特定しやすくなるというメリットもあります。

メールを送信する処理で不具合があったら、メール送信機能をまとめているクラスだけ調べれば済むからです。

プログラムの再利用性

続いて、再利用性についてです。

再利用するメリットは、なんとなくご想像がつくのではないでしょうか?

日常生活でも日用品をリサイクルしたり、家電を修理してもう一度使って再利用すれば、ゴミの量が少なくなって環境に優しかったりします。

しかも、お金も浮いて経済的だったりしますよね。

プログラムを再利用することでも、メリットがたくさんあります

プログラムを再利用すれば追加、修正が簡単になる

たとえば、以下の図のように、3つのプログラムの中にAという同じ処理を行うプログラムがあったとしましょう。

スライド1

このように毎回、同じプログラムを書いていると、あっという間にコード量が増え見通しが悪くなってしまいます。

しかも、これではAというプログラムに追加や修正を行う必要が出た場合、3箇所も変更しないといけません。

そこで、同じAというプログラムを独立した部品にして、外部から再利用ができるようにすれば、プログラムを書く時間を節約することができます。

スライド1

さらに、外部から同じAのプログラムを再利用することで、プログラムの変更も行いやすくなっています。

B、C、Dは同じAを使っているので、Aのプログラムだけ変更すれば済みます。

これを現実世界のものに例えるなら、「学校の共同トイレ」と同じです。

各クラスにトイレを作るより、1箇所にトイレを作って共通で利用する方が、掃除も一箇所だけで済みます。

また、ウォシュレットを追加したい場合でも1箇所のトイレにつけるだけで、生徒全員が利用できるようになります。

Javaではどのように再利用性を高めているのか?

Javaでは「メソッド」「クラスの継承」などの仕組みでプログラムの再利用性を高めています。

メソッドは一定の処理を行うプログラムを部品化できる仕組みです。

同じ処理をメソッドにして部品化して他のプログラムから再利用することで、書くコードも減りますし、変更する際も1箇所で済みます。

さらに、同じ機能に関連するメソッドを1つのクラスにまとめることもできます。

よく行う処理を1つのクラスでまとめて、プログラム全体で再利用ができればすごく効率がいいと思いませんか?

Javaではクラス単位でプログラムを再利用できるようにする仕組みがあります。

それが「クラスの継承」です。

クラスの継承は再利用性を高めつつ独立性を担保できる

クラスは独立性を高めるための仕組みなので、他のクラスからプログラムを自由に使われてしまうと意味がありません。

そこでどのクラスから利用できるか制限します。

Javaでは「public」「protected」「private」といったものをクラスやメソッドに付与することで、制限をかけることができます。

クラスにpublicを付与すればは他のクラスから制限なく利用ができるようにできますし、クラスにprivateを付与すれば他のクラスから継承すらできないように制限できます。

必要最低限の範囲で利用できるように制限することで、再利用性を高めつつも独立性も保とうとしているのです。

さらに、クラスの継承は拡張性も高めることができるような仕組みになっています。

プログラムの拡張性

拡張性はオブジェクト指向の中で一番難しいとされています。

なぜなら抽象度が高いのでイメージがしづらく、パッと聞いただけでは理解が難しいからです。

そもそも拡張性とはいったい何のことをいっているのでしょうか?

ひとことでいうと、拡張性とは「再利用しつつ自由に改変できる性質」を表しています。

再利用できて、かつ自由に改変できる性質

拡張性は「再利用できて、かつ自由に改変できる性質」のことですが、あまりイメージが湧かないでしょう。

拡張性を理解するキーワードは、「抽象化」です。

「抽象化とはどういうことか」が理解できれば拡張性も理解することができるでしょう。

抽象化は具体的を出した方がわかりやすいので、例を出して順番に解説します。

たとえば、新しくできた学校で「部活動を行う際のルールを決めたい場合」を考えてみましょう。

いきなり「野球部はこのルール」「サッカー部はこのルール」「陸上部は…、吹奏楽部は…、コーラス部は…」などと順番に決めていくと大変ですよね。

あなたならこのような場合どうしますか?

そうです、ここで抽象化を行うといいのです。

抽象化とは「重要な要素や共通な要素を抜き出して他は無視する考え方」のことを指します。

ためしに野球部、サッカー部、陸上部、吹奏楽部、コーラス部の5つを抽象化してみましょう。

すると、野球部、サッカー部、陸上部の3つは「運動すること」が共通な要素なので「運動部」と抽象化できます。

吹奏楽部やコーラス部も抽象化すると「文化部」とすることができますね!

運動部や文化部で「共通のルール」を決めておけば、あとは野球部やサッカー部などで個別に必要となる細かいルールだけ決めれば済みますね。

スライド1

こうやって抽象化されてできた運動部や文化部の共通のルールは

「再利用できて、かつ自由に改変できる性質」

を持っているのです。

重要な部分や共通の部分をまとめて拡張性を上げる

さきほど抽象化した共通ルールは再利用ができて拡張性も高いといえます。

なぜそういえるのでしょうか?

たとえば、運動部の共通ルールで「雨天時は体育館で行うこと」とあったとします。

でも野球は体育館で行うと危険なので、「野球部や雨天時でも外で行うこと」という風にルールを変えたくなったとしましょう。

その場合でも、野球部のルールを上書きするだけで、運動部の共通ルールは変える必要がありません。

スライド1

運動部のルールを変えてしまうと他の部活にも影響が出てしまいます。

しかし、抽象化してそこから再利用しているので、個別に独自ルールを追加したり、変更したりすることが簡単にできてしまいます。

また、新しく卓球部、バスケ部、テニス部を作りたいとなった場合はどうでしょうか?

その場合も簡単です。

同じ運動部なので、「運動部の共通ルール」がそのまま使えてしまうのです。

運動部であればすべてに適用でき、必要であれば個別にルールを変更したり追加できます。

ですから、「再利用ができて拡張性がすごく高い性質」をもっているといえるのです。

Javaではどうやって拡張性を実現しているのか?

拡張性の解説をしている時にお気づきになった方もいらっしゃるかもしれません。

再利用性と拡張性が両方でてきましたね。

実はこの2つは切り離すことが難しいくらい仲の良い仲間のようなものです。

再利用性の高め方を工夫することで拡張性が生まれるといってもいいでしょう。

Javaでは、クラスの作り方や継承の仕方を工夫することで拡張性の高いプログラムができあがります。

そのためにある仕組みの1つは「オーバーライド」です。(※Javaのインターフェースも性質は同じですが簡略化のため省いています)

継承したクラスでは、継承元のクラスのプログラムにさらに処理を追加したり、上書きして変更することができます。

継承元のプログラムを上書きして変更することを、Javaでは「オーバーライド」と呼んでいます。

作りたいプログラムの重要な機能や処理をまとめて抽象化させてクラスを作れば拡張性の高いクラスができあがります。

先ほどの運動部の例でも、オブジェクト指向でいうと「卓球部、バスケ部、テニス部はそれぞれ運動部の共通ルールを継承している」ともいえます。

スライド1

また、野球部は雨天時のルールを独自ルールに変更しましたが、これは「オーバーライド」しているといえますね。

抽象化したものを継承されるクラスにすることで、プログラムは再利用ができてかつ拡張性が高い性質をもつようになります。

ただ、1つ注意点があります。

オーバーライドはJavaで拡張性を高めるための「1つの手段」に過ぎません。

クラスの継承、抽象クラス、インターフェースなど他にもたくさんあります。

何も考えずにクラスを適当に作って継承させたり、オーバーライドしても、拡張性を高めることはできません

拡張性を高めるために必要なのは、「抽象化すること」です。

同じ性質や同じ要素を持ったプログラムを適切に分けて、それに対してふさわしいJavaの機能を使うことによってはじめて実現できます。

全体をみてプログラミングしていく必要もあるので、拡張性を高めることは一番「難易度が高い」といえます。

でも、それができるようになることで、上級者への扉を開くことができるのです。

拡張性を制するものは、プログラミングを制するといっても過言ではありません。

クラスについてもっと詳しく知りたい方へ

オブジェクト指向には「独立性」「再利用性」「拡張性」が重要とお伝えしてきました。

これらを実現する仕組みが「クラス」でした。

そのクラスについて、こちらで詳しく解説していますので、ぜひ参考にしてくださいね。

まとめ

いかがでしたでしょうか?

プログラムは独立性が高く、再利用しやすく、かつ拡張性が高いほど良いです。

Javaではそれらを、「クラス」「メソッド」「クラスの継承」「オーバーライド」などの仕組みで実現しています。

今回ご紹介したのは仕組みや概念を理解するためなので最小限に抑えました。

他にもJavaにはたくさんの便利な仕組みが用意されています。

オブジェクト指向を理解することで、いままで使い方が分からなかった機能も理解できるようになります。

すると、プログラムをどのように組み立てていけばいいかも理解できるでしょう。

Javaには、オブジェクト指向をフルに活かせる生産性の高いプログラミング言語です。

ぜひ、Javaを使いこなして自由にプログラミングできるようになりましょう!

Javaカリキュラム無料公開中!
この記事はJava入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Java学習に必要な情報を一つにまとめていますので効率よくJavaを学ぶことが出来ます。この機会に是非活用していただければと思います。


33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーでWEBエンジニアをやられている濱口直行さん。33歳で、プログラミングを学び始め、約半年という短い期間で独立までされた学習ログを余すことなくインタビューさせていただきました。

プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。


最短でJavaを習得したい方へ

もし、あなたが、

「難しすぎて学習が全然進まない」
「学習量が膨大でゴールが見えない」
「エラーを解決するのに何日もかかってしまう」

など、プログラミング学習やキャリアに関してお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_bannar-java1

非常識な結果を出した卒業生

活躍する現役エンジニア

人気記事セレクション

LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

佐野裕史

佐野裕史

侍エンジニア塾インストラクター。
主に技術担当をしています。

【経歴】
力仕事、接客業、営業職など様々な業界を経てIT業界に参入。
IT未経験からスタートし、1ヶ月で仕事獲得に奇跡的に成功。
1年半後にフリーランスに転身。

Web開発を主に行っており、得意とするのはRails、Ruby。
【技術スキル】
Rails、Ruby、Swift、Java(Android)、JavaScript

【趣味、趣向】
麻雀
MTG(マジックザギャザリング)
ダーツ、卓球、野球、ボウリングなどの球技

【Facebookページ】
https://www.facebook.com/hiroshi.sano.7
【Twitter】
プログラミング講師@佐野裕史
自分でプログラミングができない人のために情報を発信しています。
お気軽にフォローください。