未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】オブジェクト指向の基本問題2-2

title


問題2-2

ペットを表すPetクラスを作成してください。

Petクラスを使用するClassBasicPracticeクラスのmainメソッドはすでに完成しています。
(変更は禁止です)


【Petクラス】
Petクラスは次の4つのprivateインスタンスフィールドを持ちます。

  1. 動物の種類を保持するためのtypeフィールド(String型)
  2. 名前を保持するためのnameフィールド(String型)
  3. 年齢を保持するためのageフィールド(byte型)
  4. 性別を保持するためのgenderフィールド(boolean型 ture:メス false:オス)

また、Petクラスは次の5つのpublicメソッドを持ちます。

  1. 動物の種類を設定するためのsetTypeメソッド
  2. 名前を設定するためのsetNameメソッド
  3. 年齢を設定するためのsetAgeメソッド
  4. 性別を設定するためのsetGenderメソッド
  5. 紹介文を取得するためのgetIntroductionメソッド

(紹介文の内容は下記の実行結果を参考にしてください)


【実行結果】

犬のコタローはオスで4歳です。
猫のミーはメスで2歳です。


【ClassBasicPractice.java】

public class ClassBasicPractice {
    public static void main(String[] args) {

        // 1匹目のペットオブジェクトの生成
        Pet pet1 = new Pet();

        // 1匹目のペットデータを設定
        pet1.setType("犬");
        pet1.setName("コタロー");
        pet1.setAge((byte)4);
        pet1.setGender(false);

        // 2匹目のペットオブジェクトの生成
        Pet pet2 = new Pet();

        // 2匹目のペットのデータを設定
        pet2.setType("猫");
        pet2.setName("ミー");
        pet2.setAge((byte)2);
        pet2.setGender(true);

        // 2匹のペットの紹介文を取得し、表示する
        System.out.println(pet1.getIntroduction());
        System.out.println(pet2.getIntroduction());

    }
}


// ここにPetクラスを作成してください。


解答例

【ClassBasicPractice.java】

public class ClassBasicPractice {
    public static void main(String[] args) {

        // 1匹目のペットオブジェクトの生成
        Pet pet1 = new Pet();

        // 1匹目のペットデータを設定
        pet1.setType("犬");
        pet1.setName("コタロー");
        pet1.setAge((byte)4);
        pet1.setGender(false);

        // 2匹目のペットオブジェクトの生成
        Pet pet2 = new Pet();

        // 2匹目のペットのデータを設定
        pet2.setType("猫");
        pet2.setName("ミー");
        pet2.setAge((byte)2);
        pet2.setGender(true);

        // 2匹のペットの紹介文を取得し、表示する
        System.out.println(pet1.getIntroduction());
        System.out.println(pet2.getIntroduction());

    }
}

// Petクラス
class Pet {

    // タイプ
    private String type;

    // 名前
    private String name;

    // 年齢
    private byte age;

    // 性別(true:メス false:オス)
    private boolean gender;

    // 種類を設定する
    public void setType(String type) {
        this.type = type;
    }

    // 名前を設定する
    public void setName(String name) {
        this.name = name;
    }

    // 年齢を設定する
    public void setAge(byte age) {
        this.age = age;
    }

    // 性別を設定する
    public void setGender(boolean gender) {
        this.gender = gender;
    }

    // 紹介文を取得する
    public String getIntroduction() {
        String tmp;

        tmp = type + "の" + name + "は";

        if(gender) {
            tmp += "メス";
        } else {
            tmp += "オス";
        }

        tmp += "で" + age + "歳です。";

        return tmp;
    }
}


解説

今回の問題は、クラス作成の基本的な問題です。

インスタンスフィールドが4つもありますが、それほど難しい問題ではないと思います。

getIntroductionメソッドの作成が少し難しかったかもしれません。



クラスの要素を「メンバ」と言いますが、大きく分けて「フィールド」「メソッド」の2種類があります。

一般的には、先にフィールドの定義を行います。


今回の問題では、すべてのインスタンスフィールドをprivateアクセスにするように指示されています。

これは大切なことで、一般的にはインスタンスフィールドはprivateに設定し、外部から直接アクセスできないようにします。

これを「データの隠蔽」と言います。


そして外部からデータを設定・取得するには、それ専用のpublicなメソッドを作成します。

それを「アクセサメソッド」と言います。


その中でもデータを取得するためのメソッドは「ゲッターメソッド」と言いますが、今回は必要ありません。

その代わり、データを設定するための「セッターメソッド」を定義します。


「ゲッターメソッド」は「引数なしで戻り値あり」、「セッターメソッド」は「引数ありで戻り値なし」が一般的です。


今回も4つのインスタンスフィールドに値を設定するセッターメソッドを4つ作成します。



ゲッターメソッドはありませんが、紹介文の取得にはgetIntroductionメソッドを使用します。


ここで勘違いしてはいけないのは、getIntroductionメソッドにはString型の戻り値があることです。

メソッドの中にSystem.out.printlnを用いて説明文を出力してしまうのはNGです。


なぜなら、mainメソッドでは、getIntroductionメソッドの戻り値をSystem.out.printlnを用いて出力しているからです。



getIntroductionメソッドの説明文を作るときの注意としては、性別genderインスタンスフィールドがboolean型なので、適切に「オス」「メス」という文字列に変換しないといけない点です。


if文を用いるのが一番簡単ですが、次のように条件演算子(三項演算子)を用いる方法もあります。

条件演算子を用いれば、return文一行で記述することが可能です。

// 紹介文を取得する
public String getIntroduction() {
    return type + "の" + name + "は" +
            (gender ? "メス" : "オス") +
            "で" + age + "歳です。";
}



解答例では、わかりやすさを重視して、条件演算子は使わずにString型のローカル変数tmpを用いて少しずつ文字列を連結していきました。



あと、性別の分岐のところで次のようなif文を記述した方がいるかもしれません。

if(gender == true) {
    tmp += "メス";
} else {
    tmp += "オス";
}


もし上記のように記述してしまった方は、絶対にこのように書かないように気をつけましょう。


if文の条件式に使える値はboolean型だけですが、「genderがtrueと等しい場合」というのはgender変数がtrueの場合だけなので、比較演算子==は不要です。


あと、if文の条件式にうっかり「gender = true」と、代入演算子を書いてしまうバグを入れてしまうおそれもあります。


参考図書



LINE公式アカウント

仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】


LineOfficial

友だち追加