Java はじめて19 〜コンストラクタの役割を見る〜

イントロダクション

前回作成したプログラム「コーダー銀行アプリ」を深掘りして、改造することを考えてみます。
この時に重要になるのはクラスの構成を理解しておくことです。

クラスには、以下の要素があります。※各項目に関してはこちらで解説しています。

  • コンストラクタ
  • メソッド
  • フィールド変数

なので、これらを理解すれば、クラスは扱えるということです。そんなに難しくないでしょ?(笑)

プログラムを見る

<作成したプログラム>

コンストラクタの役割

コンストラクタの役割は、クラスを初期化するというところです。具体的には、クラスで持っているフィールド変数を初期化するところがメインになりますが、他にも必要であれば、そのような実装を行います。
まずは、基本的なフィールド変数の初期化を考えてみます。

デフォルトコンストラクタ
処理が何もないコンストラクタのこと、これは、暗黙的に実装されている。
「暗黙的に」というのは、「コードに書いてなくても」という意味

フィールド変数
これは、クラスのインスタンスが存在している間、データを保持しておくことができる変数です。
なので、コンストラクタの処理が走った時に、フィールド変数を初期化してやれば、インスタンスが存在している間
フィールド変数に値が保持されます。
具体的には、下のコードで行くと「yokingaku」という変数がフィールド変数ですが、これに預金額(yokingaku)を設定してやれば、下にあるメインメソッドの処理が終了するまで値が保持されることになります。最後にメモリの解放を行なっているためです。

ただし、Javaにはガベージコレクションという仕組みがあり、わざわざ次のようなコードを書かなくても、メモリの解放を行なってくれます。下ような書き方は明示的なメモリの解放というような言い方をします。

main = null;

ガベージコレクションでのメモリの開放は便利ですが、メモリの解放を行うタイミングは、JVMの都合に依存するので、明示的にメモリを解放した方が、メモリ管理はしやすいです。※必要があればの話ですが。。。

プログラムの内容を見る

では、プログラムを見てみましょう。

<MainBank>

public class MainBank {
    /** 預金額 */
    private int yokingaku;
    /** 処理が何もないものは「デフォルトコンストラクタ」 */
    public MainBank() {
    }

    /** コンストラクタ: 引数あり、フィールドを初期化する */
    public MainBank(int yokingaku) {
        // フィールド変数とコンストラクタの引数名が同じなので区別するためにthisを使う
        this.yokingaku = yokingaku;
    }
}

<メインメソッド>

public static void main(String[] args) {
    // 初期の貯金金額は1000円
    MainBank main = new MainBanik(1000);
    // ATM処理の開始
    main.atm();
    // インスタンスの破棄(メモリの解放)
    main = null;
}

今回は、以前作成したアプリ=「コーダー銀行ATMアプリ」をカスタム(改造)しながら、javaで提供されているAPIの使い方を何個か見てみようと思います。

String

既存のクラスです。「既存」というのはJavaAPIですでに実装済ということです。
主に文字列として使用します。そして、文字列の比較もします。編集、切り出しなどいろいろなメソッドがあるので、一部抜粋して見ます。

  1. equals()メソッド
  2. substring()メソッド
  3. valueOf()メソッド

これらのメソッドはよく使うと思われるので、紹介いたします。
まずは1番から行きます。

String str = "テスト";
if ("テスト".equals(str) {
   System.out.println("テストです。");
}

2番目

String str = "テスト";
String result = str.substring(0, 1);
System.out.println("substring = " + result); // 「テ」と出力される

3番目

int num = 10;
String numStr = String.valueOf(num);
System.out.println(numStr.substring(0,1); // 「1」

3番目は「int型」から「文字列(String)型」へ変換しています。

クラスをカスタム

早速問題を出します。
【問題】
「現在、コンストラクタで預金額を1000に設定しています。
これをコンストラクタに渡した値で預金額を初期化できるように修正するにはどうしたら良いでしょうか?」

ヒント;ソースのダウンロードはこちらからできます

どこを修正すれば良いか?

初めに考えるのは上記の疑問に答えるための答えを考えます。
問題にある「コンストラクタで。。。」という部分に着目します。
そして、コードを見てみると下のようになっています。

/**
 * コンストラクタ
 */
public MainBank() {
    cal = new Calcuration();
}

これでCalcurationクラスを初期化しています。ではコンストラクタの中身は?

public Calcuration() {
    // 預金額は1000円スタート
    yokingaku = 1000;
}

上のようになっています。コンストラクタは引数なしなので、預金額に直接「1000」を代入しています。
ここまで記載すれば、答えは見えてくると思います。

では、次の問題

【問題2】

このアプリにはバグがあります。それを見つけて修正してください。今のところ自分が認識しているのは入力したときにあるバグなのですが、そのほかにもあるかもしれません。
なぜかというと、テストをしていないからです。
本番環境(サーバー)にリリースしようと考えている人は絶対に真似しないようにしてください。テストはちゃんとやりましょう。

この問題の答えは書きません。見つけてみてください。

でわでわ。。。

<<< 前回 次回 >>>



投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す