🎊

[Java]カプセル化 とは(備忘録)

に公開

1.はじめに

メンバ変数のアクセス修飾子を private に設定し、メンバ変数に関連するメソッドは public と(基本的に)設定することを、カプセル化といいます。

・メンバ変数を private に設定することで、直接アクセスによりメンバ変数が変更されることの防止や意図しないアクセスを防止することができ、バグの防止とプログラムの安全性が強化されるというメリットがあります。

・ソースコードの記述量が増えることが、デメリットとして挙げられます。

2.ゲッター(getter)とは

ゲッター(getter)とは、メンバ変数の値を取得するために利用されるメソッドです。
・一般的に getフィールド名 という形式で定義します。

3.セッター(setter)とは

セッター(setter)は、メンバ変数に値を設定するために利用されるメソッドです。
・一般的に setフィールド名 という形式で定義します。

4.サンプルプログラム

〇例1:カプセル化していないプログラム

Student.java
public class Student {
    // フィールド(メンバ変数)
    String name;
    int score;

    // コンストラクタ
    public Student (String name, int score) {
        this.name = name;
        this.score = score;
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        Student student = new Student("山田", 80);
        System.out.println(student.name + "の点数は" + student.score + "点です");

        // 問題のあるプログラム
        student.name = "";
        student.score = -10000;
        System.out.println(student.name + "の点数は" + student.score + "点です");
    }
}
実行結果
山田の点数は80点です
の点数は-10000点です

〇例2:getter だけを使用したプログラム

Student.java
public class Student {
    // フィールド(メンバ変数)
    private String name;
    private int score;

    // コンストラクタ
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    // nameのゲッター
    public String getName() {
        return name;
    }

    // scoreのゲッター
    public int getScore() {
        return score;
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        Student student = new Student("山田", 80);
        System.out.println(student.getName() + "の点数は" + student.getScore() + "点です");
    }
}
実行結果
山田の点数は80点です

〇例3:setter にバリデーションを使用したプログラム

Student.java
public class Student {
    // フィールド(メンバ変数)
    private String name;
    private int score;

    // コンストラクタ
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    // nameのゲッター
    public String getName() {
        return name;
    }

    // nameのセッター
    public void setName(String name) {
        // バリデーション
        if (name.length() == 0) {
            System.out.println("名前が入力されていません");
        } else if (name.length() > 30) {
            System.out.println("30字以内で名前を入力してください");
        } else {
            this.name = name;
            System.out.println("名前を" + this.name + "に変更しました");
        }
    }

    // scoreのゲッター
    public int getScore() {
        return score;
    }

    // scoreのセッター
    public void setScore(int score) {
        // バリデーション
        if (score >= 0 && score <= 100) {
            this.score = score;
        } else {
            System.out.println("点数は0以上100以下で入力してください");
        }
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        Student student = new Student("山田", 80);
        System.out.println(student.getName() + "の点数は" + student.getScore() + "点です");

        student.setName("田中");
        student.setScore(70);
        System.out.println(student.getName() + "の点数は" + student.getScore() + "点です");

        student.setName("");
        student.setScore(-10000);
    }
}
実行結果
山田の点数は80点です
名前を田中に変更しました
田中の点数は70点です
名前が入力されていません
点数は0以上100以下で入力してください

〇例4:カプセル化することで、ブラックボックス化しているプログラム

Student.java
public class Student {
    // フィールド(メンバ変数)
    private String name;
    private int score;

    // コンストラクタ
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    // メソッド
    void result() {
        System.out.println("氏名:" + this.name + "、点数:" + this.score + "点");
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        Student student = new Student("鈴木", 75);
        student.result();
    }
}
実行結果
氏名:鈴木、名前:75点

5.参考

【初心者向け】Javaのカプセル化って何?独立性を高めよう
Java カプセル化とは?

6.その他

実行環境

Discussion