スライドショースライドショースライドショー

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

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

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

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

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

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

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

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

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

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

オブジェクト指向とは?

効率よく開発するための考え方の1つ

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

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

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

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

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

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

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

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

それは、以下の3つです。

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

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

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

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

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

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

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

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

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

オブジェクト指向とは何か?わかりやすい例で説明してみた。
更新日 : 2019年9月11日

なかなかオブジェクト指向についてイメージがわかない……。
オブジェクト指向をしっかり理解してプログラミングスキルを身に着けたい

と思ったら、まずは弊社の「無料体験レッスン」を受けてみて、学習前に必要なマインドや知識を深めてみてはいかがでしょうか。

侍エンジニア塾では下記の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入門】クラスの使い方総まとめ
更新日 : 2019年7月24日

Javaを本格的に学んでみたいあなたへ

今回この記事で、Javaのオブジェクト指向について理解が深まりましたね。ここまで読んで

Javaって面白そう、もっと学んでみたいな

と思った人もいるのではないでしょうか。

独学で学習する場合、Javaは他のプログラミング言語に比べて挫折しやすい傾向にあります。有名な言語なので本や学習サイトでも学べるものはいっぱいあります。

ですが、オブジェクト指向もそうですが、学習を進めていくとか必ず壁にぶつかります。その壁を超えられなければ挫折という結果になってしまうのです。

そうならないためにも、プログラミングスクールで学習することをおすすめします。なぜなら

  • 専属講師によるマンツーマンレッスンで学習効率アップ
  • あなたに合った学習プランで最短スキル習得
  • いつでも質問できる環境で理解度がアップ


など、あなたの学習をサポートし挫折させないための学習方法が用意されています。

ですがもし

プログラミングスクールに通うのは抵抗ある・・・もう少し話を聞かないと不安

このように思う人もいるでしょう。

その場合は、弊社で行っている「無料体験レッスン」に参加してみてください。この無料体験レッスンでは、業界屈指のコンサルタントによって、あなたがなぜプログラミングを学ぶのか目的をヒアリングさせていただいた上で、最適な言語選定や学習プランの提案をさせていただきます。

プログラミングを学んだ先の理想は一人一人違います。完全個別指導で、あなたに合わせた講師とカリキュラムで学習し、オリジナルサービスを開発することによって、転職やフリーランスデビュー、社内昇進など様々な卒業生がキャリアを伸ばすことに成功しています。

あなたもぜひ、無料体験レッスンに参加して自分だけの学習プランで学習を進めてみてください。

オンラインでも無料体験レッスンは受講できるので、気軽に下記のカレンダーより空いてる日にちを選びお申込みください。

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通して、プログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

cta_under_btn

書いた人

侍ブログ編集部

侍ブログ編集部

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。プログラミングに役立つ情報や有用な情報を発信していきます。
サービスページはこちら
ツイッターはこちら
フェイスブックはこちら

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説