はじめに
javaのアクセス修飾子public、private、protectedに関して、「使い方はわかるけど、人に説明するのは難しい…」という方のために、アクセス修飾子についてシンプルに整理した記事です。
保守性・安全性などの観点からも必要となる知識なので一度整理しておきましょう。
アクセス修飾子の種類と意味
-
public
すべてのクラスからアクセス可能です。 -
private
同じクラス内からのみアクセス可能です。 -
protected
同じクラス、同一パッケージ内のクラス、またはサブクラスからアクセス可能です。 -
指定なし(デフォルト)
同一パッケージ内のクラスからのみアクセス可能です。
アクセス範囲の比較表
アクセス修飾子 | 同一クラス | 同一パッケージ | サブクラス(別パッケージ) | 他パッケージ |
---|---|---|---|---|
public |
○ | ○ | ○ | ○ |
protected |
○ | ○ | ○ | × |
private |
○ | × | × | × |
default (指定なし) |
○ | ○ | × | × |
※defaultは一般的な呼称であり、アクセス修飾子ではありません
アクセス修飾子の使い分け例
-
public
→ 外部から利用されるメソッドやクラス(例:ライブラリのAPI) -
private
→ 内部実装に限定したいフィールドや補助メソッド
※基本的にフィールド(変数)はprivate
にして、必要に応じてgetter/setter
で操作するのが基本設計 -
protected
→ 継承を前提としたクラスで、子クラスには見せたいが外部には隠したい要素 -
(指定なし)
→ 「同じパッケージ内だけで使えばいい」ユーティリティクラスなどに使われる
よくある落とし穴
-
protected
は継承関係がなくても同一パッケージであればアクセスできる
→ 「サブクラスだけに見せたいつもりが、同一パッケージの他クラスからも見えてしまう」ことに注意 -
private
なメンバ変数にアクセスしようとしてエラーになる
→private
にしたメソッドやフィールドはテストや他クラスから直接使えない -
修飾子を付け忘れて**デフォルト(パッケージプライベート)**になっていることに気づかない
→ チーム開発では意図せず外部からアクセスされる原因に
まとめ
アクセス修飾子は一見シンプルですが、設計方針やチーム開発において重要な役割を持ちます。
コードの「見せたい」「隠したい」の線引きを意識して、適切に使い分けていきましょう!