C#のpublic・protected・privateアクセス修飾子の違いを徹底解説
はじめに
C#には、クラスのメンバー(フィールドやメソッド)へのアクセス範囲を制御するための「アクセス修飾子」が用意されています。中でもよく使われるのが public、protected、private の3つです。それぞれ外部からのアクセス可否や継承関係での扱いが異なるため、適切に使い分けることが重要です。
本記事では、各アクセス修飾子の特徴を、実際のコード例と実行結果とともにわかりやすく解説します。
public アクセス修飾子とは
public を付けたメンバーは、クラスの内外を問わず、どこからでもアクセスできます。他のクラスやオブジェクトに対してメンバー変数やメソッドを公開したい場合に使用します。
コード例
using System;
namespace Demo {
class Rectangle {
public double length;
public double width;
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
} //end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.length = 7;
r.width = 10;
r.Display();
Console.ReadLine();
}
}
}実行結果
Length: 7 Width: 10 Area: 70
この例では、Rectangle クラスの length・width フィールドおよび GetArea()・Display() メソッドがすべて public として宣言されているため、Main メソッドから r.length = 7; のように直接アクセスできています。
protected アクセス修飾子とは
protected を付けたメンバーは、そのクラス自身と、そのクラスを継承した派生クラス(子クラス)からのみアクセスできます。クラスの外部からは直接アクセスできないため、継承関係にあるクラス間だけで共有したいメンバーに適しています。
次の例では、protected メンバーへ派生クラスからアクセスする方法を示します。
コード例
using System;
namespace MySpecifiers {
class Demo {
protected string name = "Website";
protected void Display(string str) {
Console.WriteLine("Tabs: " + str);
}
}
class Test : Demo {
static void Main(string[] args) {
Test t = new Test();
Console.WriteLine("Details: " + t.name);
t.Display("Product");
t.Display("Services");
t.Display("Tools");
t.Display("Plugins");
}
}
}実行結果
Details: Website Tabs: Product Tabs: Services Tabs: Tools Tabs: Plugins
Demo クラスの name フィールドと Display() メソッドは protected として宣言されていますが、Test クラスは Demo クラスを継承しているため、これらのメンバーに問題なくアクセスできます。
private アクセス修飾子とは
private を付けたメンバーは、同じクラス内からしかアクセスできません。クラスの外部はもちろん、そのクラスのインスタンスからも直接アクセスすることはできません。データを外部から隠蔽し、意図しない変更を防ぐ「カプセル化」を実現するための基本的な手段です。
コード例
using System;
namespace Demo {
class Rectangle {
//member variables
private double length;
private double width;
public void Acceptdetails() {
length = 10;
width = 15;
}
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle {
static void Main(string[] args) {
Rectangle r = new Rectangle();
r.Acceptdetails();
r.Display();
Console.ReadLine();
}
}
}実行結果
Length: 10 Width: 15 Area: 150
この例では、length と width が private として宣言されているため、Main メソッドから直接値を代入することはできません。代わりに、public メソッドの Acceptdetails() を経由して値を設定しています。
3つのアクセス修飾子の比較まとめ
| アクセス修飾子 | 同じクラス内 | 派生クラス | クラス外 |
|---|---|---|---|
| public | ○ | ○ | ○ |
| protected | ○ | ○ | × |
| private | ○ | × | × |
まとめ
- public:クラス内外のどこからでもアクセス可能。外部に公開したいメンバーに使用する。
- protected:自クラスと派生クラスからアクセス可能。継承関係で共有したいメンバーに使用する。
- private:同じクラス内からのみアクセス可能。データ隠蔽によるカプセル化に使用する。
適切なアクセス修飾子を選択することで、安全性が高く保守しやすいコードを書けます。基本的にはメンバーは private にしておき、必要なものだけを public や protected で公開するのが良い設計とされています。
-
Wi-Fi 6と5Gの違いとは?特徴・速度・使い分けを徹底解説
5Gネットワークは、SNSなどでも頻繁に話題になる注目の技術です。同様に、Wi-Fi 6への期待も高まっていますが、これは5Gとはまったく異なる技術です。本記事では、Wi-Fi 6と5Gネットワークの違いをわかりやすく解説します。 Wi-Fi 6とは? Wi-Fi 6は、IEEE 802.11ax規格に基づく新しい認証プログラムです。従来のWi-Fi技術と異なる最大の特徴は、より遠い距離でも高速な接続を実現できる点にあります。複数のデバイスが同時に接続されていても安定したパフォーマンスを発揮し、電源環境に多少の問題があっても性能が低下しにくいという優れた特性を持っています。 Wi-Fi 6は
-
Windows 10とWindows 11の違いを徹底比較!アップグレードすべきか判断するポイント
Microsoft(マイクロソフト)は、数々の新機能と改善点を盛り込んだ最新OS「Windows 11」をリリースしました。一方で、これまで数多くのパッチやアップデートが適用されてきたWindows 10は、新しいWindows 11よりも安定したOSと言えます。Microsoftによると、Windows 10のサポートは2025年以降に終了する予定のため、Windows 11へアップグレードするか、Windows 10を使い続けるかを検討する時間は十分にあります。この記事では、Windows 10とWindows 11の性能・機能・改善点を比較し、新しいOSへ移行すべきか、それともWindo