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

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などを適切に使い分けることで、外部からの不正なアクセスを防ぎ、意図した方法でのみデータが操作されるようにできます。
これを習得することで、より堅牢でメンテナンス性の高いプログラムを作成できるようになります。