本文へスキップ
BecomeCoder

C#オブジェクト指向コース · 第1章 オブジェクト指向 · レッスン5

アクセス修飾子とカプセル化

ブラウザで完結

導入

クラスの中には「外に見せてよいもの」と「隠すべきもの」があります。公開範囲を決めるのがアクセス修飾子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は内部限定
  • データを隠し、安全な操作だけ公開するのがカプセル化
  • 不正操作を「できなくする」ことで堅牢になる

次回: 既存クラスを拡張する「継承」です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。