Java 逆引き集 | アクセス修飾子(public/private/protected/default) — カプセル化

Java Java
スポンサーリンク

アクセス修飾子(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 戻り値型 メソッド名(...) { ... }
}
Java

private

public class クラス名 {
    private 型 フィールド;
    private 戻り値型 メソッド名(...) { ... }
}
Java

protected

class 親クラス {
    protected 戻り値型 メソッド名(...) { ... }
}
Java

default(指定なし)

class クラス名 {
    戻り値型 メソッド名(...) { ... }
}
Java

まとめ

  • public: 外部に公開。APIや利用者向け。
  • private: 内部だけ。状態を守る。
  • protected: 継承先にだけ公開。
  • default: パッケージ内だけ。

👉 カプセル化の基本は「外部に見せる必要がないものは隠す」こと。
練習課題として「社員クラス」を作り、社員番号を private にして getter だけ公開、部署情報は同じパッケージ内だけ利用できるよう default にすると、アクセス修飾子の効果が体感できます。

タイトルとURLをコピーしました