カプセル化 かぷせるか
簡単に言うとこんな感じ!
薬のカプセルみたいに、データと操作をひとつの箱にまとめて、外から直接いじれないようにする仕組みだよ。「見せていい部分だけ公開して、内側は触らせない」ってルールを作ることで、ほかの人が誤って壊すのを防ぐんだ!
カプセル化とは
カプセル化(Encapsulation)とは、オブジェクト指向プログラミングの基本原則のひとつで、データ(属性)とそのデータを操作するメソッド(関数)をひとつのクラスにまとめ、外部から直接アクセスできないように隠す設計の考え方です。
たとえば銀行口座を例にすると、「残高」という数値を外部から直接書き換えできてしまうと、マイナスにされたり不正な値を入れられたりするリスクがあります。カプセル化を使えば、残高は隠しておき、「入金する」「出金する」という専用の窓口(メソッド)を通してのみ操作できるようにできます。
この仕組みによって、内部の実装を変えてもほかのコードに影響が出にくくなるという大きなメリットがあります。システムの保守・拡張がしやすくなるため、大規模開発やチーム開発では特に重要な概念です。
カプセル化の構造と仕組み
カプセル化は主に アクセス修飾子 を使って実現します。アクセス修飾子とは「誰がこのデータ・メソッドを使えるか」を指定するキーワードです。
| アクセス修飾子 | 意味 | 外部からのアクセス |
|---|---|---|
public | 公開 | ✅ 誰でもアクセス可 |
private | 非公開 | ❌ クラス内部からのみ |
protected | 限定公開 | ⚠️ 継承先クラスまで |
実際のコードイメージ(Java風の擬似コード):
class BankAccount {
private int balance = 0; // ← 外から直接触れない
public void deposit(int amount) { // ← 公開窓口(入金)
if (amount > 0) balance += amount;
}
public int getBalance() { // ← 公開窓口(残高確認)
return balance;
}
}
覚え方:「カプセル薬」で考える
薬のカプセルを思い浮かべてください。
- 外側(カプセルの皮) →
publicなメソッド。外から触れる部分 - 中身(有効成分) →
privateなデータ。直接触ってはいけない部分
「中身を守るために皮で包む」=カプセル化、と覚えると忘れにくいです。
getter / setter とは
private にしたデータへの読み書きを、専用メソッド経由で行う仕組みが getter(読み取り) と setter(書き込み) です。
| メソッド | 役割 | 例 |
|---|---|---|
| getter | 値を取得する読み取り専用の窓口 | getBalance() |
| setter | 値を変更する書き込み窓口(バリデーションも可能) | setName(String name) |
setter にチェック処理を入れることで、「マイナスの金額は受け付けない」といったガード処理が自然に実現できます。
歴史と背景
- 1960年代 — SimulaやSmalltalkなど初期のオブジェクト指向言語が登場。データと手続きをまとめる概念が生まれる
- 1980年代 — C++がカプセル化を言語仕様として明示的にサポート。
private/publicといったアクセス修飾子が一般化 - 1990年代 — JavaやPythonが普及し、カプセル化はソフトウェア設計の標準的な原則として定着
- 2000年代〜 — アジャイル開発・大規模チーム開発の普及とともに、「内部実装の変更が外部に影響しにくい」カプセル化の価値が再評価される
- 現在 — オブジェクト指向に限らず、関数型プログラミングやマイクロサービス設計にも「外部に公開するインターフェースを絞る」という同様の考え方が応用されている
オブジェクト指向の4大原則との関係
カプセル化はオブジェクト指向の4大原則のひとつです。それぞれの役割を整理しておきましょう。
カプセル化と情報隠蔽の違い
よく混同されますが、厳密には別の概念です。
| 概念 | 意味 |
|---|---|
| カプセル化 | データと操作をひとつにまとめること(バンドル) |
| 情報隠蔽 | 内部の詳細を外から見えなくすること(ハイディング) |
カプセル化は情報隠蔽を実現する手段のひとつ、と理解するとスッキリします。