Java入門|メンバを隠すprivateのしくみ

大事な情報はむやみに触らせない。private がわかると、クラスはもっと安全で強くなる

クラスを学び始めたときは、フィールドやメソッドに自由にアクセスできることが便利に感じられます。実際、オブジェクトを作って、name や power や energy に値を入れ、show() で表示する流れはとてもわかりやすいです。けれども、自由に触れるということは、正しい値だけでなく、おかしな値まで入れられてしまうということでもあります。そこが、クラスを安全に使ううえでの大きな注意点です。

ドラゴンボールで考えるなら、戦士の大事な情報を誰でも勝手に書き換えられる状態はかなり危険です。たとえば気の量や戦闘力のような大切な情報に、外から不自然な値を直接入れられてしまったら、その戦士は本来の姿から崩れてしまいます。Javaでは、こうした危ない書き換えを防ぐために、クラスの外から勝手に触れないようにする仕組みが用意されています。それが private です。ここでは、private がどんな役割を持っているのかを、ドラゴンボールのたとえでやさしく整理していきます。

問題の原因は、外から自由にメンバを触れてしまうこと

前の段階では、クラスの外からフィールドに直接値を入れることができました。
たとえば、次のような形です。

ファイル名:Sample1.java

class Saiyan
{
    String name;
    int power;
    double energy;

    void show()
    {
        System.out.println("戦士の名前は" + name + "です。");
        System.out.println("戦闘力は" + power + "です。");
        System.out.println("気の量は" + energy + "です。");
    }
}

class Sample1
{
    public static void main(String[] args)
    {
        Saiyan goku = new Saiyan();

        goku.name = "悟空";
        goku.power = 9000;
        goku.energy = -10.0;

        goku.show();
    }
}

このコードでは、goku.energy に -10.0 を代入しています。
文法としては書けてしまっても、戦士の状態としてはかなり不自然です。

つまり問題の原因は、
メンバを無制限に使えてしまい、外から勝手な値を入れられること
にあります。

ドラゴンボールで言えば、悟空の気の量に、本人の意思や決められた手順を無視して、外からいきなりマイナスの値を押し込んでしまうようなものです。
これは、戦士というモノを自然に扱えているとは言えません。

クラスの外から触れないようにするのが private

こうした危ない状態を防ぐために使うのが private です。

private をつけたメンバは、そのクラスの外から直接アクセスできなくなります。
つまり、外から勝手に値を書き換えたり、勝手に触ったりできないようにする仕組みです。

たとえば Saiyan クラスのフィールドを private にすると、次のようになります。

class Saiyan
{
    private String name;
    private int power;
    private double energy;
}

このように書くと、name、power、energy は private メンバになります。

ここで大事なのは、private をつけることで「この情報はクラスの内側で責任を持って扱うので、外からは直接触らせない」という考え方になることです。

private は「隠す」ためのしくみ

private をひとことで言うなら、メンバを隠すしくみです。

ただし、ここでいう「隠す」は、ただ見えなくするというより、
外から勝手にいじれないように守る
という意味合いが強いです。

ドラゴンボールでたとえるなら、戦士の内部状態にカバーをかけて、

  • 誰でも自由に戦闘力を書き換えられない
  • 誰でも自由に気の量を書き換えられない
  • 本人や、決められた機能だけが中身を扱える

ようにするイメージです。

つまり private は、クラスの中身を閉じて守るための第一歩です。

private をつけると何が変わるのか

では、実際にフィールドを private にしたコードを見てみましょう。

ファイル名:Sample1.java

class Saiyan
{
    private String name;
    private int power;
    private double energy;

    void show()
    {
        System.out.println("戦士の名前は" + name + "です。");
        System.out.println("戦闘力は" + power + "です。");
        System.out.println("気の量は" + energy + "です。");
    }
}

class Sample1
{
    public static void main(String[] args)
    {
        Saiyan goku = new Saiyan();

        // goku.name = "悟空";
        // goku.power = 9000;
        // goku.energy = -10.0;
    }
}

このコードでは、name、power、energy に private がついています。
すると、main メソッドのようなクラスの外側からは、これらのフィールドに直接アクセスできません。

そのため、次のような書き方はできなくなります。

goku.name = "悟空";
goku.power = 9000;
goku.energy = -10.0;

この変化こそが private の大事な役割です。
外から危ない値を直接入れる道を、まず閉じているのです。

なぜ private にすると安全になるのか

ここで「なぜ private にすると安全になるのか」をしっかり考えておきましょう。

理由はシンプルで、外から自由に触れなければ、外から不自然な値を入れられないからです。

たとえば、energy が public のままだと、

  • 20.5 を入れることもできる
  • 0 を入れることもできる
  • -10.0 を入れることもできる

という状態です。

でも private にすれば、少なくともクラスの外側からは直接

goku.energy = -10.0;

のようなことはできません。

つまり private は、
危ない操作の入口そのものをふさぐ
ためのしくみなのです。

これは、あとから値をチェックするよりも前に、まず直接操作を禁止するという意味で、とても強い守りになります。

クラスの中からは private メンバを使える

ここでひとつ安心しておきたいのは、private にしたからといって、そのメンバが完全に使えなくなるわけではないことです。
そのクラスの中からは使えます。

たとえば show() メソッドの中では、private にしたフィールドをそのまま使えます。

class Saiyan
{
    private String name;
    private int power;
    private double energy;

    void show()
    {
        System.out.println("戦士の名前は" + name + "です。");
        System.out.println("戦闘力は" + power + "です。");
        System.out.println("気の量は" + energy + "です。");
    }
}

show() は Saiyan クラスの中にあるので、name、power、energy にアクセスできます。

つまり private は、

  • クラスの中では使える
  • クラスの外からは直接使えない

という制限です。

表で整理するとこうなります。

場所private メンバにアクセスできるか
同じクラスの中できる
クラスの外できない

このルールが、private の基本です。

「見せるべきもの」と「隠すべきもの」を分ける感覚が大切

private を理解するときに大切なのは、全部を外に見せる必要はない、という感覚です。

クラスを設計するときには、

  • 外から自由に触らせると危ないもの
  • 外から使わせてもよいもの

を分けて考える必要があります。

ドラゴンボールで言えば、

  • 戦士の内部状態は勝手に触らせたくない
  • でも状態を表示する show() のような機能は使わせたい

ということです。

つまり、
中身は隠して、必要な使い方だけ外に見せる
という考え方が、これからのクラス設計でとても大事になります。

private は、その「隠す側」の基本の道具です。

8章の自由さから、9章の安全さへ進む

8章では、クラスを作り、オブジェクトを作り、メンバにアクセスするという流れを学びました。
そこでは「どう使うか」が中心でした。

9章に入ると、そこへ「どう守るか」という視点が加わります。

これは、オブジェクト指向の理解が一段進んだということでもあります。
ただ使えるだけではなく、壊れにくく、安全に使える部品としてクラスを作ることが大切になってくるのです。

private は、その最初の一歩です。

  • フィールドを守る
  • 外からの勝手な書き換えを防ぐ
  • モノとして自然な状態を保ちやすくする

という働きがあるからです。

private があると「ありえない状態」を作りにくくなる

private の価値は、まさにここにあります。
ありえない状態を、外から簡単には作れなくなることです。

たとえば戦士の energy が private なら、外からいきなりマイナスを入れることはできません。
すると少なくとも、

  • 気の量がマイナスの戦士
  • 本来の設定から外れた不自然な状態

を、外部のコードが勝手に作ってしまう危険が減ります。

もちろん、これだけですべてが完璧になるわけではありません。
ですが、まず「直接触れないようにする」という守りを入れるだけでも、クラスの安全性はかなり上がります。

だから private は、クラスを作るうえでとても基本的で強力な機能なのです。

この図では、左側の Sample1 クラスから goku.energy に直接アクセスしようとしていますが、途中で遮られています。
これは、private にしたフィールドへはクラスの外から直接触れないことを表しています。

中央の Saiyan クラスの中では、name、power、energy が鍵つきで守られています。
この鍵が、private によって外から隠されていることを表しています。

一方で右側では show() メソッドがそれらのフィールドにアクセスしています。
これは、private にしたメンバでも、同じクラスの中からなら使えることを示しています。

この図を見ると、private は「完全に使えなくする」ものではなく、「外から勝手に触れないように守る」ためのしくみだと理解しやすくなります。

いちばん大事な感覚

「メンバを隠すprivateのしくみ」で大切なのは、次の感覚です。

  • 問題の原因は、メンバを無制限に使えてしまうこと
  • 外から自由にフィールドへ触れると、不自然な値が入りやすい
  • private をつけると、そのメンバはクラスの外から直接アクセスできなくなる
  • クラスの中からは private メンバを使える
  • private は、クラスの内部状態を守るための基本のしくみ

ドラゴンボールで言いかえるなら、

  • 戦士の大事な内部情報は、誰でも勝手にいじれるべきではない
  • 気の量や戦闘力のような重要な値は、まず守るべき
  • そのために private で中身を隠し、外からの危ない操作を防ぐ

ということです。

この感覚がつかめると、クラスは単なる「情報を入れる箱」ではなく、自分の中身を守りながら安全に使ってもらう部品として見えてきます。これは、Javaのオブジェクト指向を一段深く理解するための、とても大切な一歩です。