フィールド:オブジェクトの「属性」を表すもの

docs

オブジェクト指向プログラミングの肝、それは「オブジェクト」です。前回の記事では、このオブジェクトが現実世界のものをモデル化している、という話をしましたね。

クラスとオブジェクトの概念 – オブジェクト指向の入り口 | ToolDocs

今回はそのオブジェクトが持つ**「属性」と「振る舞い」について、さらに詳しく掘り下げていきましょう。これらはJavaの言葉でそれぞれ「フィールド」と「メソッド」**と呼ばれます。

オブジェクトの「属性」とは、そのオブジェクトがどのような状態であるかを示す情報のことです。例えば、あなたが普段使っているスマートフォンを考えてみましょう。

スマートフォンには次のような属性がありますよね?

  • モデル名
  • ストレージ容量
  • バッテリー残量

これらはすべて、スマートフォンの**「属性」です。Javaでは、これらの属性を表現するために「フィールド」**というものを使います。フィールドは、オブジェクトの中にデータを格納するための箱、だとイメージしてください。

コードで見てみましょう。スマートフォンの設計図となるSmartphoneクラスにフィールドを追加してみます。

Java

public class Smartphone {
    String color;         // 色
    String modelName;     // モデル名
    int storageCapacity;  // ストレージ容量(GB)
    int batteryLevel;     // バッテリー残量(%)
}

これで、Smartphoneクラスから作られるすべてのスマートフォンオブジェクトは、colormodelNamestorageCapacitybatteryLevelという4つの情報を保持できるようになります。

実際にスマートフォンオブジェクトを作って、それぞれのフィールドに値を設定してみましょう。

Java

public class Main {
    public static void main(String[] args) {
        Smartphone myPhone = new Smartphone(); // スマートフォンオブジェクトを作成

        // フィールドに値を設定
        myPhone.color = "ブラック";
        myPhone.modelName = "iPhone 15 Pro Max";
        myPhone.storageCapacity = 512;
        myPhone.batteryLevel = 85;

        System.out.println("私のスマホの色: " + myPhone.color);
        System.out.println("私のスマホのモデル名: " + myPhone.modelName);
        System.out.println("私のスマホのストレージ: " + myPhone.storageCapacity + "GB");
        System.out.println("私のスマホのバッテリー残量: " + myPhone.batteryLevel + "%");

        Smartphone yourPhone = new Smartphone(); // 別のスマートフォンオブジェクトを作成
        yourPhone.color = "ホワイト";
        yourPhone.modelName = "Galaxy S24 Ultra";
        yourPhone.storageCapacity = 256;
        yourPhone.batteryLevel = 95;

        System.out.println("あなたのスマホの色: " + yourPhone.color);
        System.out.println("あなたのスマホのモデル名: " + yourPhone.modelName);
    }
}

このように、同じSmartphoneクラスから作られたオブジェクトでも、それぞれのフィールドに異なる値を設定することで、異なる状態(属性)を持つオブジェクトを表現できます。


メソッド:オブジェクトの「振る舞い」を表すもの

次に、オブジェクトの「振る舞い」についてです。振る舞いとは、そのオブジェクトが何ができるか、どんな操作を実行できるかを示すものです。スマートフォンの例で言えば、次のような振る舞いが考えられます。

  • 電話をかける
  • 写真を撮る
  • アプリを起動する
  • 充電する

これらの振る舞いは、Javaでは**「メソッド」**として表現されます。メソッドは、オブジェクトが実行できる処理のまとまり、だと考えてください。

Smartphoneクラスにメソッドを追加してみましょう。

Java

public class Smartphone {
    String color;
    String modelName;
    int storageCapacity;
    int batteryLevel;

    // 電話をかけるメソッド
    public void makeCall(String phoneNumber) {
        System.out.println(modelName + "で" + phoneNumber + "に電話をかけます。");
        batteryLevel -= 5; // 電話をかけるとバッテリーが減る
        System.out.println("バッテリー残量: " + batteryLevel + "%");
    }

    // 写真を撮るメソッド
    public void takePhoto() {
        System.out.println(modelName + "で写真を撮りました!");
        batteryLevel -= 2; // 写真を撮るとバッテリーが減る
        System.out.println("バッテリー残量: " + batteryLevel + "%");
    }

    // 充電するメソッド
    public void charge() {
        System.out.println(modelName + "を充電しています...");
        batteryLevel = 100; // 充電するとバッテリーが満タンになる
        System.out.println("充電完了!バッテリー残量: " + batteryLevel + "%");
    }
}

メソッドの書き方は、public void メソッド名(引数)のようになります。

  • public: 誰でもこのメソッドを使えるようにする、という意味です。
  • void: このメソッドが何も値を返さない、という意味です。(後で、値を返すメソッドも紹介します)
  • makeCall(String phoneNumber): メソッド名がmakeCallで、String phoneNumberという情報(引数と呼びます)を受け取ります。電話番号を指定して電話をかける、というイメージですね。

それでは、これらのメソッドを実際に使ってみましょう。

Java

public class Main {
    public static void main(String[] args) {
        Smartphone myPhone = new Smartphone();
        myPhone.color = "ブラック";
        myPhone.modelName = "iPhone 15 Pro Max";
        myPhone.storageCapacity = 512;
        myPhone.batteryLevel = 85;

        System.out.println("--- 私のスマホの行動 ---");
        myPhone.makeCall("090-1234-5678"); // 電話をかける
        myPhone.takePhoto();               // 写真を撮る
        myPhone.charge();                  // 充電する

        System.out.println("\n--- あなたのスマホの行動 ---");
        Smartphone yourPhone = new Smartphone();
        yourPhone.color = "ホワイト";
        yourPhone.modelName = "Galaxy S24 Ultra";
        yourPhone.storageCapacity = 256;
        yourPhone.batteryLevel = 95;

        yourPhone.takePhoto();
        yourPhone.makeCall("080-9876-5432");
    }
}

実行結果を見ると、それぞれのスマートフォンオブジェクトが独自に電話をかけたり、写真を撮ったりしているのが分かりますね。そして、メソッド内でフィールドの値(batteryLevel)が変化しているのも確認できるはずです。このように、メソッドはオブジェクトの振る舞いを定義し、その振る舞いによってオブジェクトの状態(フィールドの値)を変化させることができます。

paizaで実行した結果

値を返すメソッド

先ほどのvoidは「何も返さない」という意味でした。しかし、メソッドの中には何らかの計算結果や情報を提供するものもあります。例えば、スマートフォンの現在のバッテリー残量を「教えてくれる」メソッドを考えてみましょう。

Java

public class Smartphone {
    String color;
    String modelName;
    int storageCapacity;
    int batteryLevel;

    // ... その他のフィールドとメソッド ...

    // バッテリー残量を返すメソッド
    public int getBatteryLevel() {
        return batteryLevel; // batteryLevelの値を返す
    }
}

このgetBatteryLevelメソッドは、int型の値を返します。voidの代わりにintと書かれているのがポイントです。そして、return batteryLevel;で、batteryLevelフィールドの値を呼び出し元に返しています。

これを使ってみましょう。

Java

public class Main {
    public static void main(String[] args) {
        Smartphone myPhone = new Smartphone();
        myPhone.modelName = "iPhone 15 Pro Max";
        myPhone.batteryLevel = 70;

        System.out.println("私のスマホの現在のバッテリー残量: " + myPhone.getBatteryLevel() + "%");

        myPhone.makeCall("090-1111-2222"); // 電話をかけてバッテリーを減らす

        System.out.println("電話後のバッテリー残量: " + myPhone.getBatteryLevel() + "%");
    }
}

myPhone.getBatteryLevel()と呼び出すことで、現在のバッテリー残量の値を受け取り、それを表示しています。

paizaで実行した結果


フィールドとメソッドの関係性

フィールドとメソッドは、オブジェクトが現実世界をモデル化する上で切っても切れない関係にあります。

  • フィールド: オブジェクトがどのような状態であるかを表現する。
  • メソッド: オブジェクトが何ができるか、どのように振る舞うかを表現し、その振る舞いによってオブジェクトの状態(フィールドの値)が変化する。

つまり、オブジェクトは「属性」と「振る舞い」をひとまとめにしたものです。この「ひとまとめにする」という考え方が、オブジェクト指向プログラミングの大きな特徴である**「カプセル化」**につながります。カプセル化については、また別の機会に詳しくお話ししますね。


まとめ

今回は、Javaにおけるオブジェクトの「属性」と「振る舞い」について、それぞれ**「フィールド」と「メソッド」**という言葉で解説しました。

  • フィールドは、オブジェクトが持つデータ(属性)を格納する箱です。
  • メソッドは、オブジェクトが実行できる処理(振る舞い)のまとまりです。

オブジェクトは、これらフィールドとメソッドを組み合わせることで、現実世界の複雑なものをシンプルにモデル化することができます。この概念をしっかり理解することが、Javaプログラミングの第一歩です。

次回は、今回少し触れた「カプセル化」について、もう少し深掘りしていこうと思います。


前回の記事はこちらから読めます!

クラスとオブジェクトの概念 – オブジェクト指向の入り口 | ToolDocs

オブジェクト指向の学習、一緒に頑張っていきましょう!何か質問はありますか?

コメント

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