プログラミングを始めてみたけど、オブジェクト指向?というのがまるでわかりません…。
確かに概念ははじめはつかみにくいかもしれないね。ここではそのオブジェクト指向についてわかりやすく説明していくよ!
オブジェクト指向とは
「役割をもったモノ=オブジェクト」同士の関係性を定めてシステムを作り上げる設計方法の考え方です!
もっとわかりやすく詳細をぷりーず!
オブジェクト指向についてざっくりわかりやすく説明していきます。手続き型というプログラミングで犬が吠えたり走ったりするプログラムを書いてみます。
犬がいます
↓
犬が吠えます
↓
犬が走ります
この書き方だと犬の種類が増えたとき大変になります。
チワワがいます
↓
柴犬がいます
↓
チワワが吠えます
↓
柴犬が走ります
↓
柴犬が吠えます
…
え、これどんどん犬の種類が増えたら大変になるのでは…。
オブジェクト指向は現実の世界と同じような関係性を築くことにあります。現実世界で「犬」という「生き物」がいるようにプログラミングの世界では「犬」という「オブジェクト」を作るのです。
手続き型プログラミングでは「犬」のひとつひとつの動きを指示していましたが、オブジェクト指向なら「犬」のオブジェクトを生み出せばそのオブジェクト自身が走ったり吠えたりしてくれるのです。
メソッドとプロパティ
オブジェクトは役割があります。さっきの犬の例でいえば「吠える」こともできるし、「走る」こともできます。
このような色々なふるまいをメソッドといいます。メソッドは処理のまとまりともいえるでしょう。
生き物の例でいえば何かの動作のまとまりを表すね!
またオブジェクトはメソッドの他にプロパティを持ちます。プロパティとはそのオブジェクトが持つデータ(値)です。
例えば犬でいえば年齢だったり、名前だったりというものです。
オブジェクトはメソッドとプロパティを持ってるんだね!
クラス -オブジェクトの設計図-
その「おぶじぇくと」を生み出すには毎回一から作らなきゃいけないの?ベースになる何かがあれば楽なのに。
いいところをつくね!オブジェクトを生み出す設計図があるんだ!
オブジェクトはクラスから作ります。クラスはオブジェクトの設計図です。
例えば犬というクラス(設計図)を作るとします。その設計図にプロパティとメソッドを書きます。
プロパティとして、「種類」と「年齢」、「名前」という枠を作ります。
メソッドとして「吠える」と「走る」という振る舞いを作ります。
この犬クラスのプロパティの中身はここでは記載していません。クラスというのは設計図であり、概念のようなものなのです。
中身がなければ実際の世界の犬のようにはならないんじゃない?
ここでの犬クラスは「犬とはこんなもの」という概念なんだ!実際の犬にするにはこのクラスをもとに生み出す、ということになるよ!
オブジェクトをクラスから作成する!
それではこのクラスからチワワを生み出してみましょう!
設計図のプロパティの、種類に「チワワ」、年齢に「3歳」、名前に「わんこ」、と設定すればあら簡単!プログラムの世界にチワワが生まれました!同じように柴犬を生み出したければ、今度は種類に「柴犬」、年齢に…といったように設計図であるクラスからどんどん犬を生み出せるのです!
クラスは毎回使いまわせるからとっても楽ちんだね!
オブジェクト指向プログラミングのメリットはそれ以外にも、全体からみて何をしているかがわかりやすいし、クラスを使うことで修正しやすいということもあるんだ!
確かに犬クラスというものもわかりやすいし、ここにメソッドを追加しようってなったらクラスを修正するだけですみそうだね!
オブジェクト指向の三原則
他にもなんか特徴あるの?
3つの特徴を持っているよ!説明するね!
継承
今度は猫クラスを考えてみましょう。
猫クラスは「種類」「年齢」「名前」のプロパティ、「鳴く」「走る」のメソッドを持たせるとします。
あれ?なんか犬クラスと同じの多いね。
犬クラスも猫クラスも「吠える」と「鳴く」のメソッド以外共通していますね。これらをまとめられないでしょうか。
そこで継承という概念があります!
犬も猫も哺乳類です。哺乳類クラスというのがあり、そのプロパティやメソッドをどちらも引き継いで使えれば楽ではないですか?
「哺乳類クラス」を作り、「種類」「年齢」「名前」のプロパティ、「走る」のメソッドを持たせて継承することで、「犬クラス」は「吠える」メソッド、「猫クラス」は「鳴く」メソッドを記述するだけですみます。
このように機能を引き継ぐことができるのです。
カプセル化
自分の飼っている犬が他人に勝手に名前を変えられたら嫌だよね?
嫌に決まってるだろっ!!
オブジェクトが持つデータを外部から簡単に書き換えられるようになってしまうとうっかり変更して予期せぬ動作をしてしまう、なんてことがあるかもしれません。
カプセル化というオブジェクト指向の概念では不用意に直接利用されないような処理を施すことができます!
データにアクセスできる対象を決めることで、間違って値を設定されないようにしたり、あるいは何か処理を経由して値を操作させたりすることができるのです。
多態性(ポリモーフィズム)
犬クラスも猫クラスも「走る」というメソッドを持っているけど、中身は違うこともあるよね。
確かに犬の「走る」と猫の「走る」は速さも違うし、持久力も違うかも?
ポリモーフィズムの特性では、「走る」メソッドの中身が違っても「走って!」と同じ命令で犬と猫に走ってもらうことができるよ!
ポリモーフィズムは概念を理解するのが難しいですが、ざっくりいうと
「処理の内容が違っても同じメソッド名なら、同じ命令で呼び出せるよ!」
といったものです。キョウカちゃんとわかプロ君が話しているように、犬オブジェクトと猫オブジェクトは「走る」ことができますが、内容は違います。しかしどちらのオブジェクトにも「走って!」と命令すれば命令文は同じでも違う走り方をしてくれます。
オブジェクト指向を理解しよう!
なんとなーくだけどオブジェクト指向がわかってきた気がするよ!
どうしても文だけじゃ理解しきれない部分もあるけど、実際にオブジェクト指向プログラミングを経験すると一気に理解が進むよ!
よぉ~し、プログラミング頑張るぞ!
コメント