Print Friendly, PDF & Email

ここでは、カプセル化に関するJavaプログラムを作成してみましょう。

1.カプセル化

以下のクラスにカプセル化(含むデータ隠蔽)を施しなさい。

IDEの便利機能を使用して構わない。

package p11;

public class Q01 {
    int id;
    String name;
    boolean programmingExperience;
}

2.アクセサメソッドの効果

1で作成したクラスにアクセサメソッドに追記することにより以下の制約を課しなさい。

IDは整数4桁の数値 1000~9999

名前は最低5文字以上。

なお、制約を外れた値の設定に対しては何もしない。

コンストラクタはなし(デフォルトコンストラクタ)。

作成後に簡単なテストコードを書いて動作を確かめること。

3.PINコードのクラッキング

銀行のATM等で利用されるPINコードのプロトタイプとして次のようなクラスがある。

class PinCode1 {

    private final int PIN = 1234;

    public boolean confirmCode(int nubmer) {
        return this.PIN == nubmer;
    }
}

このPINコードをブルートフォースアタックで解読するコードを以下に書きなさい。

package p11;

public class Q03 {

    public static void main(String[] args) {

        PinCode1 pc = new PinCode1();

    //ここにコードを書く

        System.out.println(i);
    }
}

<結果>

1234

また、この仕様の場合、平均して何回の試行でPINが推測できるか答えなさい。

4.PINコードのクラッキング防止

3.のインスタンスのPINコードを以下の対策で守りなさい。

・試行回数(tryTimes)というフィールドを追加する。

・試行回数が5回を超えたらシステムを強制終了する。

ヒント:System.exit(0);でシステムを強制終了させることができる。0は正常終了のコード。

5.PINコードジェネレータ

ワンタイムパスワードを生成するPINコードジェネレータを作成したい。

以下の条件を満たすように作成しなさい。

pinナンバーは他のクラスから直接アクセスできない。

コンストラクタは同じパッケージからしかアクセスできない。

セッターは用意しない。

インスタンス生成時に桁数(digits)を指定する。

桁数は4~9までの整数とし、このルールに従わない場合にはインスタンス化されない。

package p11;

public class Q05 {

    public static void main(String[] args) {

        PINGenerator pg = new PINGenerator(4);
        System.out.println(pg.getPin());
    }
}

class PINGenerator {
    //ここにコードを書く
}

<結果の例>

9757

6.クラスの責務

あなたがシステムエンジニをしている某国では、お店で商品を買った時に消費税がかかります。

消費税は2種類に分かれていてパン(bread)のような食品(Groceryクラス)は8%、鉛筆(pencil)のような食品以外の商品(NonGroceryクラス)は10%と決まっています。

そして現在の首相は消費税の見直しは今後5年間はしないことを公約に掲げて当選しました。

そこである新入社員が次のような税込金額を計算できるプログラムを作成しました。

ところが、現在の仕様では税率は、getPriceメソッドの引数で指定することになっています。

本来なら各々の商品の税率はどのクラスが知っているべき情報でしょうか?

package p11;

public class Q06 {

    public static void main(String[] args) {

        NonGrocery pencil = new NonGrocery("pen", 100);
        System.out.println(pencil.getPrice(0.1));

        Grocery bread = new Grocery("bread", 200);
        System.out.println(bread.getPrice(0.08));
    }
}

class Product {

    protected String name;
    protected int price;

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

class Grocery extends Product {


    public Grocery(String name, int price) {
        super(name, price);
    }

    int getPrice(double taxRate) {
        return (int) Math.floor(this.price * (1.0 + taxRate));
    }

}

class NonGrocery extends Product {


    public NonGrocery(String name, int price) {
        super(name, price);
    }

    int getPrice(double taxRate) {
        return (int) Math.floor(this.price * (1.0 + taxRate));
    }
}

本来あるべきプログラムに修正しなさい。

7.オリジナル問題作成

将来の後輩のために良い問題が出来たら教えてください。

以上。

JavaSEの問題集トップページに戻る