C#のメソッドとクラスメンバーのアクセス修飾子まとめ
生徒
「C#では、クラスやメソッドって、ほかの場所から自由に使えるんですか?」
先生
「いい質問ですね。C#では『アクセス修飾子』という仕組みを使って、どこから使えるかを決めるんです。」
生徒
「アクセス修飾子?難しそう……どんな種類があるんですか?」
先生
「種類は多くありません。ひとつずつ見ていけば、すぐに理解できますよ。では基本から見ていきましょう!」
1. アクセス修飾子とは?
C#(シーシャープ)では、クラスやメソッド、変数などのクラスメンバーが「どこからアクセスできるか」を制御する仕組みがあります。それがアクセス修飾子です。アクセス修飾子を使うことで、プログラムの安全性や保守性を高めることができます。
たとえば、「この変数は外から触られたくない」「このメソッドはどこからでも使えるようにしたい」といったルールを決められるのです。
2. よく使うアクセス修飾子の一覧
C#では、以下のようなアクセス修飾子があります。
- public(パブリック)…どこからでもアクセス可能
- private(プライベート)…同じクラスの中からのみアクセス可能
- protected(プロテクテッド)…同じクラスと継承したクラスからアクセス可能
- internal(インターナル)…同じプロジェクト内からのみアクセス可能
- protected internal…継承または同じプロジェクト内からアクセス可能
- private protected…継承したクラスの中でも同じプロジェクト内からのみアクセス可能
3. 実際にコードでアクセス修飾子を確認しよう
次のサンプルコードでは、各アクセス修飾子がどう使われているかを見てみましょう。
public class MyClass
{
public void PublicMethod()
{
Console.WriteLine("これはpublicメソッドです。");
}
private void PrivateMethod()
{
Console.WriteLine("これはprivateメソッドです。");
}
protected void ProtectedMethod()
{
Console.WriteLine("これはprotectedメソッドです。");
}
internal void InternalMethod()
{
Console.WriteLine("これはinternalメソッドです。");
}
protected internal void ProtectedInternalMethod()
{
Console.WriteLine("これはprotected internalメソッドです。");
}
private protected void PrivateProtectedMethod()
{
Console.WriteLine("これはprivate protectedメソッドです。");
}
}
このように、同じクラスの中であればどの修飾子でも呼び出すことができますが、クラスの外や別プロジェクトから使えるかどうかは修飾子によって変わります。
4. publicとprivateの違いを身近な例で理解しよう
アクセス修飾子をイメージしやすくするために、「家の中」に例えてみましょう。
- publicは「玄関」…誰でも入ってこれる場所
- privateは「自分の部屋」…自分しか入れない場所
- protectedは「家族だけが入れる部屋」
- internalは「同じマンションの住人だけが入れる共有スペース」
このように、それぞれの修飾子が「誰に開かれているか」を表しています。
5. アクセス修飾子とメソッドの組み合わせ例
メソッドにアクセス修飾子を付けることで、そのメソッドがどこから呼び出せるのかが決まります。次のコードを見てみましょう。
public class Car
{
public void StartEngine()
{
Console.WriteLine("エンジンを始動します。");
CheckBattery();
}
private void CheckBattery()
{
Console.WriteLine("バッテリーをチェック中...");
}
}
上記の例では、外部からはStartEngine()しか呼び出せません。CheckBattery()はprivateなので、Carクラスの中でしか使えません。
エンジンを始動します。
バッテリーをチェック中...
6. クラス自体のアクセス修飾子
実は、クラスにもアクセス修飾子を付けることができます。ただし、トップレベルのクラス(=ファイルの中で直接定義されるクラス)にはpublicまたはinternalしか使えません。
public class MyPublicClass
{
// どこからでも使えるクラス
}
internal class MyInternalClass
{
// 同じプロジェクト内だけで使えるクラス
}
これにより、クラスそのものが外部から使えるかどうかを制御できます。
7. どの修飾子を使えばいいの?
迷ったときは、次のような考え方がおすすめです。
- 基本はprivateにして、必要なものだけpublicにする
- 外部に公開したいメソッドだけ
publicにする - 内部でしか使わないヘルパーメソッドは
privateにする - ライブラリやクラス設計で拡張を意識するなら
protectedやinternalを使う
すべてをpublicにすると、安全性が下がってしまうので注意が必要です。
まとめ
C#のアクセス修飾子は、クラスやメソッド、フィールドの使われ方を正しく整理し、プログラムを安全に運用するための大切な仕組みです。今回の記事では、public、private、protected、internalといった基本的なアクセス修飾子がどのように働くのかを理解し、実際のコードでどのように使い分けるのかを丁寧に確認しました。アクセス修飾子を正しく設定することで、意図しない場所からクラスメンバーが参照されることを防ぎ、プログラム全体の見通しが良くなります。メソッドの公開範囲を適切に絞ることで、ほかのクラスや外部コードに依存しすぎない、安定したオブジェクト指向設計が実現できます。とくに初心者のうちは、ついすべてをpublicにしてしまいがちですが、privateを基本にし、必要な部分だけpublicやprotectedとして公開していく流れを意識すると、自然と読みやすいコードへと近づきます。
アクセス修飾子は、単なる制限ではなく「よりよい設計を支えるための道具」です。たとえばライブラリや共通クラスを作るときには、internalを使ってプロジェクト内だけにアクセス範囲を絞り、protectedを使って継承関係の中だけで利用できるように調整するなど、クラスをどう使ってほしいかに応じて柔軟に使い分けることができます。また、private protectedのように複合的な制御を行う修飾子も存在し、継承とプロジェクト構成の両方を考慮した設計が可能になります。これらは実務でのクラス設計にも直結しており、適切なアクセス範囲を決めることがそのまま拡張性や保守性の高さにつながることを理解しておくと、より深いレベルでC#を扱えるようになります。
以下に、アクセス修飾子の利用イメージを整理するためのサンプルコードを示します。クラスメンバーの公開範囲をどのように設計するかによって、外部から呼べるメソッド、内部のみに隠しておきたい処理、継承時に公開したい機能が明確になります。特にヘルパーメソッドをprivateとして隠し、外部に公開するメソッドだけをpublicにする設計は、非常に実用性が高いパターンです。
public class UserService
{
public void CreateUser()
{
Console.WriteLine("ユーザーを作成します。");
ValidateInput();
SaveDatabase();
}
private void ValidateInput()
{
Console.WriteLine("入力値を検証しています。");
}
private protected void SaveDatabase()
{
Console.WriteLine("データベースに保存中...");
}
protected internal void LogAction()
{
Console.WriteLine("操作ログを記録しました。");
}
}
この例では、CreateUserは外部から呼び出して操作できるメソッドであり、入力検証は外部に公開する必要がないためprivateに、データ保存は継承クラスからの利用も考慮してprivate protectedに設定しています。さらに、ログ処理は同一プロジェクト内や継承関係で使えるようにprotected internal にしています。このような工夫を重ねることで、クラスの責任範囲を自然に整理でき、プログラムの安定性を維持できます。またアクセス修飾子を意識する習慣を身につけることで、「どこから使われるべき機能なのか」を自分で説明できるコードを書く力も育っていきます。
生徒
「アクセス修飾子ってただのルールだと思っていましたが、クラスを守るための大事な仕組みなんですね。」
先生
「そのとおりです。どこから使ってほしいのかを明確にできると、クラスの設計がずっと安定しますよ。」
生徒
「publicばかり使っていたのを反省しました……これからはprivateを基本にして、必要な範囲だけ公開するようにしてみます。」
先生
「とても良い考え方ですね。プログラムが大きくなるほど、アクセス修飾子の役割が重要になります。少しずつ慣れていきましょう。」