Java基礎:メソッドの基本概念と実践

1. メソッドの定義

修飾子 戻り値の型 メソッド名(パラメータリスト) {
    // メソッド本体;
}

public static int maxValue(int a, int b) {
    int result;
    if (a > b)
        return a;
    return b;
}
- メソッドヘッダーとは、修飾子、戻り値の型、メソッド名、およびパラメータから構成されます。 - 戻り値の型はメソッドが返す値のデータ型です。一部のメソッドは特定の操作を実行するだけで値を返さない場合があります。このような場合は、戻り値の型としてキーワード void が使用されます。メソッドが値を返す場合、そのメソッドは値を返すメソッドと呼ばれます。そうでない場合は、voidメソッドと呼ばれます。 - メソッドヘッダーで定義される変数は、仮パラメータ(フォーマルパラメータ)または単にパラメータと呼ばれます。パラメータはプレースホルダーのような役割を果たします。メソッドが呼び出される際に、パラメータに値が渡され、この値は実パラメータ(アクチュアルパラメータ)または引数と呼ばれます。パラメータリストは、メソッド内のパラメータの型、順序、および数を指定します。メソッド名とパラメータリストを合わせてメソッドシグネチャを形成します。パラメータは任意であり、メソッドはパラメータを含まなくても構いません。 - メソッド本体には、そのメソッドを実装する文の集合が含まれます。値を返すメソッドが結果を返すようにするためには、キーワード return を含む return 文を使用する必要があります。return 文が実行されると、メソッドは終了します。 - その他の一部の言語では、メソッドはプロシージャまたは関数と呼ばれます。これらの言語では、値を返すメソッドは関数と呼ばれ、戻り値の型が void のメソッドはプロシージャと呼ばれます。 - メソッドヘッダーでは、各パラメータに対して個別のデータ型の宣言が必要です。例えば、maxValue(int num1, int num2) は正しいですが、maxValue(int num1, num2) は間違いです。

2. メソッドの呼び出し

メソッドを使用するには、それを呼び出す(コールまたはインVOKEする)必要があります。メソッドが戻り値を持つかどうかに応じて、メソッドの呼び出しには2つの方法があります。
// メソッドが値を返す場合、その呼び出しは通常値として扱われます
int larger = maxValue(3, 4);

// メソッドがvoidを返す場合、その呼び出しは文である必要があります
System.out.println("Javaへようこそ!");
// Javaでは、戻り値を持つメソッドも文として呼び出すことができます。この場合、呼び出し元は戻り値を無視するだけです。
プログラムがメソッドを呼び出すと、プログラムの制御は呼び出されたメソッドに移ります。return文が実行されるか、メソッドの終わりを示す右中括弧に到達すると、呼び出されたメソッドはプログラム制御を呼び出し元に返します。メソッドが呼び出されるたびに、システムはそのメソッドのパラメータと変数を保存するためのアクティブレコード(アクティブフレームとも呼ばれます)を作成します。アクティブレコードは、呼び出しスタック(call stack)と呼ばれるメモリ領域に配置されます。呼び出しスタックは、実行スタック、ランタイムスタック、またはマシンスタックとも呼ばれ、単に「スタック」と略されることもあります。あるメソッドが別のメソッドを呼び出すと、呼び出し元のアクティブレコードはそのまま維持され、新しいアクティブレコードが新しい呼び出されたメソッドのために作成されます。メソッドの実行が終了して呼び出し元に戻ると、対応するアクティブレコードも解放されます。呼び出しスタックは、後入れ先出し(LIFO)方式でアクティブレコードを保存します:最後に呼び出されたメソッドのアクティブレコードが最初にスタックから取り出されます。

3. 値によるパラメータ渡し

メソッドを呼び出す際には、実パラメータを提供する必要があり、それらはメソッドシグネチャに対応する仮パラメータの順序と一致している必要があります。これをパラメータの順序対応(parameter order association)と呼びます。実パラメータは、メソッドシグネチャで定義された仮パラメータと順序と数が一致し、型が互換である必要があります。型の互換性とは、明示的な型変換なしに実パラメータの値が仮パラメータに渡せることを意味します(暗黙的な変換は許可されます)。 パラメータを持つメソッドを呼び出す際、実パラメータの値が仮パラメータに渡されます。このプロセスは値による渡し(pass-by-value)と呼ばれます。実パラメータがリテラルではなく変数である場合、その変数の値が仮パラメータに渡されます。*仮パラメータがメソッド内で変更されても、元の変数は影響を受けません。*

4. メソッドのオーバーロード

メソッドのオーバーロードを使用すると、*パラメータリスト*が異なる限り、同じ名前で異なるメソッドを定義できます。
public static int displayValue(int a, int b) {}
public static int displayValue(double a) {}
- メソッドのオーバーロードにより、プログラムがより明確で可読性が高くなります。同じ機能を実行するがパラメータの型が異なるメソッドは、同じ名前を使用するべきです。 - オーバーロードされたメソッドは、異なるパラメータリストを持つ必要があります。異なる修飾子または戻り値の型に基づいてメソッドをオーバーロードすることはできません。

5. 変数のスコープ

変数のスコープ(scope of a variable)とは、変数がプログラム内で参照できる範囲を指します。メソッド内で定義される変数はローカル変数(local variable)と呼ばれます。ローカル変数のスコープは、変数が宣言された場所から、その変数を含むブロックの終わりまでです。ローカル変数は、使用前に宣言と初期化を行う必要があります。 - パラメータは実際にはローカル変数です。メソッドのパラメータのスコープは、そのメソッド全体に及びます。 - forループのヘッダーで初期化部分に宣言された変数のスコープは、forループ全体です。forループ本体で宣言された変数のスコープは、ループ本体に限定されます。一般的なエラーは、forループ内で変数を宣言し、ループ外で使用しようとすることです。 - メソッド内の異なるブロックで同じ名前のローカル変数を宣言することはできますが、ネストされたブロック内または同じブロック内で同じローカル変数を2回宣言することはできません。

*プログラミング思想 - メソッドの抽象化段階的詳細化

メソッドの抽象化(method abstraction)は、メソッドの使用とその実装を分離することによって実現されます。メソッドの実装の詳細はメソッド内にカプセル化され、そのメソッドを使用するユーザーからは隠蔽されています。これを情報隠蔽(information hiding)またはカプセル化(encapsulation)と呼びます。 メソッドの抽象化の概念は、プログラムの開発プロセスにも適用できます。大規模なプログラムを作成する際には、「分割統治」(divide-and-conquer)戦略、段階的詳細化(stepwise refinement)とも呼ばれる、大きな問題をサブ問題に分解することができます。サブ問題はさらに、より小さく、より簡単に処理できる問題に分解されます。 「トップダウン」アプローチは、上から下へ、構造図のメソッドを1つずつ実現する方法です。実現されるメソッドは、スタブメソッド(stub)と呼ばれる、シンプルだが不完全なバージョンのメソッドで置き換えることができます。スタブメソッドを使用すると、プログラムのフレームワークを迅速に構築できます。ボトムアップアプローチは、下から上へ、構造図のメソッドを1つずつ実現する方法で、各実現されたメソッドに対してテストプログラム(ドライバ(driver)と呼ばれる)を作成してテストします。 段階的詳細化は、大きな問題を小さくて扱いやすいサブ問題に分解します。各サブ問題はメソッドを使用して実装できます。このアプローチにより、問題の記述、再利用、デバッグ、修正、保守が容易になり、プログラム内でのメソッドの再利用性が向上します。

タグ: Java メソッド パラメータ オーバーロード スコープ

5月21日 10:48 投稿