本文へスキップ
BecomeCoder

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

なぜフィールドを隠すのか ― カプセル化の考え方

ブラウザで完結

導入

銀行口座の残高を、誰でも自由に書き換えられるとしたら怖くありませんか? うっかりミスや不正な操作で、残高がマイナスになってしまうかもしれません。フィールドをそのまま公開しておくと、こういう事故が起きます。

説明

まずは問題を体感してみましょう。次のコードでは BankAccountbalance フィールドが誰からでも自由に書き換えられる状態(public 相当)になっています。

public class Main {
    public static void main(String[] args) {
        BankAccount acc = new BankAccount();
        acc.balance = 1000;
        acc.balance = -5000;   // 本来ありえない値も、そのまま入ってしまう
        System.out.println(acc.balance);
    }
}

class BankAccount {
    int balance;
}

実行すると -5000 がそのまま表示されます。残高がマイナスというありえない状態を、誰でも簡単に作れてしまうのです。

カプセル化 とは、フィールド(データ)を外から直接いじれないように隠し、決まったメソッドを通してだけ操作させる考え方です。次のレッスンから、private を使ってこれを実現する方法を見ていきます。

やってみよう

下のエディタを実行して、おかしな値がそのまま入ってしまうことを確認しましょう。-5000 以外の変な値(999999999 など)を入れても同じように通ってしまうことも試してみてください。

演習

Fridge(冷蔵庫)というクラスを作り、int temp というフィールドを持たせてください。mainFridge のインスタンスを作り、temp1000(明らかにおかしい温度)を直接代入して、その値を表示してください。

ヒント1を見る

class Fridge { int temp; } と書き、Fridge f = new Fridge(); でインスタンスを作ります。

ヒント2を見る

f.temp = 1000; のあと System.out.println(f.temp); で表示します。

実際に動かしてみよう

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

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

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