【新人教育 資料】第2章 UMLまでの道 〜クラス編〜

#【新人教育 資料】第2章 UMLまでの道 〜クラス編〜
## あらすじ
新人がいっぱい入ってくる。新人のレベルもバラバラ。教育資料も古くなっているので、更新しましょう。
どうせなら、公開しちゃえばいいじゃん。という流れになり、新人教育用の資料を順次更新していくことにしました。

※後々、リクエストに応じて更新することが多いのでストックしておくことをおすすめします。

自分は[TEMONA株式会社](http://temona.co.jp/)でCTOをしていますが、頭でっかちに理論ばっかり学習するよりは、イメージがなんとなく掴めるように学習し、実践の中で知識を深めていく方が効率的に学習出来ると考えています。

※他の登壇やインタビュー記事は[Wantedly](https://www.wantedly.com/users/105935)から見てください。

教育スタイルとしては正しい事をきっちりかっちり教えるのではなく、未経験レベルの人がなんとなく掴めるように、資料を構成していきます。

以下のようなシリーズネタで進めます。

|No.|記事|
|:-----------|-----------|
|1|[【新人教育 資料】第1章 UMLまでの道 〜オブジェクト指向編〜](http://qiita.com/devopsCoordinator/items/7d460008177b318129ea) |
|2|[【新人教育 資料】第2章 UMLまでの道 〜クラス編〜](http://qiita.com/devopsCoordinator/items/3cde12abce689ff6906b) |
|3|[【新人教育 資料】第3章 UMLまでの道 〜図種類紹介とクラス図の解説編〜](http://qiita.com/devopsCoordinator/items/213e45694dfac0edcfbc) |
|4|[【新人教育 資料】第4章 UMLまでの道 〜クラス図を書いてみよう編〜](http://qiita.com/devopsCoordinator/items/8d2af381c1c469103459) |
|5|[【新人教育 資料】第5章 UMLまでの道 〜ユースケース図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/bbd57df681844308fb5d) |
|6|[【新人教育 資料】第6章 UMLまでの道 〜ステートマシン図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/289f77fc83813ba7cc76)|
|7|[【新人教育 資料】第7章 UMLまでの道 〜アクティビティ図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/e4910ace92e66bece10f)|
|8|[【新人教育 資料】第8章 UMLまでの道 〜シーケンス図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/4535c3cce207b114ad6c)|


箸休めには以下をどうぞ

[【新人教育 資料】ハードウェア編](http://qiita.com/devopsCoordinator/items/1aa4a76072a61b15c56f)

では、今回もはじめていきましょう！

## クラス(Class)
前回の[【新人教育 資料】UMLまでの道 〜オブジェクト指向編〜](http://qiita.com/devopsCoordinator/items/7d460008177b318129ea)でオブジェクトは属性を持つという事を説明しました。

クラスは同じ属性を持つオブジェクトをまとめて抽象的に表現するものだと考えてください。

より簡略に言うと、「**たい焼きの型**」みたいなもんだと思ってください。この例えは、読み進めていくとなんとなく理解出来ると思います。

では少しみていきましょう。

### クラスは属性と操作を持つ

#### 人

|人 | Aさん | Bさん |
|:-----------|------------:|:------------:|
| 名前       |        渋谷太郎 |     新宿花子     |
| 性別     |      男 |    女    |
| 身長       |        175cm |     155cm     |
| 体重         |          70kg |      50kg      |

上記の表から「Aさん」と「Bさん」の共通する属性と操作(動作)をみると以下のようになります。

- 属性
 - 名前
 - 性別
 - 身長
 - 体重

- 操作
 - 食事をする
 - 会話をする
 - 寝る 

AさんとBさんというオブジェクトをみると、共通項が見つかり、人という抽象的な概念があることが分かります。これがクラスです。「人」のクラスは「名前」などの属性を持ちますが、値はありません。

クラスの責務は「操作(動作)」です。クラスで各オブジェクト共通な操作をします。

### クラスからインスタンス(オブジェクト)を作る

|人 |
|-----------|
| 名前       |
| 性別       |
| 身長       |
| 体重       |

↓ 名前や性別などの属性にして、インスタンスを作る

|人 | Aさん |
|:-----------|------------:|
| 名前       |        渋谷太郎 |     新宿花子     |
| 性別     |      男 |    女    |
| 身長       |        175cm |     155cm     |
| 体重         |          70kg |      50kg      |

プログラムをやっていたりすると、クラスとやらインスタンス、オブジェクトという言葉を聞くと混乱しますよね。UMLの世界とプログラムの世界（言語によっても違う）では厳密に言うと取り扱われ方が若干違うのですが、ここでいう、オブジェクトとインスタンスはニアリーイコールだと思ってください。

具体的な「もの」は全てオブジェクトと呼べます。インスタンスは、クラスを基に作られる、オブジェクトだと思ってください。

冒頭に説明したクラスは「**たい焼きの型**」と言っていたのがなんとなく伝わったでしょうか？

たい焼きの型という**クラスに**生地、クリームなどの**属性**をいれて、出来上がるのがクリーム味のたい焼きという**インスタンス**です。

生地にほうれん草が練りこまれていても、中身があんこだろうとクリームだろうとたい焼きですよね。

### 可視性(難しい人はSKIPしてください）
可視性は、開発をするようになったら、必ず理解しなければならないものですが、最初のつまづきポイントなので、難しい人はSKIPでよいと思います。前段のところで、クラスは「たい焼きの型」のようなものと紹介しましたが、これはプログラム上ではクラス定義といって、「たい焼きの型」がどのようなものかを定義しています。可視性とはそのクラス定義の外部（他のクラス）から属性または操作にアクセスできるかどうかを示したものです。

|可視性|表記|説明|
|:-----------|-----------|-----------|
|private|-|このクラスの内部定義からのみアクセス出来る|
|protected|#|このクラス、およびこのクラスを継承するクラスからのみアクセス出来る|
|package private|~|このクラスを含むパッケージ内、および明示的に型をインポートする全てのパッケージ内でアクセス出来る|
|public|+|他の全てのクラスからアクセス出来る|

なんとなく雰囲気だけでも分かるように説明してみましょう。
以下のようなクラスがあります。

|人 |可視性|
|-----------|-----------|
| ーー属性ーー|
| 名前 | package private |
| 性別 | public |
| 体重 | package private |
| 自分だけの秘密| private |
| 家族しか知らない思い出| protected |
| ーー操作ーー|
| あいさつをする|public|
| 名前を教える|package private|
| 体重を教える|private|

可視性をニュアンスで伝えるとしたら

- private
 - 自分しか知らない。
- protected
 - 親しか知らない。
- package private
 - 知り合いは知っている。
- public
 - 見た目で分かる。知っていても問題ない。 

のようなものだと思ってください。
実際に開発する際は、これは可視性は大事なものになるので、しっかりと考えた上で使い分けましょう。

## あとがき
この資料は「UMLまでの道」と題して、UMLでも比較的多用するダイアグラムを書けるように、構成していきます。
[【新人教育 資料】UMLまでの道 〜オブジェクト指向編〜](http://qiita.com/devopsCoordinator/items/7d460008177b318129ea)でオブジェクト指向やオブジェクトについて、今回でクラスやインスタンスについて説明したので、次回はUMLのダイアグラムについて説明したいと思います。UMLのダイアグラムについて説明した後は、PlantUMLを使ってUMLモデリングしていきます。