2-3:メソッドと制御構造


・ Javaのプログラムの処理はどんな順序で実行されるのでしょうか? 以下のサンプルで説明しましょう。


/** 現在の時刻を調べ適当な挨拶を表示するクラス */
import java.util.Calendar;
public class GoodMorning {

  /** 最初に呼び出されるメソッド */
    public static void main( String argv[] ) {

        int hour = searchHour();
        showMessage( hour );
    }

  /** 時刻を調べるメソッド */
    public static int searchHour() {

        int result
          = Calendar.getInstance().get( Calendar.HOUR_OF_DAY );
        return result;
    }

  /** 適切な挨拶を表示するメソッド */
    public static void showMessage( int hour ) {

       if( hour > 5 && hour < 12 )
           System.out.println( "Good morning!" );
       else if( hour < 17 )
           System.out.println( "Good afternoon!" );
       else if( hour < 19 )
           System.out.println( "Good evening!" );
       else
           System.out.println( "Good night!" );
    }
}

・ まず読み込まれたクラスのデータの中で main()という名前のメソッドが 捜されます。 javaコマンドで直接読み込まれるクラスには必ず main()が存在しなくてはいけません。 そうでないと実行時のエラーとなります。 また、単に main()という名前だけではなく、public かつ static であること、 メソッドの型は void型であること(計算結果を返さない)、 引数に Stringクラスの配列が唯一与えられることも必須です。 これらのすべての条件が満たされるようにあらかじめ記述しておく必要があります。
今のサンプルでは偶然 main()がプログラムの先頭に置かれていますが、 仮に他の場所にあっても最初に呼び出されます。 一般に、メソッドの定義の順番は実行の順番とは関係しません。

・ main()メソッドが見つかると、その先頭の行から、上から下に向けて 順番に命令が呼ばれていきます。 特別な指定がない限り、メソッドの中の処理は「上から下へ」が大原則です。 したがって、まず最初の行である int hour = searchHour(); の命令が実行されます。

・ このように別のメソッドが呼び出されると、処理は呼び出した場所からジャンプし、 呼び出されたメソッドへ移ります。 今の場合、すぐ下にある searchHour()の処理に移ります。 ここでは java.utilパッケージにある Calendarという名前のクラスの メソッドを呼び出しています。 このクラスはこのサンプルの中には含まれていませんが、 別の場所でサンプルのクラスと同じような記述が存在し、 その中に getInstance() や get()という名前のメソッドが用意されています。 現時点ではそれらについて深く知る必要はありません。 とりあえず、ここでは「現在の時刻(時の値)」を調べていると理解してください。 メソッドは return文もしくはメソッドの定義の最後まで進むと処理が終わります。 ここでは return文で「計算結果」として「今、何時か」という情報を int型の整数値で報告しています。 このような値のことを「返り値」とか「戻り値」と呼びます。

・ 呼び出されたメソッドの処理が終わると、 再びジャンプして、元の呼び出した場所に戻ります。 ここでは先程の main()メソッドの1行目です。 メソッドが返り値を返した場合、その結果は1行目の記述のように メソッドの値として取り出して利用することができます。 変数 hour の中には searchHour()で調べられた「今、何時か」の情報が記憶されます。 そして、処理は次の2行目に移ります。

・ main()の2行目でも 別のメソッド showMessage() が呼ばれます。このメッセージは void型であるため、返り値は利用できません。 そのため単に呼び出すだけの形式になっています。
その代わり、メソッドを呼び出す時に () の中に変数を指定しています。 これが「引数」と呼ばれるものです。 引数はメソッドの目的に応じて型や個数を決めることができます。 ただし、実行時に与える引数は、あらかじめ定義の中で定められたものと、 型や個数が一致している必要があります。 今のサンプルでは showMessage() には必ず引数として int型の数値を1個 与えるという決まりになっているわけです。

・ showMessage()の中の処理は「条件分岐」の制御構造を持っています。 条件分岐は繰り返しとともに Javaのメソッドの制御構造の基本です。
ここでは if で始まる条件分岐によって与えられた hourの値に応じて 表示するメッセージの処理が選択されます。 メッセージの表示の処理は1個しか実行されない点に注意してください。

・ showMessage()の処理が終わり main()メソッドに戻って来ると、 もうその先には処理すべき行がありません。 この時点でプログラムは終了します。
そしてプログラムを実行していた javaコマンドも行うべき処理がなくなったので 終了します。

・ ・