protectedとprivateの違いとは?初心者向けにアクセス範囲と使い分けを分かりやすく解説
結論として、privateは「そのクラスだけが利用できる」、protectedは「そのクラスと継承したクラスでも利用できる」アクセス修飾子です。
JavaやC#でオブジェクト指向を学び始めると、「privateとprotectedは何が違うの?」と疑問に思う方が多くいます。違いはアクセスできる範囲にあります。
protectedとprivateとは?
privateとは
private(プライベート)は、そのクラスの内部からしかアクセスできません。
他のクラスはもちろん、親クラスを継承した子クラスからも直接アクセスできません。
| 特徴 | 内容 |
|---|---|
| アクセス範囲 | 同じクラスのみ |
| 継承先からの利用 | できない |
| 主な用途 | 外部に公開したくないデータや処理 |
protectedとは
protected(プロテクテッド)は、そのクラスに加えて、継承した子クラスからもアクセスできます。
親クラスの機能を子クラスで利用・拡張したい場合によく使用されます。
| 特徴 | 内容 |
|---|---|
| アクセス範囲 | 同じクラスと継承先 |
| 継承先からの利用 | できる |
| 主な用途 | 継承を前提とした設計 |
アクセス範囲の違い
| アクセス元 | private | protected |
|---|---|---|
| 同じクラス | 〇 | 〇 |
| 子クラス(継承先) | × | 〇 |
| 他のクラス | × | × |
※Javaではprotectedは「同じパッケージ内」からもアクセスできます。一方、C#では同じアセンブリ内へのアクセスは認められず、継承関係が必要です。この点は言語によって異なるため注意しましょう。
イメージで理解する
会社組織で考えると分かりやすくなります。
| 例 | アクセス修飾子 |
|---|---|
| 自分専用の机の引き出し | private |
| 自部署だけが使える共有資料 | protected |
| 会社の受付 | public |
privateは本人だけが利用できますが、protectedは「関係者(継承したクラス)」にも利用を許可するイメージです。
なぜprotectedが必要なのか
オブジェクト指向では、親クラスの機能を子クラスが引き継ぐ「継承」を利用することがあります。
その際、すべてをpublicにすると外部から自由に操作されてしまい、すべてをprivateにすると子クラスが利用できません。
そこで、継承したクラスだけに公開するprotectedが用意されています。
IT現場ではどんな場面で使われるのか
privateが使われる例
- パスワード
- 顧客情報
- 内部計算用の変数
- 補助メソッド
protectedが使われる例
- 共通の業務処理
- フレームワークの基底クラス
- 共通画面クラス
- 共通ログ出力処理
実務では、共通部品やフレームワーク開発でprotectedを見かけることがあります。
初心者が混乱しやすいポイント
protectedはpublicではない
protectedは子クラスから利用できますが、誰でもアクセスできるわけではありません。
継承しなければ意味がないことも多い
継承を利用しないシステムでは、protectedを使う場面はそれほど多くありません。
privateは子クラスから見えない
親クラスにprivate変数があっても、子クラスから直接アクセスすることはできません。
必要な場合は、publicやprotectedのメソッド・プロパティを通して利用します。
実際のIT現場での利用例
社内システムでは、共通画面クラスや共通帳票クラスなどを継承して新しい画面を作成することがあります。
このような共通クラスでは、子クラスでも利用する処理をprotectedにし、それ以外の内部処理はprivateにする設計がよく採用されます。
筆者が新人時代に失敗したこと
新人の頃、「子クラスでも使いたい」という理由だけで、多くのメンバーをprotectedにしたことがありました。
その結果、継承先が増えるにつれて依存関係が複雑になり、修正時の影響範囲を把握するのが難しくなりました。
現在では、「まずprivateで設計し、本当に継承先で利用するものだけprotectedにする」という考え方を意識しています。
業務でよくあるトラブル例
| トラブル | 原因 |
|---|---|
| 子クラスからアクセスできない | privateになっている |
| 継承先で意図しない変更が行われる | protectedを多用している |
| 保守が難しくなる | 公開範囲が広すぎる |
| 設計が複雑になる | 継承を前提にしすぎている |
原因の切り分け
- アクセス修飾子を確認する
- 継承関係があるか確認する
- アクセス元が子クラスか確認する
- publicやprotectedメソッド経由で利用できないか確認する
- アクセス修飾子を変更する必要があるか検討する
確認方法
GUIで確認する方法
Visual StudioやIntelliJ IDEA、Eclipseでは、変数やメソッドの宣言部分に「private」「protected」が表示されます。
クラス図や継承ツリーを利用すると、どのクラスが親子関係にあるかも確認できます。
CUIで確認する方法
ソースコードを検索し、「private」「protected」のキーワードや継承を示す記述(extends、: など)を確認します。
確認結果の見方
- privateなら同じクラスだけで利用できる
- protectedなら継承先からも利用できる
- 子クラスでエラーになる場合はアクセス修飾子を確認する
初心者がやりがちなミス
- protectedをpublicと勘違いする
- 継承しないのにprotectedを使う
- privateで十分なものをprotectedにする
- アクセス修飾子を理解せず変更する
- 継承の影響範囲を考えない
業務で上司へ報告するポイント
- どのクラスでエラーが発生したか
- 親子関係(継承関係)があるか
- 現在のアクセス修飾子
- 変更による影響範囲
- 動作確認結果
エスカレーションするタイミング
- 共通クラスのアクセス修飾子を変更する場合
- 継承構造の変更が必要な場合
- ライブラリやフレームワークに影響する場合
- 修正範囲が広くなる可能性がある場合
応用知識
JavaやC#では、private・protected・public以外にもアクセス修飾子が用意されています。
| 修飾子 | Java | C# |
|---|---|---|
| private | 同じクラスのみ | 同じクラスのみ |
| protected | 同じクラス・同じパッケージ・継承先 | 同じクラス・継承先 |
| public | どこからでも | どこからでも |
また、C#にはprotected internalやprivate protectedといった修飾子もあり、アクセス範囲をより細かく制御できます。
関連するIT用語
- アクセス修飾子(Access Modifier)
- クラス(Class)
- 継承(Inheritance)
- カプセル化(Encapsulation)
- オーバーライド(Override)
- ポリモーフィズム(Polymorphism)
よくある質問(FAQ)
protectedとprivateはどちらを使えばよいですか?
継承先から利用する予定がなければprivateを選ぶのが基本です。継承先でも利用する必要がある場合にのみprotectedを検討します。
protectedは他のクラスからアクセスできますか?
基本的にはできません。ただし、Javaでは同じパッケージ内のクラスからもアクセスできます。
protectedを使う機会は多いですか?
業務システムではprivateやpublicの方が使用頻度は高く、protectedは共通部品やフレームワーク開発などで利用されることが多いです。
なぜ「まずprivate」が推奨されるのですか?
アクセス範囲を必要最小限にすることで、不正な変更を防ぎ、保守性の高いプログラムを作成できるためです。
まとめ
protectedとprivateの違いは、「継承したクラスからアクセスできるかどうか」です。
- privateは同じクラスだけで利用できる
- protectedは同じクラスと継承先で利用できる
- JavaとC#ではprotectedのアクセス範囲が一部異なる
- 実務では「まずprivate」、継承先で必要な場合のみprotectedを選ぶのが基本
アクセス修飾子を適切に使い分けることで、プログラムの安全性や保守性が向上し、チーム開発でも理解しやすい設計につながります。
