プログラミング言語を独学で習得する際に、オブジェクト指向の理解が必要になります。
オブジェクト指向とは、様々な役割や人や物が分業して、ある目的を達成するためのプログラムの考え方をいいます。
{ この記事の目次 }
クラスの概念
オブジェクト指向の考え方を家族の日常で説明します。
登場人物は、出来上がった人型ロボットだと思ってください。
お父さんは仕事から帰ってくると、とりあえずテレビをみます。
よくある家庭の風景ですよね。
お父さんの役割
お父さんは、仕事から帰ってくるとテレビを見ていました。
・仕事を終えるという役割(一つのプログラム)
・テレビを見るという役割(一つのプログラム)

お母さんの役割
お母さんは、家族のために家事をこなし、家族をまとめるリーダーだとします。
お母さん一人では、とても夕飯の支度をこなせないので、おばあちゃんと子供に手伝ってもらい、お母さんは指示を出すことに専念しました。
・お母さんは、指示するという役割(一つのプログラム)
・おばあちゃんは、お皿に盛り付けをすると言う役割(一つのプログラム)
・子供は、お皿を並べるという役割(一つのプログラム)

このようにお母さんの仕事の量が多いとき、家族みんなで手伝う(分業)する事で、夕飯の支度をしますよね。目的は、家族みんなで夕食を食べる事です。
目的のための行動を達成する事、これがオブジェクト指向の考え方です。
仕事を分業して、いろんな役割をもつ人やものが、お互い協力しあって、ある目的をはたす考え方をオブジェクト指向といいます。
このように、それぞれの仕事を部品化する事で、別のシステム(別の行動)へ派遣することもできます。
例えば、お父さんが仕事に行ったり、帰ってきたりします。
仕事をする、仕事を終えるといった言った部品(プログラム)だけを別のシステムへ派遣して使うことができます。
この場合、お父さんの役割として、仕事に行く事で、お金を稼ぐ(一つのプログラム)システムに派遣して使う事ができます。

登場人物は「クラス」
このように出てくる登場人物をプログラムで言うとクラスといいます。
・お父さんクラス
・お母さんクラス
・おばあちゃんクラス
・子供クラス
メソットの概念
それぞれの登場人物クラスが、目的を果たすために行う作業のことをメソットといいます。

例えば、お父さんクラスのお仕事(メソット)は、
・仕事をすること
・お金を稼ぐこと
・テレビを見ること
お母さんクラスのお仕事(メソット)は、
・買い物をすること
・料理を作ること
・おばあちゃんに指示をすること
・子供に指示をすること
おばあちゃんクラスのお仕事(メソット)は、
・お母さんの作った料理を盛り付けること
子供クラスのお仕事(メソット)は、
・お皿を並べること
このように家族の仕事(メソット)を分ける事ができます。
フィールドの概念
それぞれのお仕事に必要な物の名前、料理名、行動の項目などをフィールドといいます。

例えば、登場人物(フィールド)があります。
・お母さん
・お父さん
・おばあちゃん
・子供
料理をするためには料理名(フィールド)があります。
・サバの塩焼き
・漬物
・味噌汁
・ご飯
それぞれ材料には金額(フィールド)があります。
・サバは300円
・漬物は200円
・味噌は300円
・ご飯は100円
このように、必要なフィールドを定義します。
お仕事には引き受ける「引数」と受け取る「戻り値」がある
引数とは、プログラムや渡す値(印)のことをいいます。
戻り値とは、プログラムや戻ってくる値(印)のこといいます。
例えば、お母さんクラスには、指示をすると言う仕事(メソット)があります。
料理ができたので、おばあちゃんクラスの盛り付け(メソット)に、渡す(引数)事で、料理を盛り付ける(戻り値)を、お母さんクラスの指示した料理の盛り付け(メソット)に渡す事ができます。

一人のクラスは1ファイルで生成するのが基本
エンジニアやプログラマーの考え方や、作業の内容、プログラミング言語によっては異なりますが、基本のファイル構造は、1つのクラスに対して、1ファイルで作成します。
javaの場合は、1ファイルにつき、1つのファイルで作成します。
家族の構成の場合は、以下の通りになります。
・メインクラス(main.java)
・お父さんクラス(お父さん.java)
・お母さんクラス(お母さん.java)
・おばあちゃんクラス(おばあちゃん.java)
・子供クラス(子供.java)
Pythonの場合は、以下の通りになります。
・メインクラス(main.py)
・お父さんクラス(お父さん.py)
・お母さんクラス(お母さん.py)
・おばあちゃんクラス(おばあちゃん.py)
・子供クラス(子供.py)
このようにそれぞれの人(クラス)事に、ファイル(箱)があると思ってください。
実行させるのが「インスタンス化」
それぞれの人(クラス)が、それぞれの働き(メソット)をメインで実行させる行為をインスタンス化と言います。
メインクラスとは、実行リーダーにあたります。
なので、この場合は、夕食がメインクラスになります。
あくまで今まの事柄は、家族の仕事を取り決めた「定義」に過ぎません。
実行して夕食を食べる(ゴール)まで進むためには、インスタンス化が必要です。
インスタンス化とは、「実行させる」行為と思ってください。
オブジェクト指向の3大機能
プライバシーを守りたい!「カプセル化」
カプセル化とは、この場合で言うと個人情報の保護と言えばわかりやすいでしょうか。
フィールド名(家族の名前)への書き込みや読み込み、メソットの呼び出しを制限する機能を言います。
例えば、以下のような処理に使います。
お父さんがお給料の中身をお母さんにバレないようにするために、お金の総額を秘密にする。
・お父さん、給料の金額フィールドの非公開
・労働に関するメソット
お母さんが夕食のおかずの買い物に使った総額を秘密にする。
・お母さん、食材の総額のフィールドの非公開
・買い物に関するメソット
など、秘密にしたい、そのほかの処理に使われたくない時にカプセル化をする事でアクセス制限する事ができます。
クラス同士親子関係を持たせる事ができる「継承」
継承とは、それぞれのクラスの中身で作成したメソッドを、他のクラスに受け継がせる行為を継承といいます。
例えば、お父さんクラスには、仕事をする仕事から帰ると言った行動と、お金を稼ぐ、テレビを見ると言った行動が必要になります。
・仕事をすると仕事から帰ってくると行動クラス
・テレビを見るテレビを止める行動クラス
・お金を稼ぐクラスと働く事を止める行動クラス
などがあるとして、バラバラなパーツを、お父さんの行動パターンによって、クラスを継承(他のクラスの受け継ぎ)して使う事ができます。
行動が多岐に変化する多能性(ポリモーフィズム)
多能性(ポリモーフィズム)とは、オブジェクトに合わせた実装で、メソッド名に合わせた振る舞いをさせること言います。
人によって解釈が異なるので、「こんなもんなんだ」の理解で留めてください。
例えば、2つの異なる「クラス」を利用していながら、同じ名前の「メソッド」を使うことができます。
・お父さんクラス(お父さんメソット:働き)
・お母さんクラス(お母さんメソット:働き
↓振る舞い↓
「なんかちょっと違うところあるけど、ざっくり見ればお父さんだよね。」
「なんかちょっと違うところあるけど、ざっくりみたらお母さんだよね。」
異なるクラスを利用しながらでも、同じ名前のメソットを使う事で、そのメソット名にあった振る舞い(挙動)をさせます。
オブジェクト指向のおさらい
オブジェクト指向とは、様々な役割や人や物が分業して、ある目的を達成するためのプログラムの考え方と説明しました。
いきなりプログラミングでjavaコードやPythonコードなど書くよりも、身近にある物で、まずは簡単な構造から考えてみると良いでしょう。
・クラスは、行動のするための役割を持った人物である。
・メソットは、クラスに仕事をお願いする事ができる行動である。
・フィールドは、クラスに必要な物(所有物)である。
・クラスに実行させるための指令をインスタンス化する。
・3大機能であるカプセル化、継承、多能性(ポリモーフィズム)。
プログラミングでのそれぞれの役割や、実際のコードについては、次に説明します。