---
# System prepended metadata

title: 16-11. オブジェクト指向プログラミング
tags: [基本情報技術者試験]

---

# 16-11. オブジェクト指向プログラミング
## オブジェクト指向って何？
https://hackmd.io/v1lj9XzRTtWB-gWqg_TJnA 

## カプセル化って何？
- 例: 自動販売機
- ユーザがすること
  - コインを入れて
  - ドリンクを選択して
  - ドリンクを手に入れる
- 自動販売機の中の処理を変えたところで、ユーザには影響がない

#### メリットは？
- 実装方法を修正しても、影響が少ない

## クラスとインスタンスって何？
#### クラスって何？
- 設計図のようなもの
```
自動販売機クラス
【Data】
- coin
- drink
- color
【method】
- 選択されたドリンクを取得する処理
- 投入額を確認する処理
- 買えるかどうか判定するう処理
- ドリンクやお釣りなどをユーザに返す処理
```
#### インスタンスって何？
- 設計図をもとに、実体化したもの
```
- 赤い自販機
- 白い自販機
- 水だけ売る自販機
- 100円しか使用できない自販機
```

## クラスの階層構造って何？
- クラスに階層をもたせること
- 下位クラスは上位クラスのデータやメソッドなどの構造を受け継ぐことができる
- 上位クラスを**スーパークラス**、下位クラスを**サブクラス**という

```
- 自販機クラス(スーパークラス)
  - 一般的な自販機クラス(サブクラス)
  - コーヒー自販機クラス(サブクラス)
```

## 汎化と特化って何？
#### 汎化って何？
- **下位のクラスが持つ共通の性質**を抽出して上位クラスとして定義する
#### 特化って何？
- **抽象的な上位クラスをより具体的に**して下位クラスを定義する
```
【汎化】
一般的な自販機クラス/コーヒー自販機クラス → 自販機クラス
【特化】
自販機クラス → 一般的な自販機クラス/コーヒー自販機クラス
```

## 集約と分解って何？
- 「下位クラスは上位クラスの一部である」という関係
- 下位クラスは上位クラスを**分解**して定義したもの
- 上位クラスは下位クラスを**集約**して定義したもの
```
【分解】
自販機クラス → ボタンクラス/コイン投入口クラス
【集約】
ボタンクラス/コイン投入口クラス → 自販機クラス
```
## 多態性って何？
- 同じメッセージを複数のオブジェクトに送ると、それぞれが独立した固有の処理を行うこと
```
「選択した飲み物を出す処理」
- 一般的な自動販売機
  - 下の受け取り口から飲み物を出す
- コーヒー自販機
  - カップを用意して、飲み物を注いで出す
```

###### tags: `基本情報技術者試験`