Java入門⑨ コンストラクタとカプセル化

Java入門 Java入門

前回の記事では クラスとオブジェクト を学び、
「設計図(クラス)から実体(オブジェクト)を作る」仕組みを理解しました。

今回はそこから一歩進んで、
オブジェクトを作る時に自動で呼ばれる特別なメソッド コンストラクタ と、
データを安全に守るための仕組み カプセル化(getter/setter) を学びます。

これらは Java の基礎の中でもとても大切で、
この先の実務でも必ず使う知識なので、丁寧に解説していきます。

この記事で学べること

  • コンストラクタとは何か?
  • なぜコンストラクタを使うのか?
  • カプセル化とは何か?
  • アクセス修飾子(public / private)
  • getter / setter の役割
  • 「安全なクラス設計」がどういうことか

コンストラクタとは?(まずはイメージから)

コンストラクタとは、
オブジェクトが作られた瞬間に自動で呼ばれるメソッド のことです。

▼ 例えるなら?

  • クラス=家の設計図
  • オブジェクト=建てられた家
  • コンストラクタ=家を建てるときの「初期工事」

家を建てる時、最初に土台を作ったり配線を通したりしますよね。
コンストラクタは その初期設定を行う場所 だと思えばOKです。

コンストラクタの書き方(基本)

コンストラクタは クラス名と同じ名前 で書きます。

public class Person {

    String name;
    int age;

    // これがコンストラクタ
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

呼び出し(= オブジェクトを作る)

Person p = new Person("太郎", 20);

すると、
オブジェクト作成と同時に、
nameage に値がセットされます。

今までのようにいちいち「person.name = “太郎”」などと書かなくてもいいのです!

this の意味とは?

this.name = name; のように書く理由は、
「フィールドの name と、引数の name を区別するため」です。

  • this.name → フィールドの name
  • name → メソッドの引数(呼び出しの際に値をセットしている場所)

「このクラスの name に、引数の name を代入するよ」という意味になります。

カプセル化とは?

カプセル化は、
オブジェクトの中の大事なデータ(フィールド)を守る仕組み です。

たとえば Person クラスに年齢があるとして、
誰かが外部から勝手にこう書いたらどうでしょう?

p.age = -999;

これって、絶対におかしいですよね…。
実際のアプリでも、ユーザーに不正な値を入れられると大問題になります。

そこで Java では 大事なデータは直接触らせないようにする のが基本です。


private でデータを守る

フィールドを private にすると、
クラスの外から直接アクセスできなくなります。(別のクラスから使うようなperson.nameのこと)

public class Person {

    private String name; // 外から触れない
    private int age;     // 外から触れない

}

ではどうやって値を取り出すの? → getter / setter

外部から直接触れなくなる代わりに、
安全に値を取得・変更するための窓口 を用意します。

それが getter / setter です。


getter:値を取り出すメソッド

public String getName() {
    return name;
}

setter 値を変更するメソッド

public void setAge(int age) {
    if (age < 0) {
        System.out.println("年齢は0以上を設定してください");
        return;
    }
    this.age = age;
}

setter には「おかしな値が入らないようにチェック」も書けます。

コンストラクタ + カプセル化の完成形

public class Person {

    private String name;
    private int age;

    // コンストラクタ(初期設定)
    public Person(String name, int age) {
        this.name = name;
        setAge(age); // setter を使って安全にセット
    }

    // getter
    public String getName() {
        return name;
    }

    // setter(年齢のチェック付き)
    public void setAge(int age) {
        if (age < 0) {
            System.out.println("年齢は0以上にしてください");
            return;
        }
        this.age = age;
    }

    // メソッド
    public void greet() {
        System.out.println("こんにちは!私は " + name + " です。年齢は " + age + " 歳です。");
    }
}

使い方

Person p = new Person("太郎", 20);

p.greet();
System.out.println(p.getName());

p.setAge(30);
p.setAge(-999); // -> チェックに引っかかる

初心者が特につまずくポイントを整理

ポイントやさしく説明すると…
コンストラクタオブジェクトを作った瞬間に動く「初期設定」
this「このクラスのフィールドだよ」と区別する言葉
privateフィールドに直接触れないようにする鍵
getter外からフィールドを“見る用の窓”
setter外から“値を変えるための窓”
カプセル化データを勝手に壊されないように守る仕組み

最後に なぜカプセル化は大事?

実際のアプリ開発では、
クラスには「名前」「金額」「在庫数」「パスワード」など重要な値がめちゃくちゃあります。

これを外から好き勝手に変更されたら…

  • 不正なデータが入る
  • 計算結果が壊れる
  • セキュリティ事故が起きる

こういった問題を防ぐ上で、
カプセル化は必須の知識 なのです。

コメント

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