オブジェクト指向プログラミングの重要な概念のひとつに「カプセル化」があります。カプセル化とは、データや処理をクラスの内部にまとめ、外部から不必要に直接操作できないようにする仕組みです。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
を使います。これにより安全性と拡張性を両立した設計が可能になります。