カプセル化とは? — オブジェクト指向の基本をやさしく理解する
カプセル化の目的
- カプセル化(Encapsulation)は、「データと処理をひとまとめにして、外部から直接触れないようにする」仕組みです。
- オブジェクト指向の三大要素(カプセル化・継承・多態性)の中でも、最も基礎的な考え方です。
たい焼き器でたとえるカプセル化
たい焼き器を「オブジェクト」と考えてみましょう。
| 要素 | たい焼き器の例 | プログラムでの対応 |
|---|---|---|
| データ | あんこ・生地の量 | クラスのフィールド(変数) |
| メソッド | 焼く・型に流す・取り出す | クラスのメソッド(関数) |
| 外部操作 | ボタンを押す・タイマーを設定する | メソッド呼び出し |
| 内部処理 | 温度制御・焼き加減の調整 | privateメソッドや内部ロジック |
- 外から見えるのは「焼くボタン」だけ
- 中で何度で焼いているか、どんな順番で生地を流しているかは見えない
- 材料の量(生地・あんこ)は勝手に触れない
- 必要なら「材料の残量を確認する窓(getter)」だけ用意する
- 材料を補充する場合も「補充口(setter)」を通す
つまり、
外部は“決められた操作だけ”を使い、内部の状態は勝手に触れない
という仕組みがカプセル化です。
Javaで実装する「たい焼き器のカプセル化
java TaiyakiMaker.java
public class TaiyakiMaker {
// データ(内部状態)は private で隠す
private int batterAmount = 100; // 生地
private int ankoAmount = 50; // あんこ
// 外部に公開するメソッド(たい焼きを焼く)
public void bake() {
if (batterAmount >= 10 && ankoAmount >= 5) {
batterAmount -= 10;
ankoAmount -= 5;
System.out.println("たい焼きを焼きました!");
} else {
System.out.println("材料が足りません。");
}
}
// getter(残量を確認する)
public int getBatterAmount() {
return batterAmount;
}
public int getAnkoAmount() {
return ankoAmount;
}
// setter(材料を補充する)
public void setBatterAmount(int amount) {
if (amount >= 0) {
this.batterAmount = amount;
}
}
public void setAnkoAmount(int amount) {
if (amount >= 0) {
this.ankoAmount = amount;
}
}
// 内部処理(外部から直接呼べない)
private void adjustTemperature() {
System.out.println("温度を自動調整中...");
}
}
getter/setter を使う理由
1.勝手にデータを書き換えられない
taiyakiMaker.batterAmount = -999; // ← こういう事故を防げる
//バターの量がマイナスはあり得ない
2.値のチェックを挟める
- setter の中で「0以上か?」などのバリデーションができる。
3.内部構造を変えても外部コードが壊れない
- フィールド名を変えても、getter/setter の契約を守れば外部は影響を受けない。
カプセル化のメリットまとめ
| メリット | 説明 |
|---|---|
| 安全性 | 不正な値の代入を防げる |
| 保守性 | 内部構造を自由に変更できる |
| 拡張性 | setter 内でログ・通知・計算などを追加できる |
| 可読性 | 「何を公開しているか」が明確になる |
まとめ
- カプセル化は「たい焼き器の内部を隠す」イメージ
- データは private で守る
- 外部は getter/setter や公開メソッドを通してのみ 操作する
- 内部処理は自由に変更でき、外部に影響を与えない