本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第2章 カプセル化 ― データを守る仕組み · レッスン6

アクセス修飾子 ― public と private の使い分け

ブラウザで完結

導入

ここまで private なフィールドと public 相当の(何もつけない)メソッドを組み合わせて使ってきました。最後に、この使い分けの基本方針を整理しましょう。

説明

基本方針はシンプルです。

修飾子意味使いどころ
privateクラスの中だけからアクセス可能フィールド全般。外に見せる必要のない内部処理用メソッド
publicどこからでもアクセス可能外部に公開したいメソッド(getter/setterなど)

基本ルール:フィールドは原則すべて private にし、外に見せたい振る舞いだけを public なメソッドとして用意する。 クラスの内部だけで使う「補助的な処理」も private メソッドにできます。

public class Main {
    public static void main(String[] args) {
        Product p = new Product("ノート", 300);
        System.out.println(p.getLabel());
    }
}

class Product {
    private String name;
    private int price;

    Product(String name, int price) {
        this.name = name;
        this.price = price;
    }

    private String formatPrice() {
        return price + "円";
    }

    public String getLabel() {
        return name + ":" + formatPrice();
    }
}

formatPrice()Product クラスの中でしか使わない補助的な処理なので private にしています。外部に公開する必要があるのは getLabel() だけなので、こちらだけ public です。「外に見せるものだけを絞り込む」ことで、クラスの使い方がシンプルになり、内部の実装を後から自由に変更しやすくなります。

やってみよう

下のエディタで formatPrice() の中身(表示形式)を変えて実行し、getLabel() の見た目が変わることを確認しましょう。formatPricepublic に変えても動くこと(=コンパイル上は問題ないが、外から呼ぶ必要がないメソッドを公開する必要はないこと)も考えてみてください。

演習

Circle(円)クラスに private double radius を持たせ、コンストラクタで初期化してください。内部でだけ使う private double square() メソッド(radius * radius を返す)を用意し、それを使って円の面積を返す public double area() メソッド(3.14 * square())を用意してください。main で半径 10Circle を作り、area() の結果を表示してください。

ヒント1を見る

private double square() { return radius * radius; } を書きます。

ヒント2を見る

public double area() { return 3.14 * square(); } とし、System.out.println(c.area()); で表示します。

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。