誰でもわかるオブジェクト指向

## はじめに

初めて僕がプログラミング勉強した時の先生の第一声が「本日からオブジェクト指向で進めていきます」でした。
先生にばれないようこっそり「オブジェクト指向とは」と初ググリをして、イマイチ理解できなかったことを今でも覚えています。

オブジェクト指向はプログラミングするための考え方なので、実際に開発をしていかないと初学者の方にはなかなか掴みづらい考え方なのかなと感じます。

そこで今回はプログラミングをしたことがない、でもTwitterをしたことがある人であればオブジェクト指向の意味を理解することができるようにできるだけTwitterを例に挙げて、なるべく噛み砕いて記事を書いてみたので最後まで読んでいただけると嬉しいです。


## 恋人選びの基準は、年収指向?性格指向?いいえ私はオブジェクト指向

一言に、
オブジェクト指向とは、__プログラミングのスタイル(考え方)の一つで一番メジャーなプログラミングスタイル__です。

なぜ、オブジェクト指向が一番メジャーなプログラミングスタイルなプログラミングスタイルなのかというと、
__プログラムを効率良くわかりやすく書く考え方でソフトウェア開発を楽に行うことができる__からです。

プログラムを効率良くわかりやすく書く考え方とは、一体どのような考え方なのか...

それではまず、オブジェクト指向の言葉を分解して説明していきたいと思います。

オブジェクト指向を、「オブジェクト」と「指向」と分けてそれぞれ意味を理解していきましょう。

ここでいう__「オブジェクト」とは「モノ」__になり、
__「〇〇指向」というのは「〇〇を中心に考える(大事にしていること)」__という意味合いで使われます。

恋人を選ぶ時、年収指向の人もいれば、性格指向の人もいると思います。
年収を中心に恋人を選ぶ、性格を中心に恋人を選ぶ、これと同じように__「モノ」を中心に考える__ これがオブジェクト指向になります。

「モノ」を中心に考えてプログラミングをするということわかったけど「モノ」ってなに？と思った方もいるかもしれません。
現実世界でいう「モノ」には、鉛筆だったり消しゴムだったり形のある物体のことを指すため理解しやすいかもしれません。

しかし、オブジェクト指向でいう「モノ」とは、必ずとも形があるわけではなく、形がないものを「モノ」として扱ってもいいのです。

。。。

大丈夫です。ここからはTwitter例にあげていきます。

Twitterのアプリの中の世界で、「モノ」とは、
Twitterを使うユーザーも「モノ」、ツイートも「モノ」、いいねも「モノ」、コメントも「モノ」なのです。

このように形がないものを「モノ」と扱っても良いんです。

しかし、ツイートを「モノ」として扱ってもいいし、必ず「モノ」として扱わないといけないというルールもありません。

。。。。

ここがややこしいポイントでもあるのですが、
プログラムを書く時に、何を「モノ」として、何を「モノ」としないかは、開発者の自由なのです。

開発者が、Twitterを作る時に、ツイートを「モノ」として定義したらツイートは「モノ」、ツイートを「モノ」として定義しなければツイートは「モノ」ではなくなります。
（僕がTwitter作るならツイートは「モノ」として定義します）

Twitterにはどうような「モノ」が必要か開発者が考えて、
ツイートという「モノ」
ユーザーという「モノ」
いいねという「モノ」
フォロワーという「モノ」
と定義して、これを組み合わせることで簡単な機能を持ったTwitterができあがります。

この小さい部品を組み合わせてシステムを作っていくように、__オブジェクト指向とは、「モノ」を中心に考えて「モノ」をたくさん定義して組み合わせていくことで大きなシステムを作っていくスタイル__になります。
塵も積もれば山となる のような感じです。

「モノ」と「指向」の意味はなんとかくわかったけど__「モノ」を中心に考える__とはどういうこと?って人もいると思うので、
更に噛み砕いて__「モノ」を中心に考える__とはどういうことかTwitterを例に説明します。

Twitterを「モノ」中心に考えた場合、(モノ指向)
>
- ツイートという「モノ」
 - ツイートの内容(データ)
 - 文字数制限
 - いいねされる機能
 - コメントされる機能

>
- ユーザーという「モノ」
 - このユーザーがファローしてるユーザー(データ)
 - ファオローワー(データ)
 - フォローする機能
 - フォローされる機能

Twitterを「機能」中心に考えた場合、(機能指向)
>
- つぶやきをする機能
- フォローする機能
- 文字数制限
- いいねされる機能
- フォローされる機能
- コメントされる機能

このように、比べるとどちらがわかりやすいか明らかだと思います。
その「モノ」にどのような機能があるかどういう要素や動きをするかを、「モノ」単位で考えていく、この考え方が__「モノ」を中心に考える__ということになりこの考え方こそオブジェクト指向なのです。


①オブジェクト指向とは、プログラムを効率良くわかりやすく書く考え方
②オブジェクト指向とは、「モノ」を中心に考えること

①と②どっちがオブジェクト指向？となった方のために説明しておくと、

「モノ」を中心に考える → オブジェクト指向でも正しいのですが、
細かく言うと、
「モノ」を中心に考える → 効率良くわかりやすい → オブジェクト指向
このように考えてもらえば大丈夫です。


## 結婚相手もオブジェクト指向で選びます。

「モノ」をたくさん定義(大量生産)するために、クラスとインスタンスの概念が必要なのでここからは、クラスとインスタンスの概念を説明していきたいと思います。

先ほどから「モノ」を定義してきましたが、__「モノ」を定義するための構文のことをクラス__と言います。
その中身には、「モノ」がどういう__要素（データ）__からできていてどういう__処理や動き__をするかが書かれています。
もう少し噛み砕くと、

>
- ツイートという「モノ」
 - ツイートの内容(データ)
 - 文字数制限
 - いいねされる機能
 - コメントされる機能

先ほどのこれで言うと、
「モノ」 → ツイート、
要素（データ） → ツイートの内容、
処理や動き → 文字数制限・いいねされる機能・コメントされる機能となります。

このクラスの中身には
ツイートを定義するために、ツイートにはツイートの内容という要素（データ）がくるよ〜。
ツイートには、文字数制限・いいねされる機能・コメントされる機能処理や動きがあるよ〜。
という、
どのツイートにも共通に言えることを書いています。
この書かれている構文がクラスになります。


そして実は今まで何度もでてきた「モノ」の実態は、インスタンスなのです。

「スタバなう」というつぶやきをした場合、
このクラスをもとに、
クラスの要素（データ）に「スタバなう」というツイートの内容が入り、
文字数制限・いいねされる機能・コメントされる機能をもった、
「スタバなう」というツイートのインスタンス(「モノ」)ができあがります。

ちなみに召喚獣を召喚してインスタンス化したい方はこちらの記事がおすすめです。
[やっと分かった「インスタンス化」](https://qiita.com/smtwtfs/items/5cbf3d727e7893e45815
)

話は戻りまして、
クラスとインスタンスの概念を、たい焼きを例に挙げると、たい焼きを焼く金型がクラス、その金型を使ってあんこや生地という要素(データ)をもとに作られたたい焼きがインスタンスという感じです。

何度も1から手作りでたい焼きを作るのは大変だから、たい焼きを焼く金型（クラス）を作っておいてそこにあんこや生地（データ）を入れるだけにしてたい焼き(インスタンス)作れば楽になるよ〜って考え方、この考え方こそオブジェクト指向の根底にある考え方なのです。

冒頭に言ったオブジェクト指向を使うと開発を楽に行えるというのはこういった考え方をもとに開発をしていくためです。

例えば、種類が違うたい焼きを作ろうとした場合でも、
つぶあんのたい焼きを作りたければ、あんこ（データ）をつぶあんにしてあげるだけでつぶあんのたい焼きができる。
こしあんのたい焼きであれば、あんこ（データ）をこしあんにしてあげるだけでこしあんのたい焼きができる。
このように同じ金型(たい焼きクラス)であんこ（データ）を変えてあげるだけで、違う種類のたい焼き(たい焼きインスタンス)ができあがります。
違うたい焼きだからといって、わざわざ1からたい焼きを作る必要はない(あんこデータを変えるだけでいい)のです。

更に、クラスとインスタンスの概念をTwitterのユーザーを例にあげてみます。
あなたがTwitterを登録する時、アカウント名・メールアドレス・パスワード・紹介文などの要素（データ）を入力すると思います。
その時、アカウントを手作りするというよりか、Twitterの指示されたままにあらかじめ決まったデータを入力するだけで、
ユーザークラス(金型)に、入力されたアカウント名・メールアドレス・パスワード・紹介文などの要素（データ）が入り、
あなた(インスタンス)というアカウントが作成されます。

あなたは、Twitterのアカウントを作成する時、たい焼きでいえば、あんこを入れているだけなのです。

Twitterの世界ではみんな同じユーザーという型に、
決まりに沿った自分のデータを入れて、
他の人とパターンは同じ、内容だけが違う自分オリジナルのアカウントができています。

そのためTwitterのユーザーのクラスは世界に1つだけですが、ユーザーのインスタンスはユーザーの数だけ存在します。
ツイートもクラスは1つだけ、インスタンスはツイートの数だけあります。

クラス1対インスタンス多の関係になります。

また、クラスとインスタンスの関係は、
「モノ」をあるくくりで囲ってあげると、その共通した括りがクラス、括られた「モノ」がインスタンスとも言えます。

この場合、クラス側から考える記事が多いですが、インスタンス側から考えるとわかりやすいかもしれません。

ラーメン、チャーハン、天津飯、という3つのインスタンスがあるとします。
これの共通点を探してみてください。

答えは中華料理。この括りがクラスになります。
(開発の状況によっては食べ物というもう少し大きい括りでクラス作る可能性もあります)

ヒカキンさん・はじめしゃちょーさんがインスタンスであれば、youtuberクラスがあるかと思います。

クラスとインスタンスの概念を使うと、
共通したものはクラスに書いておいてと、データだけ変えるだけで違うパターンのインスタンスを効率良く大量に作ることができ開発が楽になります。

「モノ」を中心に考える → 「モノ」をたくさん定義して組み合わせて作るためクラスとインスタンスの概念を使う → 効率良く開発ができる → オブジェクト指向

このようにオブジェクト指向では、クラスとインスタンスの概念はセットになってきます。


また、オブジェクト指向の説明にクラスとインスタンスが出てきましたが、
カプセル化・継承・ポロモフィズムという3つのキーワードもよく出てくるかと思います。
しかし、これら3つがなくてもオブジェクト指向は可能ですし、実際にカプセル化などが使われないプログラミング言語もあります。
これら3つの考え方は、オブジェクト指向をする上で大切な考え方ではありますが、今回はオブジェクト指向するための便利な3つの考え方と思ってもらえば大丈夫です。

一応補足
カプセル化 → 他のプログラムから干渉されないように作る考え方
継承 → 同じようなプログラムは共通化して使う考え方
ポリモーフィズム → 汎用的な形にできるようにしようという考え方


## あ、やっぱり顔で選びます。

まとめますと、
オブジェクト指向とは、この「モノ」を中心に考えて「モノ」をたくさん定義して組み合わせていくことで大きなシステムを作っていくスタイルです。

「モノ」をたくさん効率良く定義するために、クラスとインスタンスの概念が必要で、「モノ」をどう定義するかの設計図がクラス、その設計図で作られた「モノ」の実態がインスタンスです。

印鑑がクラスで押された赤い文字がインスタンスでもいいかも。
（赤い朱肉はデータ、色を青にするだけで青い文字インスタンスができる）



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