プログラミング初心者のクラス理解を助ける（かもしれない）記事

# Overview
+ 前提条件
+ 基礎知識
+ クラスの基本
+ なぜ使うのか

# 前提条件
+ 変数と関数をほぼ理解していること<br>
です。

# 基礎知識
　前提条件にも書いてある通り、この解説には変数と関数の理解が必要です。もちろん知ってると思いますが一応復習しましょう。
もちろん知ってると思いますが
## 変数
　値を保存しておく箱です。プログラム実行中に一時的に使用したい値をメモリ上においておき、プログラムが終了すると自動的に消えます。
## 関数
　処理をまとめる箱です。プログラム内で何度も書かれる同じ処理を一つにまとめておくものです。
これを書いておくことで、同じようなコードを何度も書かなくてすみますし、可読性やメンテナンス性もあがります。

# クラスの基本
　「クラスは関連する変数とメソッドを一つにまとめておくものです。」
だいたいこの説明が出てきますが使ってみないと実感がわかないと思います。最終的な理解にはなんの言語でもいいので自分でクラスを設計できることが求められます。
ですが最初からは難しいので、まずはこの記事でよく使われるたとえを使ってコードを書く前のイメージをざっくり説明したいと思います。

## イメージ
　クラスのイメージはよく車の設計書・依頼書に例えられます。小学校とかで自動車工場見学に行ったことがある人は分かると思いますが、車一台一台には説明書が貼ってあります。工場の人は車を購入した人のカスタマイズにおおじて車の部品を組み立てるのです。
　クラスはいわばこの設計書です。

![5103933107_f5ce3a288b_z.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1409495/47fcca81-1c03-e3ce-e7fd-a3d0d3a3474e.jpeg)
画像：https://www.flickr.com/photos/nissanev/5103933107

　例えば、ライトの色、カーナビの有無、車の色、シートの材質など様々なデータが書かれていますが、このようなデータがバラバラだったらどうでしょうか？　いちいち書類をあさってデータを探さなくてはなりませんよね？　しかもバラバラに保存してあるので誰のデータかもわかりにくく、車の部品を間違ってつけてしまうかもしれませんよね？

　そこで用意されているのが設計書のテンプレートです。どんなデータを顧客から聞き出して保存しておくか予め決めておけば、注文もすごく楽になりますよね？また書いたデータも必要なものはすべて揃っているので、作る方も楽になります。

## イメージとプログラムのリンク
　先ほど挙げた例はプログラムでいうと下のような感じになっています。
設計書　→　クラス
設計書の定義　→　クラス定義
設計書に顧客のデータを書き込む　→　インスタンス化

## インスタンス・インスタンス化
　クラスは定義しただけではなんにも役に立ちません。クラスは実際使わないと折角の便利な機能が台無しです。
インスタンス化は、クラスにデータを入れていき一つのデータのまとまりを作ることをいいます。車の例で例えるなら、顧客からカスタマイズのデータを聞き出し、設計書に書き込んでいく作業のことです。
そうすることで、他の人のデータが混ざることがなくなるのです。

## クラスの定義とインスタンスの作成
　ここはよく間違われるのですが、クラスの定義とインスタンスの作成は全く違います。
クラスの定義はあくまでも、なんのデータを保持するかのテンプレートを作っているだけです。
対してインスタンスの作成（インスタンス化）は本物のデータを代入します。
ここは、よく間違われるので気をつけてください。

##　基本のまとめ
　クラスのイメージがよくわかりましたか？
クラスが書けない７割はこの概念や有用性を理解できていないからだと思います。残りの３割はプログラミング言語特有の文法がわからなくて躓いているのだと思います。しかしダイジョブです。概念理解はこのような例で考えるとわかりやすいですし、言語の文法は違えど機能はほぼ同じなので、文法はGoogle先生に聞いてください。

# クラスをなぜつかうのか？
　クラスは、変数と関数をまとめておくものだと説明しましたがその理由を見ていきましょう。

## 変数をまとめる理由
まずは、クラスで変数をまとめておく理由を見ていきましょう。

クラスを使わない場合

``` python
car1_owner = "A子"
car1_color = "red"
car1_light_color = "white"
car1_seat_color = "grey"

car2_owner = "B子"
car2_color = "green"
car2_light_color = "yellow"
car2_seat_color = "grey"
```
※Pythonのコード
とってもわかりにくいですよね？　これが何百・何千と連なるととてもじゃないけど管理できませんよね？

対してクラスを使用するとどうなるかも見てみましょう。

クラスの定義

``` python
class Car:
    def __init__(self, owner, color, light_color, seat_color):
        self.owner = owner
        self.color = color
        self.light_color = light_color
        self.seat_color = seat_color 
# 上の４つの変数は、インスタンス変数と呼ばれる。
```
クラスの中に格納する値を保持する変数のことをインスタンス変数・メンバ変数・フィールドなどと呼ばれる。

インスタンス化

``` python
# car1 & car2 はインスタンス
car1 = Car("A子", "red", "white", "grey")
car2 = Car("B子", "green", "yellow", "grey")
```

とても簡潔じゃないですか？　あとはこのインスタンスをリスト配列などに格納すればデータをわかりやすく管理できます。
また、格納した個々の値（インスタンス変数）を取るのもとても簡単です。

``` python
print(car1.owner)
# 出力：A子
print(car2.color)
# 出力：green
```

## 関数をまとめる理由
では次にクラスに関数をまとめる理由を見ていきましょう。
クラスを使わい場合

``` python
# データの用意
car1_owner = "A子"
car1_color = "red"
car1_light_color = "white"
car1_seat_color = "grey"

car2_owner = "B子"
car2_color = "green"
car2_light_color = "yellow"
car2_seat_color = "grey"

# 関数の定義
def car_manufacturing(car_owner, car_color, car_light_color, car_seat_color):
   # 関数の処理

car_manufacturing(car1_owner, car1_color, car1_light_color, car1_seat_color)
car_manufacturing(car2_owner, car2_color, car2_light_color, car2_seat_color)
``` 

クラスを使う場合

``` python
class Car:
    def __init__(self, owner, color, light_color, seat_color):
        self.owner = owner
        self.color = color
        self.light_color = light_color
        self.seat_color = seat_color

    # インスタンスメソッド
    def manufacturing(self):
        # 関数の処理

car1 = Car("A子", "red", "white", "grey")
car2 = Car("B子", "green", "yellow", "grey")

# 関数の使用
car1.manufacturing()
car2.manufacturing()
```
※クラスの中にセットで定義された関数はインスタンスメソッドと呼びます。
やはりクラスは簡潔ですよね。インスタンスメソッドもインスタンス変数同様に簡単にアクセスできますし、引数を取らなくても自分でインスタンス変数内の値にアクセスできるため引数のミスなども減ります。

やはりクラスはいいことづくしです。

# まとめ
　以上の点からコードを簡潔かつに書くためにはクラスはとても役にたちます。知っておいて損はないでしょう。
まだクラスを理解できていない方はぜひ概念から詳しく理解して、コーディングに活かしてもらえればと思います。

# 追記
　誤字脱字などはお許しください❤