こんにちは、財前です。
本日は「オブジェクト指向」というものについて、ご説明をしていきたいと思います。
既にプログラミングを勉強されたことがある方でしたら、この言葉を聞いたことがあるかもしれません。
最近のプログラミング言語ですと、ほとんど全ての言語が、この「オブジェクト指向」の考え方を採用していると言っても過言ではないでしょう。
業務システムの開発におけるシェアNo.1の「Java」などは、オブジェクト指向プログラミングの代表格ですね。
しかし、この「オブジェクト指向」という言葉、結局のところ何を意味しているのかは、なかなか理解が難しいところがあります。
実は「オブジェクト指向」とは「概念」や「考え方」、プログラミングを行う上での「思想」を表したもなので、なんだかフワフワしているんですね。
エンジニアたちの間でも、結局どこが「オブジェクト指向」の肝なのかは、意見が分かれるところです。
しかし、今後、エンジニアとしてプログラミングに携わるのであれば、避けては通れない概念であり、また、とても便利な考え方でもあります。
今日はその、便利なんだけど、何だか掴みどころがない「オブジェクト指向」という考え方について、初心者の方にもわかりやすく、詳しく見ていきたいと思います。
オブジェクト指向を、一言で言うと?

「オブジェクト指向」を一言で言うと、
「実際のモノにたとえて、プログラムの部品を作る考え方」
です。
「オブジェクト指向」とは、プログラムを作るとき、一気に全部まとめて作るのではなく、各パーツ(部品)毎に一つずつプログラムを書いていって、最終的にそれらを繋げて一つのプログラムにするような、プログラムの作り方です。
「プログラムの部品を作るための考え方」なのですね。
たとえば、ゲームを作るとき、以下のようなプログラムを書くとしましょう。
「Bボタン」を押すと、「キャラクター1」が攻撃!
「Aボタン」を押すと、「キャラクター2」がジャンプ!
「Bボタン」を押すと、「キャラクター2」が攻撃!
「Aボタン」を押すと、「キャラクター3」がジャンプ!
「Bボタン」を押すと、「キャラクター3」が攻撃!
きっと格闘ゲームか何かですね。
コントローラーの「Aボタン」を押すと、キャラクターがジャンプして、「Bボタン」を押すと、攻撃をするようなゲームです。
ただ、キャラクターが一人だけではつまらないので、「キャラクター1」「キャラクター2」「キャラクター3」という具合に、3人のキャラクターを作りました。
上記のようなプログラムを書けば、3人のキャラクターそれぞれに対して、ジャンプと攻撃の操作ができるようになります。
でも、ジャンプと攻撃だけではつまらないですよね。
キャラクターに移動の機能をつけてみましょう。
「Bボタン」を押すと、「キャラクター1」が攻撃!
「→ボタン」を押すと、「キャラクター1」が右へ移動!
「←ボタン」を押すと、「キャラクター1」が左へ移動!
「Aボタン」を押すと、「キャラクター2」がジャンプ!
「Bボタン」を押すと、「キャラクター2」が攻撃!
「←ボタン」を押すと、「キャラクター2」が左へ移動!
「Aボタン」を押すと、「キャラクター3」がジャンプ!
「Bボタン」を押すと、「キャラクター3」が攻撃!
「→ボタン」を押すと、「キャラクター3」が右へ移動!
「←ボタン」を押すと、「キャラクター3」が左へ移動!
上記のように書けば、すべてのキャラクターに対して、移動の機能をつけることができます。。。
ただ、この書き方、少し効率が悪いような気がしませんか?
何だか、ほとんど同じようなことを、何度も繰り返し書いているような気がします。
この例ではキャラクターが3人ですが、10人、100人キャラクターがいたら、その数だけ何度も同じことを書くのでしょうか。。。
ちょっと気が遠くなりますね。
そこで、以下のようなプログラムの書き方が考え出されました。
・「Aボタン」を押すと、ジャンプする!
・「Bボタン」を押すと、攻撃する!
・「→ボタン」を押すと、右へ移動!
・「←ボタン」を押すと、左へ移動!
キャラクター1は、「キャラクター」である。
キャラクター2は、「キャラクター」である。
キャラクター3は、「キャラクター」である。
かなりスッキリしましたね。
まず最初に「キャラクター」というものの定義を書いておきます。
そしてその後は、キャラクターを一人ずつ追加していくだけです。
最初に「キャラクターとは、どういうものなのか」ということを書いておいてしまえば、いちいちキャラクターを作る度に、毎回同じプログラムを書く必要がなくなるんですね。
実はこれが、「オブジェクト指向」という考え方です。
「Object(オブジェクト)」という英単語は、「物」という意味です。
この場合で言うと、「キャラクター」という「もの」を最初に定義して、そのキャラクターという「もの」を使って、以降のプログラムを書いていくんですね。
プログラムの再利用

冒頭で、オブジェクト指向とは
「実際のモノにたとえて、プログラムの部品を作る考え方」
だとお話ししました。
「キャラクター」という「部品」を最初に作っておけば、以降のプログラムで、何度も同じプログラムを書く必要がなくなるのでしたね。
なぜなら、最初に作った「キャラクター」のプログラムを、何度も使いまわすことができるからです。
プログラムを作る上で「キャラクター」に対して命令を与える場面があれば、毎回その「キャラクター」プログラムを呼び出せば良いだけです。
こういうのを、プログラムの「再利用」と言います。
オブジェクト指向というのは、プログラムの再利用性を高めることができるので、とても便利な考え方です。
何度も同じようなプログラムを書く必要がなくなるのですね。
また何よりも、「キャラクター」などという、実際の「もの」にたとえてプログラムが記述できるので、なんだか人間にも分かりやすいプログラムが書けます。
カプセル化

「オブジェクト指向」の中の重要な要素の一つに、「カプセル化」という考え方があります。
「カプセル」という言葉は、もうほとんど日本語になっていますが、「容器」のことですね。
薬が入っていたり、宇宙から飛来したエイリアンが入っていたりする、アレです。
「オブジェクト指向」で言うところの「カプセル」とは、
「外から中身が見えないようにしようね」
ということを表しています。
外から中身が見えないようにすることを、「カプセル化」と呼んでいるのです。
何の中身!?
と、思われるかもしれません。
これは、「オブジェクトの中身」のことを指しています。
オブジェクトとは「もの」にたとえて作られた、プログラムの部品のことですから、ここには、「中身を見なきゃいけないような部品なんて、良い部品じゃない!」という思想が込められています。
そして、素人が直接中身をいじれるような部品は、すぐ壊れちゃいそうですね。
ユーザーに部品を使ってもらうときに、こちらが意図していないような使い方をさせないようにするためには、ユーザーが好き勝手に中身をいじれないようにしておく必要があります。
たとえば、近所の工具屋さんでモーターを買ってきて、それを使っておもちゃを作るとします。
モーターとは、電気を流すと回転する、「部品」ですね。
その時、私たちは「モーターに電気を流すと回転する」ということは知っていますが、中身がどうなっているのかを知る必要はありません。
もしそのモーターがある日突然、逆回転を始めたら、「なぜ突然、逆回転を始めたのか」を知るために、中身を分解して見てみないといけません。
そんなことが必要なモーターは、「良い部品」とは言えませんね。
「カプセル化」とは、「一度プログラムの部品を作ったら、それを使うときは、いちいちプログラムの中身を見なくて良い」ということを表しています。
先ほどの「キャラクター」の例で言えば、キャラクターが「どのボタンが押された時に、どういう動きをする」という事だけを知っていれば、そのキャラクターという「部品」を使って以降のプログラムが書ける、ということを表しています。
「ジャンプをさせるためのプログラムがどういう風に書かれているのか」などと言うことは、以降のプログラムを書く人は知らなくても良いのです。
そういう風に、しっかりと「カプセル化」されているプログラムが、「良いプログラム」ですよ~
という考え方が、「オブジェクト指向」には込められています。
こういう考え方に基づいてプログラムが作られていれば、大人数で協力してプログラムを作るときも、とても便利ですね。
なぜなら、「キャラクター」というプログラムを誰か一人が書けば、それ以降にプログラムを書く人たちは、その「使い方」だけ知っていれば良いからです。
みんなで何度も同じプログラムを書く必要もなく、ただ単にその「キャラクター」というオブジェクトを「使って」プログラムを書けばよいので、人によって書き方に違いが出ることも少ないです。
まとめ

如何だったでしょうか。
「オブジェクト指向」という考え方のエッセンス、理解して頂けたでしょうか。
「オブジェクト指向」を勉強していくと、他にも「継承」とか、「インターフェース」とか、「ポリモーフィズム」とか、何だかよく分らない言葉がたくさん出てくるのですが、それらは全て、この記事で説明したように、プログラムの「良い部品」を作るためにはどうすればよいか、ということを定めたものです。
その部分を理解しておくと、「オブジェクト指向」というものが理解しやすくなるのではないかと思います。
また、「オブジェクト指向」と関係が深い比喩表現に「車輪の再発明」という言葉があります。
興味がある方は、こちらの記事もご参照ください。
本記事でご説明したことが、皆様の今後の勉強のお役に立てば幸いです。
最後まで読んで下さり、ありがとうございました。
コメント