この記事では、Javaにおけるオブジェクト指向の特徴を解説します。
国内におけるIT人材不足の深刻化を背景に、ITエンジニアといったプログラミングスキルがある人材の需要は増し、他の職種に比べ高い報酬を設けるケースが増えてきました。
そんななか、転職や副業での収入獲得に活かすため、プログラミングを学ぼうと考えている人もいますよね。
特に、Javaは国外を問わず人気が高いプログラミング言語のため、習得したい人は多いでしょう。
ただ、Javaを学び始めたところ、
いまだにJavaがよく分からない……。
Javaでどうやってプログラミングしていけばいいの?
など、お困りの声をよくいただきます。
そこで今回の記事では、Javaにおけるオブジェクト指向の考え方が理解できるように徹底的に解説します。
Javaの具体的なコードは載せていませんが、
- オブジェクト指向は何で生まれたのか?
- Javaではどういう仕組みでオブジェクト指向を実現しているのか?<f/li>
という根本的な概念や仕組みについて解説していきます。
また、次の記事ではそもそもJavaとはどんなプログラミング言語なのか、その特徴やできることをわかりやすく解説しているので良ければ参考にしてください。
- オブジェクト指向とは効率よく開発する考え方の1つ
- オブジェクト指向は「プログラムは独立し、再利用・拡張しやすいほど良い」という考えに基づいている
- オブジェクト指向の理解には「クラス」が欠かせない
オブジェクト指向とは?
効率よく開発するための考え方の1つ
オブジェクト指向プログラミングは、英語ではObject-Oriented Programmingと言います。
一言でいうと「効率よく開発するための考え方の1つ」のことです。
アプリは大規模になってくると内部のプログラムが複雑になり、プログラムの追加をしたり、修正を行ったりすることが難しくなります。
オブジェクト指向が生まれる前は、アプリ開発においてさまざまな問題がありました。
- プログラムを追加したら他のプログラムに影響が出た
- プログラムを一箇所修正したら、他の部分も合わせて修正する必要があった
- プログラムを追加するためには、既存のコードにも変更を加えないといけない
などの問題は日常茶飯事で、大規模なアプリを作ることはとても難しく、至難の技でした。
開発にかける時間やコストがかかってしまい、思うように開発することができなかったのです。
そこで先人たちは、数々の経験から開発を効率よく行うには3つの要素が必要だと発見しました。
それは、以下の3つです。
- 「プログラムの独立性」
- 「プログラムの再利用性」
- 「プログラムの拡張性」
これらを実現したのがオブジェクト指向なのです。
「独立性」「再利用性」「拡張性」を実現するには
オブジェクト指向は、プログラムは「独立していて、再利用しやすく、かつ拡張しやすいほど良い」という考え方をしています。
それらをオブジェクト指向では、大きく
- カプセル化(独立性)
- 継承(再利用性)
- ポリモーフィズム(拡張性)
という3つの仕組みで実現しています。
厳密にいうと、他にも数々の工夫がされていますが、最初はこの3つを押さえておけば十分です。
オブジェクト指向については、こちらの記事で詳しく解説していますので、合わせてご覧いただくと理解が深まるでしょう。
なお、Javaを学びたい気持ちはあるものの本当に自分にあう言語なのか、どう学習を進めればいいのかなどがあいまいな人は「プログラミング学習プラン診断」をお試しください。
かかる時間は1分ほど。4つの質問に答えるだけで、あなたにあう言語や学習プランを診断してもらえます。
効率よくプログラミングを学習したい人は、ぜひ一度お試しください。
\ 4つの質問に答えるだけ /
プログラムの独立性
ここからはオブジェクト指向はなぜ生まれたのか、Javaではどのように実現しているのかを順番に解説していきます。
依存し合っているプログラムは危険
プログラムは独立しているほど良いとされています。でも、なぜプログラムは独立しているといいのでしょうか?
そこで、A、B、Cの3つのプログラムが独立しておらず、それぞれ依存している状態を考えてみましょう。
図で表すと以下のような状態です。
A、B、Cのそれぞれがお互いに結合していて、依存している状態です。この場合は、Aのプログラムに追加や修正を行った場合、Bに影響が出ないか確認する必要があります。
さらに、Aのプログラムを変更したことでBを修正する必要があった場合は、Bを変更したことでCに影響が出るかもしれません。そして、Bを変更したことでCに影響が出る場合は、Cを変更したことでAに影響が出ないか確認しないといけません。
すると、いつまで経ってもプログラムの変更が終わらない無限ループに入ってしまう可能性があります。しかも、A、B、Cのどのプログラムを変更しても、それぞれに与える影響を常に考慮しないといけません。
これだと開発の効率が非常に悪いですよね。
そこで、それぞれが依存しないように独立させて、お互いに影響がでないようにしてみましょう。
これは極端な例ですが、A、B、Cがそれぞれ完全に独立しています。
このようにすると、A、B、Cのどれを変更しても、他のプログラムに与える影響は考える必要がありません。
このことからプログラムは独立していた方が良いことがわかるでしょう。
Javaではどうやって独立性を高めているのか?
そもそもプログラムの独立性とは何を指しているのかイメージが湧かないかもしれません。
具体的にいうと、これは「カプセル化」と呼ばれ、他のプログラムから中身が見えないように隠し、必要以上に干渉されないようにする仕組みです。
Javaでは「クラス」という仕組みを使うことで、プログラムをカプセル化して独立性を高めています。
- クラスは学校のクラスと考え方が同じ!?
実は、Javaにおけるクラスは学校のクラスとまったく考え方が同じなのです。「学校ではなぜクラスごとに分けているのか?」を考えてみると、Javaのクラスの意味がわかってきます。学校では、2年A組、2年B組などのクラスに分けることによって、それぞれのクラスを独立させています。
すると、たとえ2年A組の一部の不良生徒(悪い動作をするプログラム)が、暴れて授業を妨害したとしても、2年B組には影響がありませんよね。
また、数学が得意な生徒、英語が得意な生徒などを集めて工夫してクラス分けを行えば、学校や先生からすると管理がしやすく授業の内容なども組み立てやすくなります。
Javaでプログラムを作っていく場合も同じで、
- 通知機能に関するプログラムはこのクラスに
- メール送信機能に関するプログラムはこちらのクラスに
といった具合に分けることで管理がしやすくなります。
しかもお互いが干渉を受けにくいので、一方のプログラムを変更したり、たとえ一方で不具合が起こっても他のプログラムには影響がほとんどありません。
そのため、安全に開発を行っていくことができるのです。
また、不具合があったとしても原因を特定しやすくなるというメリットもあります。
メールを送信する処理で不具合があったら、メール送信機能をまとめているクラスだけ調べれば済むからです。
なお、ITの仕事に興味はあるものの、どの職種が自分にあうのかわからない人もいますよね。そんな人は「ITキャリア診断」をお試しください。
かかる時間はたったの1分。5つの質問に答えるだけで、自分にあうIT職種を診断してもらえます。
自身に適した職種が知りたい人は、手軽に試してみると良いですよ。
\ 5つの質問に答えるだけ /
プログラムの再利用性
続いて、再利用性についてです。
再利用するメリットは、なんとなくご想像がつくのではないでしょうか?
日常生活でも日用品をリサイクルしたり、家電を修理してもう一度使って再利用すれば、ゴミの量が少なくなって環境に優しかったりします。しかも、お金も浮いて経済的だったりしますよね。
プログラムを再利用することでメリットがたくさんあります。
プログラムを再利用すれば追加、修正が簡単
たとえば、以下の図のように、3つのプログラムの中にAという同じ処理を行うプログラムがあったとしましょう。
このように毎回、同じプログラムを書いていると、あっという間にコード量が増え見通しが悪くなってしまいます。
しかも、これではAというプログラムに追加や修正を行う必要が出た場合、3箇所も変更しないといけません。
そこで、同じAというプログラムを独立した部品にして、外部から再利用ができるようにすれば、プログラムを書く時間を節約することができます。
さらに、外部から同じAのプログラムを再利用することで、プログラムの変更も行いやすくなっています。
B、C、Dは同じAを使っているので、Aのプログラムだけ変更すれば済みます。
これを現実世界のものに例えるなら、「学校の共同トイレ」と同じです。各クラスにトイレを作るより、1箇所にトイレを作って共通で利用する方が、掃除も一箇所だけで済みます。
また、ウォシュレットを追加したい場合でも1箇所のトイレにつけるだけで、生徒全員が利用できるようになります。
Javaはどのように再利用性を高めているのか?
Javaでは「メソッド」「クラスの継承」などの仕組みでプログラムの再利用性を高めています。
メソッドは一定の処理を行うプログラムを部品化できる仕組みです。
同じ処理をメソッドにして部品化して他のプログラムから再利用することで、書くコードも減りますし、変更する際も1箇所で済みます。さらに、同じ機能に関連するメソッドを1つのクラスにまとめることもできます。
よく行う処理を1つのクラスでまとめて、プログラム全体で再利用ができればすごく効率がいいと思いませんか?
Javaではクラス単位でプログラムを再利用できるようにする仕組みがあります。
それが「クラスの継承」です。
クラスの継承は再利用性を高めつつ独立性を担保できる
クラスは独立性を高めるための仕組みなので、他のクラスからプログラムを自由に使われてしまうと意味がありません。
そこでどのクラスから利用できるか制限します。
Javaでは「public」「protected」「private」といったものをクラスやメソッドに付与することで、制限をかけることができます。
クラスにpublicを付与すればは他のクラスから制限なく利用ができるようにできますし、クラスにprivateを付与すれば他のクラスから継承すらできないように制限できます。
必要最低限の範囲で利用できるように制限することで、再利用性を高めつつも独立性も保とうとしているのです。
さらに、クラスの継承は拡張性も高めることができるような仕組みになっています。
なお、IT企業への転職や副業での収入獲得を見据え、独学でJavaを習得できるか不安な人は「侍エンジニア」をお試しください。
侍エンジニアでは、現役エンジニアと学習コーチの2名体制で学習をサポートしてもらえます。
「受講生の学習完了率98%」「累計受講者数4万5,000名以上」という実績からも、侍エンジニアなら未経験からでも挫折なく転職や副業収入の獲得が実現できますよ。
\ 給付金で受講料が最大80%OFF /
プログラムの拡張性
拡張性はオブジェクト指向の中で一番難しいとされています。なぜなら抽象度が高いのでイメージがしづらく、パッと聞いただけでは理解が難しいからです。
そもそも拡張性とはいったい何のことをいっているのでしょうか?
ひとことでいうと、拡張性とは「再利用しつつ自由に改変できる性質」を表しています。
再利用できて、かつ自由に改変できる性質
拡張性は「再利用できて、かつ自由に改変できる性質」のことですが、あまりイメージが湧かないでしょう。
拡張性を理解するキーワードは、「抽象化」です。
「抽象化とはどういうことか」が理解できれば拡張性も理解することができるでしょう。
抽象化は具体的を出した方がわかりやすいので、例を出して順番に解説します。たとえば、新しくできた学校で「部活動を行う際のルールを決めたい場合」を考えてみましょう。
いきなり「野球部はこのルール」「サッカー部はこのルール」「陸上部は…、吹奏楽部は…、コーラス部は…」などと順番に決めていくと大変ですよね。
あなたならこのような場合どうしますか?
そうです、ここで抽象化を行うといいのです。
抽象化とは「重要な要素や共通な要素を抜き出して他は無視する考え方」のことを指します。ためしに野球部、サッカー部、陸上部、吹奏楽部、コーラス部の5つを抽象化してみましょう。
すると、野球部、サッカー部、陸上部の3つは「運動すること」が共通な要素なので「運動部」と抽象化できます。吹奏楽部やコーラス部も抽象化すると「文化部」とすることができますね!
運動部や文化部で「共通のルール」を決めておけば、あとは野球部やサッカー部などで個別に必要となる細かいルールだけ決めれば済みますね。
こうやって抽象化されてできた運動部や文化部の共通のルールは「再利用できて、かつ自由に改変できる性質」を持っているのです。
重要な部分や共通の部分をまとめて拡張性を上げる
さきほど抽象化した共通ルールは再利用ができて拡張性も高いといえます。
なぜそういえるのでしょうか?
たとえば、運動部の共通ルールで「雨天時は体育館で行うこと」とあったとします。でも野球は体育館で行うと危険なので、「野球部や雨天時でも外で行うこと」という風にルールを変えたくなったとしましょう。
その場合でも、野球部のルールを上書きするだけで、運動部の共通ルールは変える必要がありません。
運動部のルールを変えてしまうと他の部活にも影響が出てしまいます。
しかし、抽象化してそこから再利用しているので、個別に独自ルールを追加したり、変更したりすることが簡単にできてしまいます。また、新しく卓球部、バスケ部、テニス部を作りたいとなった場合はどうでしょうか?
その場合も簡単です。
同じ運動部なので、「運動部の共通ルール」がそのまま使えてしまうのです。運動部であればすべてに適用でき、必要であれば個別にルールを変更したり追加できます。
ですから、「再利用ができて拡張性がすごく高い性質」をもっているといえるのです。
Javaではどうやって拡張性を実現しているのか?
拡張性の解説をしている時にお気づきになった方もいらっしゃるかもしれません。
再利用性と拡張性が両方でてきましたね。
実はこの2つは切り離すことが難しいくらい仲の良い仲間のようなものです。再利用性の高め方を工夫することで拡張性が生まれるといってもいいでしょう。
Javaでは、クラスの作り方や継承の仕方を工夫することで拡張性の高いプログラムができあがります。
そのためにある仕組みの1つは「オーバーライド」です。(※Javaのインターフェースも性質は同じですが簡略化のため省いています)
継承したクラスでは、継承元のクラスのプログラムにさらに処理を追加したり、上書きして変更することができます。
継承元のプログラムを上書きして変更することを、Javaでは「オーバーライド」と呼んでいます。作りたいプログラムの重要な機能や処理をまとめて抽象化させてクラスを作れば拡張性の高いクラスができあがります。
先ほどの運動部の例でも、オブジェクト指向でいうと「卓球部、バスケ部、テニス部はそれぞれ運動部の共通ルールを継承している」ともいえます。
また、野球部は雨天時のルールを独自ルールに変更しましたが、これは「オーバーライド」しているといえますね。
抽象化したものを継承されるクラスにすることで、プログラムは再利用ができてかつ拡張性が高い性質をもつようになります。
ただ、1つ注意点があります。
オーバーライドはJavaで拡張性を高めるための「1つの手段」に過ぎません。クラスの継承、抽象クラス、インターフェースなど他にもたくさんあります。
何も考えずにクラスを適当に作って継承させたり、オーバーライドしても、拡張性を高めることはできません。拡張性を高めるために必要なのは、「抽象化すること」です。
同じ性質や同じ要素を持ったプログラムを適切に分けて、それに対してふさわしいJavaの機能を使うことによってはじめて実現できます。
全体をみてプログラミングしていく必要もあるので、拡張性を高めることは一番「難易度が高い」といえます。でも、それができるようになることで、上級者への扉を開くことができるのです。
拡張性を制するものは、プログラミングを制するといっても過言ではありません。
クラスについてもっと詳しく知りたい方へ
オブジェクト指向には「独立性」「再利用性」「拡張性」が重要とお伝えしてきました。
これらを実現する仕組みが「クラス」でした。
そのクラスについて、こちらで詳しく解説していますので、ぜひ参考にしてくださいね。
Javaを本格的に学んでみたいあなたへ
今回この記事で、Javaのオブジェクト指向について理解が深まりましたね。ここまで読んで
と思った人もいるのではないでしょうか。
独学で学習する場合、Javaは他のプログラミング言語に比べて挫折しやすい傾向にあります。有名な言語なので本や学習サイトでも学べるものはいっぱいあります。
ですが、オブジェクト指向もそうですが、学習を進めていくとか必ず壁にぶつかります。その壁を超えられなければ挫折という結果になってしまうのです。
そうならないためにも、プログラミングスクールで学習することをおすすめします。なぜなら
- 専属講師によるマンツーマンレッスンで学習効率アップ
- あなたに合った学習プランで最短スキル習得
- いつでも質問できる環境で理解度がアップ
など、あなたの学習をサポートし挫折させないための学習方法が用意されています。
ですがもし
このように思う人もいるでしょう。
その場合は、弊社で行っている「無料カウンセリング」に参加してみてください。この無料カウンセリングでは、業界屈指のコンサルタントによって、あなたがなぜプログラミングを学ぶのか目的をヒアリングさせていただいた上で、最適な言語選定や学習プランの提案をさせていただきます。
プログラミングを学んだ先の理想は一人一人違います。完全個別指導で、あなたに合わせた講師とカリキュラムで学習し、オリジナルサービスを開発することによって、転職やフリーランスデビュー、社内昇進など様々な卒業生がキャリアを伸ばすことに成功しています。
あなたもぜひ、無料カウンセリングに参加して自分だけの学習プランで学習を進めてみてください。
オンラインでも無料カウンセリングは受講できるので、気軽に下記のカレンダーより空いてる日にちを選びお申込みください。
お急ぎの方はこちらからお問い合わせください。
読み込みに失敗しました。
大変お手数ですが、本ページを再度読み込んでください。
再度読み込んでも、読み込み失敗が起こる場合は
こちらからお問い合わせください。
カウンセリングはオンラインにて実施しております。
※予約完了後に、カウンセリングのためのURLやIDなどをメールにてご案内します
1.ご希望の日時を選択してください
2.必須事項を入力してください
ご予約ありがとうございます!
予約が完了しました。ご予約情報とご参加前の準備をご確認ください。
【ご予約情報】○月○日(△) ○○:○○〜
カウンセリング参加に向けてのご準備
※記入いただいたメールアドレスに確認用メールをお送りしておりますのでご確認ください。
※オンラインカウンセリングはGoogle Meetにて実施します。URLが発行したら別途ご案内いたします。
※メールが届かない場合は、SAMURAI ENGINEERサポート(support@sejuku.net)までご連絡ください。
本記事の解説内容に関する補足事項
本記事はプログラミングやWebデザインなど、100種類以上の教材を制作・提供する「侍テラコヤ」、4万5,000名以上の累計指導実績を持つプログラミングスクール「侍エンジニア」を運営する株式会社SAMURAIが制作しています。
また、当メディア「侍エンジニアブログ」を運営する株式会社SAMURAIは「DX認定取得事業者」に、提供コースは「教育訓練給付制度の指定講座」に選定されており、プログラミングを中心としたITに関する正確な情報提供に努めております。
記事制作の詳しい流れは「SAMURAI ENGINEER Blogのコンテンツ制作フロー」をご確認ください。
この記事の監修者
株式会社SAMURAI
独学でプログラミング学習を始めるも挫折。プログラミングスクール「SAMURAI ENGINEER」を受講し、Web制作を学ぶ。副業でWeb制作を行いつつ、「初心者がプログラミングで挫折しないためのコンテンツ制作」をモットーにWebライターとして侍エンジニアブログ編集部に従事。