【C#】カプセル化とアクセス修飾子(public・private・protected)の使い方

オブジェクト指向プログラミングの重要な概念のひとつに「カプセル化」があります。カプセル化とは、データや処理をクラスの内部にまとめ、外部から不必要に直接操作できないようにする仕組みです。C# では「アクセス修飾子」を使ってメンバーの公開範囲を制御します。本記事では publicprivateprotected の基本的な使い方を解説します。

カプセル化とは?

カプセル化の目的は次の通りです。

  • クラス内部のデータを外部から守る
  • 意図しない変更を防ぎ、データの整合性を保つ
  • 外部に公開する必要のある機能だけを提供する

これを実現するために使うのがアクセス修飾子です。

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 を使います。これにより安全性と拡張性を両立した設計が可能になります。