【イラストでわかる】C#のカプセル化を初心者向けに徹底解説

広告

C#の勉強を始めると必ず出てくる「カプセル化(Encapsulation)」。オブジェクト指向の3大要素(カプセル化・継承・ポリモーフィズム)の一つですが、「privateとかpublicとか、結局何が嬉しいの?」と感じている人も多いのではないでしょうか。

この記事では、難しい言葉を使わず、イラストを中心にカプセル化の考え方を解説します。

1. カプセル化とは、薬のカプセルのようなもの

カプセル化を一言でいうと、「中身(データや処理の詳細)を外から見えないように包んで、必要な部分だけを外に見せる」という設計の考え方です。

薬のカプセルを思い浮かべてみてください。私たちは中にどんな粉末が入っているか知らなくても、カプセルを飲むだけで薬の効果を得られます。中身が変わっても、飲み方(インターフェース)が同じなら使う側は困りません。

C#のクラスもこれと同じで、「使う人が知る必要のない内部の詳細」を隠し、「使うために必要な窓口」だけを公開します。

カプセル化は薬のカプセルと同じ、という説明図

2. privateとpublicで役割分担する

C#では、クラスのメンバー(フィールドやメソッド)にprivatepublicといったアクセス修飾子を付けることで、「どこまで見せるか」をコントロールできます。

  • private:クラスの内部からしかアクセスできない(外からは見えない・触れない)
  • public:クラスの外からもアクセスできる(外に公開する窓口)

基本的な考え方はシンプルです。フィールド(データ)はprivateにして直接触らせず、必要な操作だけをpublicなプロパティやメソッドとして公開するのです。

privateとpublicの役割分担を示す図

こうしておくと、外部のコードは用意された「窓口」からしかクラスの中身を操作できません。窓口を通らない勝手な書き換えができなくなるので、クラスの中の状態が予測不能な形で壊れることを防げます。

3. なぜ大事なのか? — 値を守る「チェックの関所」

カプセル化が本当に力を発揮するのは、不正な値を防げるという点です。

もし年齢を表すAgeフィールドが誰からでも自由に書き換えられるpublicなフィールドだった場合、person.Age = -5;のような、現実にはあり得ない値が入ってしまっても止める方法がありません。

一方、フィールドをprivateにしてpublicなプロパティ経由でしか変更できないようにしておけば、値を代入する前に「その値は正しいか?」をチェックする関所を設けられます。

値を守るチェックの関所を示す図

このように、setter(値を設定する処理)の中でバリデーションを行うことで、「そもそも壊れたデータが存在しない」クラスを作れるのがカプセル化の大きなメリットです。

4. 実際のコードで確認してみよう

言葉だけでは分かりにくいので、簡単な銀行口座クラスBankAccountを例にコードを見てみましょう。

実際のC#コードで見るカプセル化の図解

ポイントは次の4つです。

  1. _balance(残高)はprivateにして、クラスの外から直接書き換えられないようにしている
  2. Balanceプロパティはgetだけを公開し、外からは「見る」ことしかできない読み取り専用にしている
  3. Deposit()(入金)では、0円以下の金額を弾いて不正な値を防いでいる
  4. Withdraw()(出金)でも、残高を超える出金ができないようにチェックしている

つまり、残高(_balance)を直接いじれるのはクラス自身だけであり、外部のコードはDeposit()Withdraw()という「安全な手続き」を通してしか残高を変更できません。これにより、「気づいたら残高がマイナスになっていた」というようなバグを構造的に防げます。

public class BankAccount
{
    private decimal _balance;

    public decimal Balance
    {
        get { return _balance; }
    }

    public BankAccount(decimal initial)
    {
        _balance = initial;
    }

    public void Deposit(decimal amount)
    {
        if (amount <= 0) return;
        _balance += amount;
    }

    public bool Withdraw(decimal amount)
    {
        if (amount <= 0 || amount > _balance) return false;
        _balance -= amount;
        return true;
    }
}

5. まとめ:カプセル化で得られる4つのメリット

最後に、カプセル化によって得られるメリットを整理しておきましょう。

カプセル化で得られる4つのメリットのまとめ図
  • データを守る:不正な値の代入を防止できる
  • 誤操作を防ぐ:意図しない使い方を構造でブロックできる
  • 変更に強い:内部の実装だけを後から自由に直せる(公開している窓口さえ変えなければ、使う側のコードに影響しない)
  • 使う側がシンプル:中身を知らなくても安心して呼び出せる

おわりに

カプセル化は「privateでデータを隠し、publicで必要な窓口だけを開ける」というシンプルなルールですが、これを徹底するだけでバグの起きにくい、変更に強いクラス設計ができるようになります。

最初は「なぜわざわざフィールドをprivateにしてプロパティ経由にするの?」と面倒に感じるかもしれませんが、今回のBankAccountの例のように、「クラス自身に自分のデータを守らせる」という感覚を持てると、オブジェクト指向の理解がぐっと深まります。ぜひ自分の書いているクラスでも、「このフィールドは本当にpublicである必要があるか?」を意識してみてください。

訪問数 5 回, 今日の訪問数 5回

広告

C#

Posted by hidepon