オブジェクト指向について学ぶ 第1回
プログラミングの勉強をしているとよく
「オブジェクト指向」という言葉が出てきます。
言葉は知っているけれど、「それって何なの」と聞かれたらうまく説明できません。
というわけでこれから何回かに分けてオブジェクト指向について勉強していき、
学んだことをまとめていこうと思います。
勉強して、アウトプットする中でもポイントを絞っていきたいと思うので、
次の3つの観点から勉強して、まとめていこうと思います。
というわけで今回は1番「オブジェクト指向とは何なのか」について勉強したことをまとめていきます。
オブジェクト指向とは何なのか?
オブジェクト指向の概要と、基本的な用語について解説していきます。
-
一言で言うとなんなのか?
システムを作る上での「考え方」です。 -
どういう考え方なのか?
システム全体を「いろんなオブジェクト同士が相互作用して動かすもの」とみなす考え方です。
プログラムを書くときも、「手順を書く」というより
「オブジェクトを作る」「オブジェクトを動作させる、操作する」ことを書いていくイメージみたいです。 -
オブジェクト指向プログラミングとは?
オブジェクト指向の基本用語
オブジェクト指向の概要と、基本的な用語について解説していきます。
- オブジェクト
オブジェクトは「物」「対象」といった意味ですが、
プログラミングにおいては「保持しているデータ」と「動作」が定義された存在、ということになります。
たとえば「Aさん」というオブジェクトがあれば、Aさんは「Aさん」という名前や、年齢、性別などのデータを保持しています。またAさんには「歩く」「話す」あるいは「事務の仕事をする」といった動作が定義されています。 - クラス
クラスという言葉には「種類」「組」などの意味がありますが、「そのオブジェクトは何に分類されるのか?」と言われたときの「何」の部分だといえばいいかもしれません。
たとえば先程のAさんに似たBさんやCさんが居たとします。「AさんやBさんは何の仲間?」と聞かれたら「人間」と答えるのがまあ妥当だと思います。つまりAさんやBさんというオブジェクトは「人間」というクラスに所属していると考えることが出来ます。
ところで「人間」というクラスそのものはAさんやBさんの「分類先」「所属先」にすぎず、それ自体は実態のないふわふわした概念みたいなものです。
なので「人間」クラスをプログラムで扱うにはちょっとした処理がひつようになります。
そのあたりも含めて、クラスに関する基本用語をまとめていきます。
- プロパティ
オブジェクトが持つ属性。「人間」クラスのオブジェクトなら
「年齢」「性別」などをプロパティとして所持している。 - メソッド
オブジェクトのもつ動作や機能。「人間」クラスのオブジェクトなら
「歩く」「話す」「聞く」など。
メソッドによる処理のことを「振る舞い」と表現することもある - インスタンス化
クラスから実体をつくること。
クラスをもとにメモリ上に実際のデータを展開すること。
インスタンスとは「実例」という意味で、
上記の例だとAさんやBさんは「人間」クラスをインスタンス化したもの。 - カプセル化
オブジェクトのもつプロパティやメソッドのうち、外部から干渉してほしくないものを保護することを言います。アクセス修飾子などを使います。
たとえば「電子レンジ」というオブジェクトを使う処理がいくつかあったとします。ふつう電子レンジを使うときは、温めたいものを入れてスイッチを押すだけでいいのですが、もし内部の回路がむき出しになっていて、細かいスイッチや素子を幾らでも操作できるようになっていたらどうなってしまうでしょうか?。
Aさんに「電子レンジを使ってお弁当を温めておいて」と頼んだのに、Aさんは回路をめちゃくちゃに操作してお弁当を台無しにしてしまうかもしれません。
このとき、ドアと温め時間のスイッチ以外をしっかり外装で保護して一切触れないようにしておけば、Aさんが予想外の振る舞いをしてしまう確率はぐっと減るはずです。
また、実はこの電子レンジが扱うのに高度な技術を要する危険なものだったとして、鍵のかけられた部屋に置かれているとします。
もしこの電子レンジの誤作動で何かしらのトラブルがあったとき、トラブルの原因は電子レンジそのものか、部屋の鍵を持っている特定の誰かであると絞り込むことが出来ます。
カプセル化を駆使すれば、プログラムが予想外の動作をしてしまうリスクを減らすことが出来、バグが起きてしまった場合もその原因を特定しやすくなります。 - 継承
新しいオブジェクトを作成する時、既存のあるオブジェクトの機能を引き継がせることを継承といいます。
たとえば専門的な仕事をする「作業員」オブジェクトを作りたいので、「作業員」クラスを定義しておくとします。
作業員はみんな人間なので、「人間」クラスを継承するといいでしょう。
「人間」クラスが持っているパラメータやメソッドをいちいちプログラミングし直す必要がなくなります。
もし「人間」クラスに変更を加えたときも、それらが全て「作業員」クラスにも反映されるので、保守性が大きく向上します。
また継承の際には、継承元の機能を引き継ぐだけでなく
書き換えることも出来ます。これをオーバーライドといいます。 - ポリモーフィズム
異なる種類のクラス間でも、同じ名前のメソッドで同じような処理が行えるようにすることをポリモーフィズムといいます。
たとえば「乗り物」クラスがあったとして、指定した場所に連れて行ってくれる「GO」というメソッドがあったとします。
「乗り物」クラスを継承して「船」クラスや「飛行機」クラスを作ったとして、それぞれ「GO」をオーバーライドして独自のやり方で目的地に到達する機能を実装したとします。
飛行機に「GO」させるプログラムを書いていたものの、やっぱり船に変えたくなったという場合があったとしても、書き換えるのは「飛行機」の部分だけで済みます。
ポリモーフィズムをしっかり実現させていけば、拡張性を高めつつミスを減らすことが出来ます。
まとめ
勉強を始める前は「オブジェクト指向とは考え方」「こういう要素があってオブジェクト指向になる」といったことがほとんど分かっていなかったのですが、ざっくり外観を掴むことはできたように思います。しかしながらこの記事を書いていていまひとつ具体的なイメージや、「結局何が嬉しいのか」といったところが理解が足りていないと感じています。
次回からはプログラム上での具体例やメリットについて詳しく勉強していこうと思います。
参考にしたサイト