群馬県|ガーデン前橋校

プログラミングをわかりやすくするために生まれた「オブジェクト指向」とは?

 

【プログラミングに欠かせないオブジェクト指向とは?】

 

◆オブジェクト指向が生まれたきっかけ

「オブジェクト指向(object-oriented)」という言葉を最初に提唱したのは、Smalltalkというオブジェクト指向環境を発明したアラン・ケイ氏だと言われています。パーソナルコンピュータの生みの親であり、スクラッチを作った人物でもあります。
ケイ氏が最も熱心に取り組んでいたのはコンピュータを使った子供の教育で、プログラミングを子供に教えることによって、ソフトウェアを自身の問題に合わせて自在に変更出来るようにし、より高い問題解決能力を得ることを目指しました。


◆オブジェクト指向とは?

「ある役割を持ったモノ」ごとにクラス(プログラム全体の設計図)を分割し、モノとモノとの関係性を定義していくことでシステムを作り上げようとするシステム構成の考え方のこと。

オブジェクト:直訳すれば「物」「対象」という意味。プログラミングにおいてはデータと処理の集まりを意味している。

C++言語において、プログラムした場合のオブジェクトは寿命が決まっていません。つまり、プログラム実行時から修了まで破棄されることはありません。
どうしてもオブジェクトの破棄をしたい場合は、動的オブジェクト(newとdelete)を使用してオブジェクトの作成と破棄の管理をプログラマー側で行います。
不要になった時に破棄できるというメリットがありますが、破棄は自動で行われないので破棄を忘れた場合メモリが解放されないというデメリットもあります。

クラス:データと処理をひとつにまとめる機能。モノ(オブジェクト)の設計書のようなもの。
クラスを作る際のヒントとして、作りたいものの共通点を探してあげるとわかりやすいでしょう。

通常の変数はデータだけを持っています。(例えば、数値や文字列など)
これに対してクラスは、データのみではなく「メソッド」と呼ばれるデータの操作方法やその他のツールを持っています。
クラスの概念に付随するものとしてprivate変数というものがあります。これは、外部から操作することのできない変数です。

プロパティ:モノ(オブジェクト)が持っているデータのこと。(車に例えれば「メーカー」「排気量」「色」など)

メソッド:モノ(オブジェクト)が持っている処理のこと。(車に例えれば「走る」「曲がる」「止まる」などアクションを起こす処理のこと)

オブジェクト指向は本来、オブジェクト(クラス)間でメッセージを送り合うことでオブジェクトが情報を交換するという考え方でした。
が、オブジェクト指向言語にはメッセージという概念は無いため、Java等ではメッセージの代わりにメッセージを送る先のオブジェクトのメソッドを呼び出すという形で情報交換をしています。

PHP開発をする際にも「オブジェクト指向」が必要とされています。
クラスの中で定義された「関数」のことをメソッドと言います。前でも説明したように作ったモノ(オブジェクト)に対して命令をする文のことです。
メソッドは関数です。メソッドが存在することで引数によって計算結果が変わるなど同じクラスから生まれたものでも、異なった結果を生み出せるようになります。
また、これはコード作成の説明になってしまいますが、コードの先頭に「public」を付けることにより、クラス外から関数を呼び出すことができます。
つまり、外側からクラスを扱いたい(命令したい)ものに「public」を付ければ新たな結果が生まれます。

ここで1つ今まで説明したものを、わかりやすく例えてみましょう。
ゲームを作成するにもたくさんの人が関わり、開発をしています。


1000車種から選べるレーシングゲームを開発しているチームがあるとします。

「Aボタンで前進」、「Bボタンで停止」というプログラムをしました。開発途中「Cボダンでバック」の機能を追加しようとしたとき、1000種類の車に対して変更をするよりも、「車」というモノを予め作成しておき、変更する方が開発のスピード、情報管理やメンテナンスをするときに非常に便利になります。併せて、プログラムの保護(カプセル化)にもつながります。

そして、ここまで作成してきたクラス(抽象的)から実体を作り出すことを「インスタンス(具体化)」と呼びます。

オブジェクト指向とは、クラスを使って抽象化することです。

◆オブジェクト指向の三原則

継承=同じようなプログラムを1か所にまとめてコードを再利用しやすくする仕組み

似たようなオブジェクトを複数作る時に、全てのプロパティやメソッドをいちいちプログラミングするのは非常に手間が掛かりますが、継承を使うことにより、同じ機能を実装できます。

ゲーム作成に例えると、「車」に「トラック」も追加しようとした場合。基本操作は同じため追加も簡単にできるのです。

カプセル化=他のプログラムからできるだけ変更できない仕組み

オブジェクトが持つデータや処理のうち、別のオブジェクトから直接利用される必要のないものを隠すことを言い、利用する場合は外部から操作するために作られた処理を設けることを言います。
プログラムが壊れにくくなると共に、大人数で開発をするときすべてのコードを認識する必要がなくなります。

ポリモーフィズム=継承したコードの一部を変更して利用するための仕組み

クラスによって同一のメソッドで異なる処理が行えるという性質をいいます。

世の中の家電は説明書を見なくてもだいたい使い方がわかりますよね。
車においてもアクセルが右というふうに決まっています。
プログラムも同じ処理の名前で動いてくれると、処理名を覚える必要もないし、ミスも減らすことが出来るのです。

【オブジェクト指向の代表的なプログラミング言語】


◆C言語
C言語は「型」に支配された言語です。変数にも関数にも「型」が存在し、「型」という枠組みの中で厳密に情報が処理されています。
C言語はクッキー型のような形を決めるためのものであり、「データ型」とは、C言語における変数や関数の形を決めるためのものです。
このデータ型によって「情報のサイズ」や「情報の種類」を決めています。

ただし、この「型」の中で異質な存在であるのが「void型」です。
Void型は、「型」が無いことを示す型です。
「無いことを示す」?と理解するのに難しいですが、
イメージするものとすれば、数字の「0」を思い描いてください。
「0」は物に例えると「無い」ですよね。「無い」ですが、数字を見た時は「0」という物が見えています。
「void型」が使用される代表的な使い方は、関数の引数と戻り値のデータ型です。
関数というのはサービスです。サービスに情報を入力するための「引数」と、サービスから出力される情報の「戻り値」が存在します。

例えば、入力と出力はそれぞれ「情報あり」と「情報なし」を選択することができます。
つまり、4種類から選択ができる場合。入力も出力も選択されていない状態。存在していない状態を示すためのデータ型として「void型」を利用します。

◆C++
C言語が拡張されたプログラミング言語。C言語では構造体(データをパッケージ化する機能)、関数(データを処理する機能)がそれぞれ別の機能として存在していたが、C++の「クラス」は構造体メンバ(クラスが管理するデータのこと)に関数も含ませることができるようになりました。

◆Python(パイソン)
プログラミング言語の1つ。覚えやすく、初心者でも使いやすいためAI(人工知能)の開発、Webアプリの開発、スマホアプリの開発、ゲーム開発などに使用されています。「YouTube、インスタグラム、Googleマップ」もPythonで作られています。もっとも将来性のある言語と言えるでしょう。

ロボ団でも5年目のMasterクラスではこのPythonを使っての授業を行っています。

◆Ruby(ルビー)
日本人が作成したプログラミング言語。コードの量が少ないので初心者も扱いやすい。主にWEBアプリ制作に使用。

◆Scratch(スクラッチ)
プログラミング教材。コードは使用せず、積み木のように用意されたブロック
を組み立てていく。入力が苦手な子供もプログラミングができる。

ここで「プログラミングとは」について考えてみましょう。
プログラミングとは、コンピュータに「こう動いてほしい」と伝えるための行動のことです。もう少し具体的に言いますと、指示を伝えるためにコンピュータが理解できる言葉である「プログラム」を作っていくことです。
プログラムの設計のスタートから完成させるまでのすべてを指します。

ちなみに、「コーディングとは」についても考えてみましょう。
設計したシステムは、それだけでは動きません。コンピュータはしてほしいことを人間の言葉では理解できませんので、コンピュータに理解できる言葉で何をするか教えてあげる必要があるのです。
コンピュータに理解できる言葉とは、マークアップ言語やプログラミング言語のことです。(HTML、CSS、JavaScript、PHP、C++、など)
つまり、コーディングとは処理をマークアップ言語やプログラミング言語で記述することです。オブジェクト指向に出てくる言葉ではありませんが、ぜひ覚えておきましょう。

せっかくなのでJavaやPythonをコーディングする上で最もよく使うコマンドを3つ紹介します。
・String=文字列を表す型
・Integer=整数を表す型
・println(プリントライン)=文字列を表示して改行する関数です。
ぜひ、頭の片隅に覚えておいてください。

【オブジェクト指向のメリット・デメリット】

 

◆オブジェクト指向のメリット

・効率よくプログラムを設計・開発できる
例)Webサイトで使用するボタンをイメージした場合、同じような見た目で色が異なるボタンが3つあるとします。この場合、オブジェクト指向を使用しなかった場合は、それぞれのボタンに対してプログラムを3回も作成する必要があります。

ただし、「モノ」として1つボタンを作成してしまえば、別のボタンを作る際は「ボタンの色」や「ボタンに表示される文字の色」を変えれば簡単に作ることができます。

このように、設計・開発の時間を短縮することができるのです。

・不具合の原因を特定しやすくなる
例)「停電が起こりました」さて原因は何でしょう?
漏電?雷の影響?電線の異常?電気を使い過ぎ?と様々な原因が考えられ判断がしづらいです。
ただ、「電子レンジ、エアコン、ドライヤーを一緒に使っていた」ということが分かれば原因は電気の使い過ぎだということが分かりますので、ブレーカーが下がっているかもしれない!ということでブレーカーを見に行くことが出来ます。

このように、プログラムでも同じことが言えます。オブジェクト指向で開発されていないと「どこでエラーが発生したのか?」の原因を調査するのに時間がかかります。
長文で書かれたコードの中からその原因を探すのはとっても大変です。
オブジェクト指向は、「モノ」と「操作」に分かれているので、どこでエラーが起こったのか?どんな操作をした時にエラーが起こったのか?が分かれば少なくともエラーが起こった個所はすぐに特定できます。
そして、操作ごとに処理が分かれているためエラーが起こった時の操作の処理を見るだけでエラーを特定しやすくなります。

・プログラムの仕様が変わっても簡単に対応できる
例)Webサイトで使用しているすべてのボタンの横幅を小さく変更するとなった場合、オブジェクト指向で作っていないボタンだとすべてのボタンに対して、1つずつ横幅を変える必要があります。もし、100個ボタンを使っていたらその100個の個所全て修正する必要があります。

このように、設計・開発が効率的に進めることが出来るだけでなく、開発した後も時間をかけずに修正することが出来ます。

◆オブジェクト指向のデメリット

・データと処理をひとまとめにした「継承」という仕組みによってどこのコードが実行されているのかわかりにくい。

・設計の工程に時間がかかる。

・実際再利用するとなった場合、非常に難易度が高い。

・深く理解したエンジニアを確保するのが困難。

といったことがあります。

エンジニアの確保が問題ということは、需要が高いということでもあります。
将来エンジニアを目指そうとしている場合、早めにオブジェクト指向を理解しておくとよいかもしれません。

【まとめ】

◆オブジェクト指向を学ぶ方法

オブジェクト指向では、キーワードや概念が多く用いられています。他の言語と同じキーワードでも意味が異なる場合があるので開発エンジニアには正確な理解が求められます。
実際使われるキーワード等にはさまざまなものがありますが、オブジェクト指向でもっとも重要なキーワードや概念をぜひ理解して覚えておきましょう。

オブジェクト指向について様々な方法で説明してきましたが、私なりに理解できた例を紹介します。

上の図のように「動物」というクラスを作ります。

この段階ではただ属性が「動物」というだけで、何の動物なのか?何本足なのか?どのように鳴くのか?が分かりません。
そこで、オブジェクト(メソッド)を追加し具体的に実体化(インスタンス)することで何の動物のことかが分かります。

では、1つインスタンスしてみましょう。

【追加オブジェクト】
・種類=犬
・足=4本
・鳴き声=「ワン」

以上のことをふまえると、このような「犬」という動物がインスタンスされます。

また、一言で「犬」と言っても犬種もたくさんあり、色もたくさんあります。そうなった場合また新しい「犬」クラスを作成しオブジェクトを追加してあげることにより、「犬」の基本部分(種類=犬、足=4本、鳴き声=ワン)は変わらずに、たくさんの犬種をインスタンスしてあげることが出来ます。

この考え方はあくまでも私が理解しやすいように考えたものです。

身近なものに置き換えて考えることによって、「難しい」「苦手」と感じていたものも理解しやすくなりますので、是非自分の身近にあるものに置き換えて「オブジェクト指向」に挑戦してみてください。

最後になりますが、プログラミングを習う際「論理的思考」を身に着けよう!

とお伝えしていますが、この場合の「思考」と今回お話しした「オブジェクト指向」の「指向」は意味が少し違っています。

「思考」は「考えること」といった意味合いの言葉です。今まで得た知識や経
験などをもとにし、何かについて頭を働かせることです。

「指向」は「ある方向へ向かうこと」といった意味の言葉です。具体的・物理的な方向を指し示して用いることが多い言葉です。

これからの子供達には「思考」を身に着けて、それぞれの目指すものへと「指向」して進んでいってもらいたいと思います。
そのために、論理的思考(物事を順序立てて実行し結果を導く思考力)がかかせないものと考えています。

ガーデン前橋校

群馬県前橋市小屋原町472-1ガーデン前橋内

群馬県|ガーデン前橋校
詳細はこちら

ガーデン前橋校への
お問い合わせ

アクセスランキング

人気の記事ランキング

人気のタグ

タグ別の記事はこちらから

各校舎の記事

校舎別の記事一覧はこちらから

月間アーカイブ

過去の記事はこちらから