上司「〇〇君、オブジェクト指向ってわかる？」私「・・・」

# 1 はじめに
※この記事は読み物として見てください。
この記事はプログラミング未経験者でも、<font color="Red">オブジェクト指向を体系的に理解できる</font>ようになるように書いていくことを目標とします。
私も今年の新卒で、まだまだ勉強中の身ですがJavaの研修を通して永遠に上手くイメージできないのが、
### オブジェクト指向って・・・？
![question_head_gakuzen_boy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732993/7c62e620-b15d-5aa3-c615-d7ff0090764e.png)
ということです。

来年、入社してくる新卒もきっとオブジェクト指向に苦戦する（偏見）と思うのでそんな時に見れる、わかりやすい自家製の記事があったら最高じゃないですか。
ということで、自身の勉強も兼ねてオブジェクト指向についてまとめていこうと思います。
# 2 オブジェクト指向は常識！？
ここでタイトルに戻ります。

***上司「〇〇君、オブジェクト指向ってわかる？」***

***私「・・・保守性を高めて、再利用性があって・・・」***

研修で習った断片的な情報を必死で思い出す私。
これじゃ説明になっていないことは自分でもわかっていますが「何か答えなきゃ」という思いで、必死で考えます。

皆さんならどのように答えますか？また、どのように答えれば正解だと思いますか？現在の私は
### 正解はない！
と考えています。オブジェクト指向の説明は千差万別だと個人的には感じていますし、それほどにオブジェクト指向は複雑だとも感じています。
なので、私の記事もあくまでいろいろなネット記事や文献を参考にした個人的見解ですので、「そういう考え方もあるんだな～」程度に思って、暖かい目で見守ってください。
# 2 そもそもフワッとしすぎ
私がオブジェクト指向を難しく感じる要因はオブジェクト指向に対して「概念的」なイメージがあるからだと感じています。
スパっと定義してくれたらわかりやすいのに・・・とも思います。
故にその実態をイメージさせるべく様々な比喩表現があります。
どの比喩表現が自分にマッチしているかは自分で調べて見てみてください。
# 3 オブジェクト指向について
さて、少々長くなりましたが本題に入っていきます。まずは言葉の意味を捉えていきます。
***object = モノ***
***orient　= ～方向づける***
ということで、
***OOP = Object Oriented Programming language:オブジェクト指向プログラミング言語***
などと言ったりもします。では、ここで言う「モノ」とは何でしょうか？

私は、
***プロパティ***（属性）や***メソッド***（処理）といった機能を***クラス***（データの集まり）でひとまとめにしたものだと考えます。（プロパティやメソッドなどもモノだと思いますが・・・）

まぁ、あくまで自己解釈です。
重要なのが***このクラス（モノ）は人間が扱いやすい***という点です。

もっとわかりやすく説明されている記事を載せておきます。
[【初心者必見】オブジェクト指向をわかりやすく解説](https://blog.codecamp.jp/object-orientation-explanation)

読みましたか？では次に進みます。
# 3 オブジェクト指向3大原則
### ・・・こういうのがあるなら早く言って！！
いや、完全に研修で言ってはいたんですが、「３大○○！」みたいな感じではありませんでした。
個人的にこういうのがあると覚えやすいです。
（BLEACHの護廷十三隊とかキングダムの趙の三大天とか・・・。）

早速紹介していきます。
## ①継承
個人的に継承はあまり難しく感じてはいません。
簡単に説明すると、複数のクラスに共通する機能を1つのクラスにまとめておいてそのクラスを各クラスに「継承」させることにより、まとめておいた処理などが使えるというものです。
私も継承を使ったことがあるのですが本当に書いてある通りです。
ただ、
### めっちゃ便利
だとは感じています。
詳しくは以下をご参照ください

[オブジェクト指向「継承」とは？わかりやすく解説してみた](https://www.sejuku.net/blog/9598#:~:text=%E7%B6%99%E6%89%BF%E3%81%AF%E3%80%81%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9,%E3%80%8C%E3%82%B5%E3%83%96%E3%82%AF%E3%83%A9%E3%82%B9%E3%80%8D%E3%81%A8%E3%81%84%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)
## ②カプセル化
続いてカプセル化です。
カプセル化と聞くとどんなイメージを持ちますか？
カプセル化は文字通り情報をカプセルに入れて不正アクセスなどを防ぐやり方です。
そのうえでアクセス修飾子も外せないので例として一応Javaのアクセス修飾子を載せておきます。
|アクセス修飾子|アクセス可能範囲|
|:---:|:---:|
|public|すべてのクラス|
|protected|現在のクラスとサブクラス+同パッケージ内|
|(なし)|現在のクラスと同パッケージ内クラス|
|private|現在のクラスのみ|


研修の時はなんかprivateで変数の宣言して、privateだからコンパイルできなくて・・・など、演習問題をやる際に散々苦しめられました。
なので正直めんどくさいなと思っていましたが、
### データ保護の観点から言うと必須
です。
詳しくは以下をご参照ください

[オブジェクト指向の「カプセル化」とはなにか？超わかりやすく解説します！](https://webpia.jp/encapsulation/)
## ③ポリモーフィズム
最後に、ポリモーフィズムです。これは私が一番理解に苦労したところでもありますが、先ほどのカプセル化の記事に関連してあるものを見たら多少理解がまとまりました。

[オブジェクト指向の「ポリモーフィズム」とは？超わかりやすく解説します！](https://webpia.jp/polymorphism/)

上の記事の結論だけまとめると

***・コードが見やすくなり、可読性が上がる***

***・変更に対して柔軟に強く出れる***

の2点がポリモーフィズムの大きな特徴のようです。
こちらについては自身でももっと勉強して理解を深めていけたらと思います。
# 4 オブジェクト指向のメリット
以上から私が考えるメリットを簡潔に言うと、
### 保守性・再利用性が高い。
・・・いや、結局それかい！と自分でもなりました。
もちろんこれは***継承・カプセル化・ポリモーフィズム***を理解していないと意味はありません。
研修先の先生も言っていましたが、変更箇所が大きければ大きくなるほど保守性が高いというのはありがたい、と。
また、再利用性についてもモノの独立性を高めるオブジェクト指向だからこそと言えます。

オブジェクト指向のメリット・デメリットについてはネットで様々な考え方がありました。
どれも間違っていないと思います。私が載せたのはほんの一例ですので是非色々な記事を見てみてください。
# 5 おわりに
今まで敬遠してきたオブジェクト指向ですが今回のまとめ記事のおかげで少しは理解できたように思います。
そして、私がまとめるまでもなくわかりやすい優良な記事がネットには転がっていました。
なので、オブジェクト指向について再度考えるきっかけにでもなれば幸いです。

最後まで読んでいただき、ありがとうございました。