オブジェクト指向プログラミングの重要な概念のひとつに「カプセル化」があります。カプセル化とは、データや処理をクラスの内部にまとめ、外部から不必要に直接操作できないようにする仕組みです。C# では「アクセス修飾子」を使ってメンバーの公開範囲を制御します。本記事では public・private・protected の基本的な使い方を解説します。
カプセル化とは?
カプセル化の目的は次の通りです。
- クラス内部のデータを外部から守る
 - 意図しない変更を防ぎ、データの整合性を保つ
 - 外部に公開する必要のある機能だけを提供する
 
これを実現するために使うのがアクセス修飾子です。
public|どこからでもアクセス可能
  public は最もオープンな修飾子で、クラスの外部から自由にアクセスできます。外部に公開したいメソッドやプロパティに使用します。
class Person
{
    public string Name { get; set; }  // どこからでも参照・変更可能
}
class Program
{
    static void Main()
    {
        Person p = new Person();
        p.Name = "Taro";              // 外部から代入可能
        Console.WriteLine(p.Name);    // 外部から参照可能
    }
}
private|クラス内部のみアクセス可能
  private は最も制限が強く、同じクラスの内部からしかアクセスできません。外部に公開したくないデータを隠すために使います。デフォルトのアクセス修飾子は private です。
class BankAccount
{
    private int balance = 0;  // 外部から直接アクセス不可
    public void Deposit(int amount)
    {
        if (amount > 0)
        {
            balance += amount;
        }
    }
    public int GetBalance()
    {
        return balance;
    }
}
class Program
{
    static void Main()
    {
        BankAccount account = new BankAccount();
        account.Deposit(1000);
        Console.WriteLine(account.GetBalance()); // 1000
        // account.balance = 5000; // エラー:private のためアクセス不可
    }
}
protected|派生クラスからアクセス可能
  protected はクラス外部からはアクセスできませんが、継承した派生クラスからは利用可能です。基底クラスで共通のデータを保持し、子クラスでのみ操作させたいときに使います。
class Animal
{
    protected string Name;
    public Animal(string name)
    {
        Name = name;
    }
}
class Dog : Animal
{
    public Dog(string name) : base(name) { }
    public void Bark()
    {
        Console.WriteLine($"{Name} が吠えます:ワンワン!");
    }
}
class Program
{
    static void Main()
    {
        Dog dog = new Dog("ポチ");
        dog.Bark(); 
        // dog.Name = "タマ"; // エラー:protected のため外部からはアクセス不可
    }
}
アクセス修飾子の比較表
| 修飾子 | アクセス可能範囲 | 用途 | 
|---|---|---|
| public | すべてのクラスからアクセス可能 | 外部に公開したい API やプロパティ | 
| private | 同じクラス内のみ | 内部処理用のデータや補助メソッド | 
| protected | 同じクラスと派生クラス | 継承したクラスで共有するデータ | 
まとめ
  C# のカプセル化では、アクセス修飾子を正しく使うことが重要です。基本は private でデータを守り、必要に応じて public で外部に公開し、継承関係で利用する場合は protected を使います。これにより安全性と拡張性を両立した設計が可能になります。
  
  
  
  