オブジェクト指向完全攻略(カプセル化/継承/ポリモーフィズム)

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

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

あなたはこんなことで悩んでいませんか?

「オブジェクト指向ってなに?」

「オブジェクト指向がいまだに理解できない…」

「どうやったらオブジェクト指向をマスターできるの?」

オブジェクト指向はプログラミングを学ぶ人たちにとってもっとも理解が難しいと言われています。

しかしオブジェクト指向が理解できれば、プログラムを効率よく書くことができるようになり、上級者への扉を開くことができます。

また、大規模なシステムやアプリケーションの開発にも臆することなく取り組むこともできるでしょう。

この記事では、オブジェクト指向について

・なぜオブジェクト指向は理解できないのか?
・なぜオブジェクト指向を使うのか?
・オブジェクト指向とは

という基本的な内容から、

・設計とは
・カプセル化とは
・継承とは
・ポリモーフィズムとは

などの具体的な内容に関しても解説していきます。

今回はオブジェクト指向について、体型的に理解できるようにまとめました!

オブジェクト指向は実は簡単!?

なぜオブジェクト指向は理解できないのか?

なぜオブジェクト指向は理解が難しいのでしょうか?

それは、オブジェクト指向は「概念」や「思想」のことだからです。

概念や思想は「ものごとの考え方」を表しているので、それを理解して習得することは容易ではないでしょう。

たとえば、他の人が何を考えているのか理解することは難しいですよね。

ましてや、他の人が持っている考え方を完全に真似して同じ行動をとるなどといったことは至難の技でしょう。

それと同じように、オブジェクト指向の考え方を理解して実践することは難しいです。

ベテランのプログラマーでも、最初から完璧にオブジェクト指向で設計しプログラミングすることはほぼ無理だと言われています。

しかし、オブジェクト指向の根底にある概念や思想を知って理解することは、プログラミング上達にかかせないことです。

オブジェクト指向に限らず、抽象的な「ものごとの考え方」は一般的に理解するのが難しいと言われています。

オブジェクト指向も抽象的な「ものごとの考え方」のままでは頭を悩ませるばかりです。

抽象的な「ものごとの考え方」を理解できるようになるには、具体的な事例を理解することがよいとされています。

抽象的な「ものごとの考え方」は目でみて手で触れて確認することはできませんが、具体的な事例であれば目や手を使って挙動を確認することができます。

ですので、オブジェクト指向を理解するためには具体的な事例に多く触れることをオススメします。

順番に理解していきましょう。

なぜオブジェクト指向を使うのか?

オブジェクト指向を理解する第一歩は、なぜオブジェクト指向というものが作られて使われるようになったのかを理解することから始めましょう!

世の中にあるものは必ず作られた理由を持っています。

なぜそれが作られたのか、という理由を知ることで物事を根底から理解できるようになります。

大規模なシステムやアプリケーションを開発する場合、大量のプログラムから構成されます。

大量のプログラミングから構成されると、コードが読みづらくなるのは当然のことだと思います。

コードが読みづらくなると、以下のような問題が生じます

  • 利用者が増えた場合に、他人がみてどこに何が書かれているかわかりにくい
  • 似たような処理をたくさん記述する必要があり、コードが不必要に長くなりさらにわかりにくくなる
  • 後で変更を加えようとしても変更部分を正確に把握することが難しく、変更が必要な部分を変更していなかったり、変更が不要な部分を変更してしまったりして不具合が発生する
  • 他の部分から意図とは違う不必要な変更が加えられ、不具合が発生する

オブジェクト指向は、大規模開発におけるこのようなさまざまな問題を解決するために作られた考え方です。

順番に例を出しながら、オブジェクト指向を理解していきましょう!

オブジェクト指向とは

オブジェクト指向は、ひとことでいうと「いかに効率よく開発を行うか」を突き詰めた考え方です。

大規模なシステムやアプリケーションの開発では、大量のプログラムを扱っていきます。

大量のプログラムを扱ううえでは、「わかりやすさ」が重要になってきます。

そのわかりやすさを実現しているのは、オブジェクト指向の名前にもなっている「オブジェクト = モノ」という概念が重要です。

そしてこの「オブジェクト = モノ」という概念において、「モノ同士の関係性を作っていく考え方」も重要になってきます。

「モノ」と「モノ同士の関係性」を考え作っていくプロセス「設計」と呼びます。

設計するときには、オブジェクト指向の3大要素と言われる「カプセル化」「継承」「ポリモーフィズム」という考え方が必要になってきます。

これから先は、「設計」、「カプセル化」、「継承」、「ポリモーフィズム」について説明していきます!

なおこちらの記事で、オブジェクト指向の概念を解説していますので、ざっくりつかむことができるでしょう。

設計とは

開発を行う際には、最初に設計を行います。

一般的にも設計は非常に重要とされていますが、オブジェクト指向においてはもっとも重要となります。

あらかじめ開発で扱うデータや振る舞いを定義しておき、それらを上手に効率よく実現するためには、設計が不可欠です。

「オブジェクト = モノ」の振る舞いや定義を設定し、「モノ同士の関係性」を上手に効率よく実現させる仕組みにすることが設計の重要なポイントとなります。

ですので設計を行わないと、全体で最適にプログラミングを行うことができません

それによって、あとから修正が入ったり、不具合が入って開発に支障が出ることになります

設計において、特に注意を払うべき点は以下のような項目です。

  • 「オブジェクト = モノ」の振る舞いや定義が明確で、利用者が増えても理解しやすいものになっているか?
  • 利用者が増えても使える拡張性の高いものになっているか?
  • ほかのオブジェクトとの関係性の中で、データを壊されるなどのセキュリティ的な破たんはないか
  • 特定の処理に時間がかかってしまうなどのパフォーマンスが低い部分はないか

こちらの記事で、設計の必要性や重要さを解説していますので、参考にしてください。

カプセル化とは

オブジェクト指向の代表的な考え方の1つに、「カプセル化」というものがあります。

カプセル化とはかんたんにいうと、できるだけ他のプログラムから干渉されないようにする仕組みです。

「モノ同士の関係性」を上手に効率よく実現させるためには、他のプログラムと密に関係性を持つ部分と干渉されない部分を明確に分ける必要があります。

カプセル化によって、他のプログラムから干渉されない部分を明確にするということになります。

そもそも、一般的に「カプセル」とは物を封じ込める容器のことですね。

病気になった時に、粉末の薬が入ったカプセル剤を飲んだことがあるでしょう。

カプセルには中の薬が外の空気に触れて科学変化しないようにできたり、他のモノと混ざらないようにできるといったメリットがあります。

それと同じように、プログラムをある程度まとめてカプセル化することで、他のプログラムから干渉しづらくなったり、管理しやすくなるなどのメリットがあります。

オブジェクト指向のプログラミング言語では、カプセル化を「クラス」というもので実現しています。

クラスは、プログラミングの中心となるので、設計図とも呼ばれています。

クラスについては、こちらの記事で詳しく解説していますので、クラスやクラスに関わるインスタンスメソッドなども理解ができるでしょう。

継承とは

継承とは、プログラムの再利用性を高める考え方のことです。

大規模なシステムやアプリケーションの開発では、大量のプログラムを扱っていきます。

大量のプログラムの中には同じようなプログラムも多く含まれるようになります。

同じようなプログラムを複数つくっていくと、大量のプログラムの中ではどのプログラムが似ているか見づらくなります

そんな状況のなかで、1つのプログラムに修正や改良を加えた場合は、他の同じようなプログラムもすべて変更する必要があります。

すると、1カ所だけ修正を間違えたり、修正を忘れたりして余計な不具合を含んでしまったり、余計な時間が必要になってしまいます

同じようなプログラムをまとめて、まとめたものを再利用することで、このような問題を防いでいるのです。

継承についてはこちらの記事で詳しく解説しています。

継承が作られた理由や、実際にどうやって使うのかというイメージが湧くでしょう。

ポリモーフィズムとは

ポリモーフィズムとは、「オブジェクト = モノ」によって振る舞いを様々に変えられる仕組みのことです。

ですのでポリモーフィズムは「多様性」と呼ばれたりします。

さきほど継承の説明で、プログラムの再利用性を高める考え方と説明しました。

ポリモーフィズムも再利用性を高める考え方に含まれます。

継承は同じようなプログラムをまとめて、共通化して使うような考え方でした。

でも継承ばかりだと、同じ振る舞いをするプログラムしか作成できないということになります。

同じ振る舞いをする部分は共通化しつつも、違う振る舞いにしたい部分は目的に合わせて変えられるのがポリモーフィズムです。

ポリモーフィズムによって共通化した部分を使いながら、簡単な処理から複雑な処理までパフォーマンスの異なる処理をそれぞれの目的に合わせて実行できるようになっています。

Javaにおけるオブジェクト指向とは

オブジェクト指向プログラミング言語はオブジェクト指向と密接に関係しています。

Java、Ruby、PHP、Python、JavaScriptなど、今人気のある言語はほとんどがオブジェクト指向を持つプログラミング言語です。

これらのプログラミング言語の共通点はWEBサイトやアプリケーションの開発用に使われるという点です。

WEBサイトやアプリケーションの開発には、ユーザーが操作するためのGUI(Graphical User Interface)と呼ばれる表示画面や操作ボタンなどの部品を持つフレームワークが必要となってきます。

GUIの表示画面や操作ボタンなどの部品もまさに「オブジェクト = モノ」ということになります。

これらの部品を持つフレームワークは大量のプログラムで構成されています。

大量のプログラムで構成されるフレームワークを効率よく作り上げるためにも、オブジェクト指向は大切で不可欠な考え方です。

具体的に、プログラミング言語でどのようにオブジェクト指向が使われているのかを知ると理解がしやすいでしょう。

こちらの記事で、Javaを例にして、オブジェクト指向がどのように実現されているのかを詳しく解説しています。

Javaでプログラミングを効率よく行う方法がわかるでしょう。

まとめ

ここでは、オブジェクト指向について説明しました。

オブジェクト指向は大きく4つの考え方がありました。

・設計
・カプセル化
・継承
・ポリモーフィズム
の4つです。

設計もっとも重要で、効率よく開発を行うためには不可欠な要素です。

設計をカプセル化継承ポリモーフィズムなどの考え方を駆使して行い、読みやすく書きやすいプログラミングを実現していきます。

最初から完璧なオブジェクト指向でプログラミングを行うことは非常に難しいので、理解できた部分から実践して覚えていくことが重要です。

実践で身につけることが必要なので、焦らずゆっくり1つ1つ理解していくといいでしょう。


33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーランスをされている市川友哉さん。33歳で、プログラミングを学び始め、4ヶ月という短い期間でフリーランスエンジニアとして独立までされた学習ログを余すことなくインタビューさせていただきました。

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


自分にプログラミングなんて・・・と思っていませんか?

今後10年間で今ある職業の『77%』はなくなると言われています。

人工知能や機械学習を筆頭にVR、AR、ドローンなどの最先端技術の発達はこれからのあなたの働き方に間違いなく影響を与えるでしょう。

将来を見据えてプログラミングができるようになってエンジニアになりたい、自分だけにしかできないクリエイティブな仕事がしたい、、、とお考えの方も少なくないでしょう。

と、同時に「難しそう、、自分にはできないだろう、、、」と諦めている方も多いのではないでしょうか。

弊社マンツーマンレッスンは、お一人お一人に専属のインストラクターがつくので、通常のスクールでは難しい、オリジナルアプリ開発や、フリーランスとしての仕事獲得まで支援しています。

まずは『無料体験レッスン』で弊社コンサルタントと一緒にあなた専用の学習カリキュラムを考えてみてはいかがでしょうか?

詳しくは下の画像をクリックしてください。

cta_mtm2

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

活躍する現役エンジニア

人気記事セレクション

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】
プログラミング講師@佐野裕史
自分でプログラミングができない人のために情報を発信しています。
お気軽にフォローください。