1.オブジェクト指向とは?
オブジェクトって何?という疑問があると思いますが、オブジェクトそのものの説明の前に、「なぜオブジェクト指向か?」という説明をします。
テストに出るわけではないのですが、数あるプログラム言語のなかでJavaがこれほどまでの隆盛を築いた理由だったりもするので、頭の片隅に入れておいてください。
まず、昨今のシステム開発において課題とされることが2点あります。
「開発期間の短縮」と「システム仕様変更への対応」です。
これらの課題に対して、システム開発では下記のことを実現すべきであると言われています。
①以前に作成したプログラムの再利用
②大人数での開発
③プログラムの変更箇所をわかりやすくする
④1つのプログラムを変更した際、他のプログラムに影響が出ない
上記を実現するために考案されたのがオブジェクト指向です。
分かりやすく嚙み砕いて言うと、システムを分かりやすく分割し、それぞれで構築することです。この分割したもののひとつひとつがオブジェクトと呼ばれるものです。
なかなか理解が難しいかもしれませんね。
例えば・・・ラジカセの開発の場合
ラジオ機能、CDの機能、カセットテープの機能が必要だとしましょう。
その場合・・・
オブジェクト1 →ラジオ
オブジェクト2 →CD
オブジェクト3 →カセットテープ
上記のような形に分けて開発を進めて、最後に合体。とした方が良いと思いませんか?
・同じプロジェクトをオブジェクト単位でチーム分けが可能。管理しやすい。
・あるチームに致命的なバグが出ても、他チームに影響が出ない。 etc…
オブジェクト指向により、開発するのに便利なことがいっぱいなのです。
何となくオブジェクト指向のことがわかってきた所で、次に進みましょう。
2.オブジェクトとは?
先程はわかりやすいようにラジカセで説明しましたが、次はエアコンの例を見てみましょう。
まず、エアコンの一連の動作をザックリ
①電源がONになる。
②室内の温度を知る。
③設定温度を知る。
④室内温度と設定温度の差に合わせた運転モードで運転する。
上記のような流れで動作しています。
赤字で示したとおり、エアコンが動作するにあたり、エアコンが知っておかなければならないものが電源、室度、設定温度、運転モードであることが分かると思います。
これこそが属性(変数)なのです。
ここでは4つの属性が出てきました。これらの属性には必ず操作が機能が付随してきます。これが表内で言うところの操作にあたります。
ここからが重要!
上の図を見れば、
電源をON/OFFする電源係。
室内温度を測ったり、設定温度を決める温度係。
温度係の情報をもとに暖房/暖房 等実際に動作する運転係。
電源係、温度係、運転係、このように役割分担ができています。
電源係はその他の係の情報を必要とせず動けます。この独立して動ける役割のことを・・・オブジェクトと呼ぶのです!!
オブジェクトが属性と操作を一体化しているのがわかると思います。
これをカプセル化と呼びます。
◎ カプセル化 とは・・・?
唐突に出てきたカプセル化という言葉ですが、詳しく説明していきましょう。
① オブジェクトの内部構造を知らなくても使える。
※エアコンを例にすると、設定温度の変更はリモコンで行える。
その時、内部の構造(どんなプログラムなの?etc…)は知らなくて良い。ということ。
② 属性値の変更は操作経由。
※エアコンの場合、リモコンで設定変更するしかない。ということ。
③ 操作方法が同じなら、内部構造を変更してもユーザーは変更を意識しない。
④ 属性値に不整合な値が入らないよう操作で制御できる。
→②や④の様に、属性値を保護することを、データ隠蔽と呼びます。
カプセル化によるメリットは
・内部構造が変わっても操作は同じ
・おかしな操作ができない
(※エアコンで設定温度70℃なんてできないetc…)
朧気ながら、カプセル化の意味やメリットを理解してもらえればOKです。
3. クラスと継承
クラスと継承。
これはオブジェクトとは何ぞや。より理解しやすいと思います。
早速始めましょう。
●クラス
下の図を見て下さい。
図のように、電源オブジェクトA,Bに共通する部分を抽象化したものをクラスと呼びます。
ここでは電源クラスが出来ました。
このクラスはオブジェクトを作成する為の土台になるのです。
●インスタンス化
土台であり、雛型であり、設計図であるクラスはそのままでは使えません。
インスタンス化とは、インスタンス(クラスを基にした実際の値としてのデータ)を生成することで、要は、使えるモノにすることを指します。
エアコンの電源クラスを例にした場合、下記の図のようになります。
電源クラスという1つのクラスに対し、
属性がONのオブジェクト
属性がOFFのオブジェクト
複数のオブジェクトができました。
このようにインスタンス化することにより、
・1つのクラスから複数のオブジェクトを生成可能
・別のオブジェクトでありながら、当然同じ属性、操作を持つことができる
・属性に入る値はそれぞれのオブジェクトごとに管理される
インスタンス化することにより、上記が可能になるのです。
●継承
「インスタンス化」を理解して頂けたところで、次に「継承」について学んでいきましょう。
前項では電源クラスを例に説明してきました。
「単純なON/OFF機能の電源クラス」については理解できたとして…
「電気代表示機能付きの電源クラス」が必要な場合…どうしましょう?
わざわざ「電気代表示機能付きの電源クラス」を新しく定義するしかないのでしょうか…?
Javaは、既にあるクラスを拡張して新しいクラスを定義することができるのです。
これを継承といいます。
図を見て頂けるとわかるでしょうか。
サブクラスはスーパークラスの属性と操作を引き継ぐ為、電源ON/OFFの定義をせずとも良く、余計な手間が省けます。
このように、サブクラスをインスタンス化するとスーパクラスの属性と操作を引き継いだオブジェクトが生成可能なのです。
●インターフェース
オブジェクトを利用するユーザーの為に、操作をまとめたクラスの仕様の事をインターフェースと呼びます。
説明をするより、例を挙げたほうが早いです。CDラジカセを思い浮かべて下さい。下記の図が思い浮かびませんか。
再生、停止、一時停止、それぞれのマークの意味は分かりますよね。
この仕様こそがインターフェースなのです!
●ポリモフィズム
インターフェースで例に挙げた再生、停止、一時停止のマークですが…
これらのマークは、CDラジカセだけでなく、MDやカセットテープ等にも同じマークが用いられています。
これこそがポリモフィズム(多態性、多相性)と呼ばれるものです。
例えば、あるプログラムを修正しても、インターフェースを変えない(ポリモフィズムを実現する)のなら、ユーザーには影響しない。
格好良く言うと・・・
ポリモフィズムを活用することで、プログラムの再利用性が向上する。