アクセス修飾子(public / private / protected / default) — カプセル化
Javaの アクセス修飾子 は「どこからそのクラスやメンバにアクセスできるか」を制御する仕組みです。
カプセル化(内部の詳細を隠し、必要な部分だけ公開する)を実現するための基本です。
4種類のアクセス修飾子
| 修飾子 | アクセス範囲 | 主な用途 |
|---|---|---|
| public | どこからでもアクセス可能 | API公開、外部利用されるメソッドやクラス |
| private | 同じクラス内のみ | 内部状態の隠蔽、外部から直接触らせない |
| protected | 同じクラス+サブクラス+同じパッケージ | 継承先にだけ公開したい処理 |
| default(指定なし) | 同じパッケージ内のみ | パッケージ内部での利用に限定 |
コード例で理解する
public — 外部に公開
public class User {
public String name; // どこからでもアクセス可能
}
User u = new User();
u.name = "Tanaka"; // 外部から直接アクセスできる
Java👉 APIや外部利用されるメソッドは public。
private — 内部だけで使う
public class Account {
private int balance; // 外部から直接触れない
public void deposit(int yen) {
balance += yen;
}
public int getBalance() {
return balance;
}
}
Account a = new Account();
// a.balance = 1000; // コンパイルエラー
a.deposit(500);
System.out.println(a.getBalance()); // 500
Java👉 内部状態は private にして、必要な操作だけ public メソッドで提供。
protected — 継承先にだけ公開
class Animal {
protected void speak() { System.out.println("???"); }
}
class Dog extends Animal {
@Override
protected void speak() { System.out.println("ワン"); }
}
Dog d = new Dog();
d.speak(); // "ワン"
Java👉 親クラスの内部処理を子クラスにだけ見せたいときに使う。
default(指定なし) — パッケージ内だけ
class Helper { // default(指定なし)
void assist() { System.out.println("help"); }
}
Java👉 同じパッケージ内からは使えるが、外部パッケージからは見えない。
例題で練習
例題1: カプセル化で安全なクラス
public class BankAccount {
private int balance; // 外部から直接変更不可
public void deposit(int yen) {
if (yen > 0) balance += yen;
}
public int getBalance() { return balance; }
}
Java👉 privateで守り、publicメソッドで安全な操作だけ提供。
例題2: パッケージ内部ユーティリティ
// 同じパッケージ内でだけ使う補助クラス
class PackageHelper {
static void log(String msg) {
System.out.println("[LOG] " + msg);
}
}
Java👉 外部に見せる必要がないなら default にして隠す。
例題3: 継承先にだけ許可
class Base {
protected void validate() { System.out.println("検証"); }
}
class Sub extends Base {
public void run() {
validate(); // protectedなので呼べる
}
}
Java👉 外部には見せず、継承先だけが利用できる。
テンプレート集
public
public class クラス名 {
public 戻り値型 メソッド名(...) { ... }
}
Javaprivate
public class クラス名 {
private 型 フィールド;
private 戻り値型 メソッド名(...) { ... }
}
Javaprotected
class 親クラス {
protected 戻り値型 メソッド名(...) { ... }
}
Javadefault(指定なし)
class クラス名 {
戻り値型 メソッド名(...) { ... }
}
Javaまとめ
- public: 外部に公開。APIや利用者向け。
- private: 内部だけ。状態を守る。
- protected: 継承先にだけ公開。
- default: パッケージ内だけ。
👉 カプセル化の基本は「外部に見せる必要がないものは隠す」こと。
練習課題として「社員クラス」を作り、社員番号を private にして getter だけ公開、部署情報は同じパッケージ内だけ利用できるよう default にすると、アクセス修飾子の効果が体感できます。
