Java
PR

Javaのアクセス修飾子とは?書き方や使い方をわかりやすく解説

dream2020
記事内に商品プロモーションを含む場合があります

Javaを学び始めると必ず出てくる「アクセス修飾子」。

これを正しく理解すると、クラスやメソッドの安全性を高め、バグを減らすことができます。

この記事では、初心者でも理解できる言葉で、アクセス修飾子の役割や書き方、使い方を丁寧に解説します。

サンプルコードや演習問題もあるので、読み終える頃にはしっかり使いこなせるようになりますよ。

アクセス修飾子とは

アクセス修飾子(Access Modifier)とは、Javaのクラス・メソッド・フィールド(変数)などが、どこからアクセスできるのかを制御するためのキーワードです。

セキュリティやコードの保守性を高めるために重要な役割を果たします。

Javaで使える4つのアクセス修飾子

Javaで使える主なアクセス修飾子は以下の4種類です。

  • public:どこからでもアクセス可能
  • protected:同じパッケージ内、または継承クラスからアクセス可能
  • (デフォルト / package-private):同じパッケージ内からのみアクセス可能
  • private:同じクラス内からのみアクセス可能

アクセス範囲のイメージ表

修飾子同じクラス同じパッケージ継承クラス他パッケージ
public
protected×
デフォルト××
private×××

アクセス修飾子の書き方と使い方

アクセス修飾子は、クラス・メソッド・フィールドの定義の先頭に書きます。

基本構文

[アクセス修飾子] データ型 名前;
[アクセス修飾子] 戻り値の型 メソッド名(引数) {
    // 処理
}

アクセス修飾子のサンプルコード

ここでは実際にアクセス修飾子を使った例を紹介します。

// Main.java
public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "太郎"; // publicなのでアクセス可能
        // person.age = 30; // privateなのでエラーになる
        person.setAge(30); // setterを通して設定

        System.out.println("名前: " + person.name);
        System.out.println("年齢: " + person.getAge());
    }
}

class Person {
    public String name;       // どこからでもアクセス可能
    private int age;          // 同じクラス内からのみアクセス可能

    public void setAge(int age) {
        if (age >= 0) {
            this.age = age;
        }
    }

    public int getAge() {
        return this.age;
    }
}

解説

上記の例では、nameはpublicなので直接アクセスできますが、ageはprivateなので直接アクセスできません。

代わりに、setAge()getAge()といったメソッド(ゲッター・セッター)を使って値を変更・取得します。

これにより、不正な値の代入を防ぐことができます。

各アクセス修飾子の詳細解説

  • public
  • protected
  • デフォルト(package-private)
  • private

public

最も開放的な修飾子で、どこからでもアクセスできます。ただし、無闇に使うと予期しない場所からデータが変更される危険があります。

protected

同じパッケージ内、または継承したサブクラスからアクセスできます。オブジェクト指向の継承設計で便利です。

デフォルト(package-private)

アクセス修飾子を付けない場合がこれに該当します。同じパッケージ内からのみアクセス可能です。

private

最も制限が厳しく、同じクラス内でしか使えません。カプセル化(encapsulation)を実現するために頻繁に使われます。

演習問題

  • 問題1:Carクラスの作成
  • 問題2:BankAccountクラスの作成
  • 問題3:Studentクラスとアクセス範囲の確認

問題1:Carクラスの作成

Carクラスを作成し、modelフィールドをpublic、speedフィールドをprivateにしてください。speedを設定・取得するメソッドも作成してください。

解答例

public class Car {
    public String model;
    private int speed;

    public void setSpeed(int speed) {
        if (speed >= 0) {
            this.speed = speed;
        }
    }

    public int getSpeed() {
        return speed;
    }
}

問題2:BankAccountクラスの作成

BankAccountクラスを作り、残高をprivateで保持し、入金・出金メソッドを作成してください。残高取得メソッドも作ってください。

解答例

public class BankAccount {
    private int balance;

    public void deposit(int amount) {
        if (amount > 0) {
            balance += amount;
        }
    }

    public void withdraw(int amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
        }
    }

    public int getBalance() {
        return balance;
    }
}

問題3:Studentクラスとアクセス範囲の確認

Studentクラスを作り、nameはpublic、gradeはprotectedにしてください。MainクラスからStudentの情報を出力してください。

解答例

public class Student {
    public String name;
    protected int grade;
}

public class Main {
    public static void main(String[] args) {
        Student s = new Student();
        s.name = "花子";
        s.grade = 3; // 同じパッケージ内なのでアクセス可能
        System.out.println(s.name + " - " + s.grade + "年生");
    }
}

よくある質問(FAQ)

Q1. privateにすると不便ではないですか?
A. 確かに直接アクセスはできませんが、意図しない変更を防ぐことができ、バグを減らせます。

Q2. デフォルトアクセスはいつ使うべきですか?
A. 同じパッケージ内だけで使うユーティリティクラスなどに適しています。

Q3. protectedとデフォルトの違いは?
A. protectedは継承先クラスからアクセスできますが、デフォルトはできません。

Q4. 全部publicにしてはいけない理由は?
A. データの安全性や保守性が低下し、予期しないバグを生む可能性が高まります。

Q5. アクセス修飾子はメソッドにも必要ですか?
A. はい、クラス・メソッド・フィールドすべてに適用できます。

まとめ

アクセス修飾子は、Javaにおけるクラス設計の基本であり、コードの安全性と保守性を高める重要な要素です。

publicやprivateなどを適切に使い分けることで、外部からの不正なアクセスを防ぎ、意図した方法でのみデータが操作されるようにできます。

これを習得することで、より堅牢でメンテナンス性の高いプログラムを作成できるようになります。

ABOUT ME
記事URLをコピーしました