JAVA　オブジェクト指向[1] - オブジェクト指向とは

##### 「オブジェクト指向」とは
コードが長く複雑になりすぎて、開発者（人間）自身がその内容を把握しきれないという課題が出てくるかと思う。
そこで、人が内容を把握しやすいプログラム開発の実現を目的として誕生したのが、「オブジェクト指向プログラミング」という「考え方」である。
オブジェクト指向とは、ソフトウェアを開発するときに用いる「部品化」の考え方。

オブジェクト指向言語：Javaもその１つ。オブジェクト指向の考え方に沿ってプログラムを作りやすい配慮がなされているプログラミング言語。

●メリット
・プログラム開発時に「手続きを想像して作る」必要はない。現実世界をお手本にそれを真似して作れば良い。
・現実世界の登場人物に変化があった場合、対応する部品（クラス）を修正、交換すれば簡単にプログラムを修正できる。
・プログラムの変更が容易になる（柔軟性・保守性の向上）
・プログラムの一部を簡単に転用できる（再利用性の向上）

●オブジェクト指向の全体像と本質
「手続き型プログラミング」とは、開発者が頭を捻り、コンピュータがどのように動けばよいかという手順を考え、プログラムの先頭から順に命令として記述していく方法。文法をそのままベタ打ちしていくイメージ。
一方オブジェクト指向で開発を行う場合は、いきなりコードを書かない。まずプログラムで実現しようとする現実世界をを観察し、そして設計図に落とし込んでいく。この設計図はITの知識がない一般の人に見せても理解できること。
オブジェクト指向の開発では、設計図の中の登場人物や物の１つ１つを部品と捉え、それを「クラス」という部品で記述していく。
・オブジェクト指向による部品化のルール：現実世界に出てくる登場人物の単位で、プログラムをクラスで分割する.
<img width="500"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162001/2e56c4cd-8e0f-6888-0f31-1e471c6e2ec1.png">

●「開発時に作るクラス、実行時に動くオブジェクト」
開発者が作成する部品（クラス）とは、例えばATMのプログラムであれば「Uketsuke.java」「Uketsuke.class」のようなファイルとしてPCに保存されている。
開発時に作られたクラスは、プログラムとして実行されると、それぞれ仮想的な登場人物のオブジェクトとしてJVMの中にその存在が生み出される。
そして、「仮想的な〇〇」、「仮想的な△△」、「仮想的な□□」などが、コンピュータ（JVM）という「電子的な仮想世界」の中に作られ、現実世界をそっくり真似た「Java仮想世界」とでもいえるような世界を形成する。
<img width="550"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162001/d79008ad-bc58-c63f-49af-26ff2a82e996.png">

●オブジェクト指向の本質
現実世界の登場人物とそのふるまいを、コンピュータ内の仮想世界で再現する。

●オブジェクトと責務
・オブジェクト指向プログラミングでは、開発者はそれぞれの部品（クラス）に「責務」をプログラムとして書き込む。
・仮想世界で動くそれぞれのオブジェクトは、あらかじめ設定された役割を果たす責任（例.行動責任/情報保持責任）を負っている。
これらの責任を果たす為に、それぞれのオブジェクトは「属性」と「操作」を持っている。
　【属性】その登場人物に関する情報を覚えておく箱
　【操作】その登場人物が行う行動や動作の手順
<img width="300"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162001/c253c1f1-15d7-5e41-578b-1767839cb3cb.png">

●オブジェクトのふるまいと相互作用
１つのオブジェクトには複数の操作を持つことがある。
そしてmainメソッドやほかのオブジェクトから、それらオブジェクトの操作を呼び出す（行動指示を送る）ことが出来る。
<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162001/de56f511-d4a0-be7a-3763-8fd7a73824e1.png">

また、あるオブジェクトから別のオブジェクトへ操作の指示を送ることも可能。例えば、mainメソッドから〇〇に「催眠ガス」という指示を送ると、〇〇は△△が持っている操作の中から「眠る」を呼び出す。すると△△は眠ってしまう。
<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162001/9ec594f4-1e67-bbe7-85e4-001cf4875228.png">

オブジェクトは別のオブジェクトがもつ操作を呼び出すだけでなく、他のオブジェクトの属性を取得したり書き換えたりもできる。例えば、mainメソッドから△△に「戦う」という指示を送ると、△△は戦い、結果として〇〇のHP属性を書き換えて減らすことが出来る。
<img width="400"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162001/760e4334-23dd-0d14-70de-36e939edd359.png">

このように考えると、コンピュータの中の仮想世界で各オブジェクトが互いの属性を書き換えたり操作を呼び合ったりして、物語を繰り広げていく姿が目に浮かぶはず。
仮想世界のオブジェクトは互いに「属性」を読み書きしたり、「操作」を呼び出したりして連携し、全体では１つのプログラムとして動きます。
そして、仮想世界の中で「仮想的な受付」や「仮想的な口座」が現実世界同様に正確に動いているからこそ、
現実世界の「本物の受付係」や「紙の口座帳簿」は仕事から解放され、コンピュータによる自動化が可能になる。

---
##### 学習のコツ
「文法、記述方法のルール」は「正解自体」を学ぶ。
オブジェクト指向である「インスタンスとクラス、クラス機構、継承、カプセル化、多態性」は「正解に辿り着くための考え方」を学ぶ。

文法は、着実にマスターしていくのがコツ。
オブジェクト指向を学ぶコツは、概念や理解することやイメージすることをより重要視する必要がある。
また１回では理解できない為、「繰り返し」学んで理解を深めるのがコツ。


●オブジェクト指向で学ぶ項目
・インスタンスとクラス
・様々なクラス機構

・オブジェクト指向の３大機能
　継承　　　＋α　　高度な継承
　カプセル化
　多態性

---
##### オブジェクト指向の３大機能
オブジェクト指向言語には、開発者が「より便利に安全に」現実世界を模倣できるよう、文法などに専用の機能が準備されている。
それが下記３つである。
・継承
・カプセル化
・多態性
<img width="550"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162001/b0c744a4-4f2f-830a-d5a5-67145d25d909.png">

★継承
過去に作った部品を流用し、新しい部品を簡単に作れる機能。
例）すでに「勇者」という部品があれば、空を飛べる「スーパー勇者」は簡単に開発出来る。

★カプセル化
属性や操作を、一部の相手からは利用禁止に機能。
例）現実世界では、剣が勇者に「眠れ」という指示を出すことはまずありえない。
その為、眠る操作は、剣オブジェクトから呼べないようにしておいた方が安全。

★多態性
似ている2つの部品を「同じようなもの」とみなし、「いいかげん」に利用できる機能。
例）お化けキノコとオオコウモリでは、厳密には攻撃の仕方が微妙に異なるはず。
しかし、違いを気にせずどちらも「同じようなもの」とみなし、「戦う」操作で攻撃できる。