導入
クラスの中には「外に見せてよいもの」と「隠すべきもの」があります。公開範囲を決めるのがアクセス修飾子(public/private)で、「内部を隠して安全な窓口だけ公開する」設計をカプセル化と呼びます。
図解
flowchart TB
subgraph クラス
PUB["public: 外部に公開<br/>Deposit() / Balance(読取)"]
PRIV["private: 内部だけ<br/>_balance / 検証ロジック"]
end
OUT["外部コード"] -->|使える| PUB
OUT -.->|使えない| PRIV
style PRIV fill:#ffebee
サンプル
var wallet = new Wallet();
wallet.Deposit(1000);
wallet.Deposit(-50); // 内部で弾かれる
Console.WriteLine(wallet.Balance); // 1000
// wallet._balance = 99999; // ← private なので外部から直接触れない(コンパイルエラー)
class Wallet
{
private int _balance; // 隠す: 直接いじられたくないデータ
public int Balance => _balance; // 読み取り専用で公開
public void Deposit(int amount) // 安全な操作だけ公開
{
if (amount > 0)
_balance += amount;
}
}
publicは外部に公開、privateはクラス内部からのみアクセス可能- データは
privateで隠し、publicなメソッドだけを窓口にする=カプセル化 - 「不正な操作をそもそもできなくする」ことで安全性が高まる
演習
var timer = new Timer();
timer.Add(30);
timer.Add(45);
Console.WriteLine(timer.Total); // 75
// TODO: 秒数を内部に private で持ち、Add(秒) で加算、Total で合計を読み取れる
// Timer クラスを定義してください(マイナスは加算しない)
___
- 期待される出力:
75
ヒント1を見る
private int _seconds; と public int Total => _seconds;
ヒント2を見る
class Timer { private int _seconds; public int Total => _seconds; public void Add(int s) { if (s > 0) _seconds += s; } }
まとめ
publicは公開、privateは内部限定- データを隠し、安全な操作だけ公開するのがカプセル化
- 不正操作を「できなくする」ことで堅牢になる
次回: 既存クラスを拡張する「継承」です。