---
title: "カプセル化とは？継承・多態性との違い【基本情報技術者試験】"
description: "オブジェクト指向のカプセル化を、内部を隠す、変更の影響を抑えるという判断軸で整理します。継承・多態性・抽象化との違いも比較し、基本情報技術者試験で選択肢を切る方法を解説します。"
last_modified_at: "2026-08-07"
canonical_url: "https://stemtazoo.github.io/fe/encapsulation/"
section: "fe"
---

## まず結論

**カプセル化（encapsulation）**とは、オブジェクトが持つデータと処理をひとまとめにし、内部の実装を外部から直接扱わせない考え方です。

科目Aでは、次の表現を手掛かりに判断します。

```text
内部データや実装を隠す
→ カプセル化

内部を変更しても、外部への影響を抑えやすい
→ カプセル化の効果
```

オブジェクト指向の代表的な性質は、次のように切り分けます。

```text
内部を隠す
→ カプセル化

親の性質を引き継ぐ
→ 継承

同じ命令で異なる動作をする
→ 多態性
```

## 直感的な説明

カプセル化は、機械の操作盤に近い考え方です。

利用者は、機械内部の配線や制御回路を知らなくても、ボタンやスイッチを使って操作できます。

```text
利用者
↓
公開された操作だけを使う
↓
内部で処理される
```

内部構造が変更されても、操作方法が同じなら、利用者は変更を意識せずに使い続けられます。

オブジェクト指向でも同様に、外部から使ってよい操作だけを公開し、内部のデータ構造や処理方法は隠します。

## 定義・仕組み

### データと処理をひとまとめにする

オブジェクトは、データである属性と、そのデータを操作するメソッドを持ちます。

```text
オブジェクト
├─ 属性
└─ メソッド
```

例えば、銀行口座をオブジェクトとして考えると、次のように表せます。

```text
銀行口座
├─ 残高
├─ 入金する
└─ 出金する
```

残高を外部から自由に変更できると、不正な値が設定される可能性があります。

```text
残高 = -1000000
```

そこで、残高は内部に隠し、入金や出金のメソッドを通して変更します。

### 外部との接点を限定する

カプセル化では、外部から利用できる操作を明確にします。

```text
外部へ公開する
→ 入金する
→ 出金する
→ 残高を確認する

内部へ隠す
→ 残高の保存方法
→ 入力値の検査方法
→ 計算処理の詳細
```

外部は公開された操作だけを使うため、内部の実装を変更しても影響を抑えやすくなります。

### 情報隠蔽との関係

カプセル化と情報隠蔽は、試験では近い意味で扱われることがあります。

整理すると、次の関係です。

```text
データと処理をまとめる
→ カプセル化

内部の詳細を外部から隠す
→ 情報隠蔽
```

カプセル化によって、情報隠蔽を実現しやすくなります。

### 変更の影響を小さくする

内部のデータ構造や処理方法を変更しても、外部向けの操作方法を維持できれば、利用側の修正を減らせます。

```text
内部実装を変更
↓
公開されたインタフェースは維持
↓
ほかのオブジェクトへの影響を抑える
```

## どんな場面で使う？

### 不正なデータ変更を防ぐ

データを直接変更させず、メソッドを通して値を確認できます。

```text
入力値を確認する
値の範囲を確認する
権限を確認する
```

例えば、出金処理では、残高不足を確認してから残高を減らすようにできます。

### プログラムの変更をしやすくする

内部の実装を変更しても、外部からの使い方が同じなら、利用側のプログラムを大きく修正せずに済みます。

```text
保存方法を変更
計算方法を変更
内部データ構造を変更
```

### オブジェクトごとの責任を分ける

各オブジェクトが、自分のデータと処理を管理するため、役割を分けやすくなります。

```text
注文オブジェクト
→ 注文内容を管理

顧客オブジェクト
→ 顧客情報を管理

商品オブジェクト
→ 商品情報を管理
```

## よくある誤解・混同

### 継承との違い

継承は、既存のクラスをもとに新しいクラスを作る仕組みです。

```text
親クラス
↓ 属性やメソッドを引き継ぐ
子クラス
```

試験では、次の表現が目印です。

```text
親クラス
子クラス
派生
属性を引き継ぐ
メソッドを引き継ぐ
```

```text
内部を隠す
→ カプセル化

親から引き継ぐ
→ 継承
```

### 多態性との違い

多態性（ポリモルフィズム）は、同じ操作でも、対象となるオブジェクトによって処理内容が変わる性質です。

```text
円.draw()
→ 円を描く

四角形.draw()
→ 四角形を描く
```

呼び出す側は同じ `draw()` を使っても、受け取るオブジェクトによって動作が変わります。

```text
同じメッセージ
異なる動作
→ 多態性
```

### 抽象化との違い

抽象化は、対象の重要な特徴だけを取り出して表現する考え方です。

例えば、自動車をシステムで扱う場合、すべての部品情報を表す必要はありません。

```text
必要な特徴
→ 車種
→ 速度
→ 燃料量

不要な詳細
→ ボルトの本数
→ 塗装工程
```

```text
必要な特徴だけに注目
→ 抽象化

内部の詳細を隠す
→ カプセル化
```

### カプセル化は、まとめるだけではない

データとメソッドを一つにまとめるだけでなく、外部からのアクセスを制限することが重要です。

```text
まとめる
＋
内部を隠す
→ カプセル化
```

### ユーザー定義型の追加はカプセル化ではない

独自の型を定義できることは、カプセル化そのものの効果ではありません。

構造体や列挙型など、手続き型言語でもユーザー定義型を作れる場合があります。

```text
独自の型を作れる
≠ カプセル化
```

### 科目Aでの切り分け

選択肢の動詞に注目すると判断しやすくなります。

```text
隠す・影響を抑える
→ カプセル化

引き継ぐ・派生する
→ 継承

同じ命令・異なる動作
→ 多態性

特徴を取り出す
→ 抽象化
```

特に、次の表現があればカプセル化を疑います。

```text
内部データを直接触らせない
内部実装を隠す
内部を変更しても影響を受けにくい
公開された操作だけを利用する
```

## まとめ（試験直前用）

- カプセル化は、データと処理をひとまとめにし、内部実装を隠す考え方
- 外部からは公開された操作だけを利用する
- 内部を変更しても、ほかのオブジェクトへの影響を抑えやすい
- 親クラスの属性やメソッドを引き継ぐのは継承
- 同じメッセージで異なる動作をするのは多態性
- 必要な特徴だけを取り出すのは抽象化

```text
隠す
→ カプセル化

引き継ぐ
→ 継承

同じ命令で動作が変わる
→ 多態性
```
