メソッドの引数
10.3 メソッドの引数
前項ではメソッドを利用することで、簡潔でわかりやすくメンテナンスのしやすいプログラムを書けることがわかりました。ここからは、メソッドの記述方法についてもう少し詳しく見ていくことにします。
10.3.1 同じ型の引数を複数持つメソッドを使用したプログラム
このプログラムは、int型の引数を2つ受け渡し、合否と点数を画面に表示させるメソッドを作成し、呼び出して利用します。作成して実行結果を確認してみましょう。
➢ TwoArgument.java
package jp.co.f1.intro.ch10; public class TwoArgument { static void checkPass(int point, int passPoint) { if (point >= passPoint) { System.out.println(point + "点なので合格です。"); } else { System.out.println(point + "点なので不合格です。"); } System.out.println(" - - - "); } public static void main(String[] args) { // 点数を管理する変数の宣言と初期化 int pointA = 85; int pointB = 32; int pointC = 60; int pointD = 40; System.out.print("A君は、"); checkPass(pointA, 50); System.out.print("B君は、"); checkPass(pointB, 50); System.out.print("Cさんは、"); checkPass(pointC, 50); System.out.print("Dさんは、"); checkPass(pointD, 50); } }
実行結果
解説
このプログラムでは、mainメソッドの前に自作のメソッドであるcheckPassメソッドを記述しています。実行される順番に解説を行います。
まず、19~22行目は、各生徒の点数を管理するint型の変数を4つ宣言し、初期化しています。
次に、各生徒の情報をメソッドを呼び出して処理していきます。
24行目では、「A君は、」という文字列を表示させています。
25行目では、checkPassメソッドを呼び出しています。checkPassメソッドの引数は、int型の値2つです。25行目でもint型の値が代入された変数とint型の値の2つを引数として渡しています。
25行目でメソッドを呼び出すと、宣言部分である5~14行目のメソッド内の処理である7~12行目が実行されます。これは、受け取った値2つを利用し、合否を判定し、点数と合否を知らせるメッセージを表示するメソッドです。引数に取ったint型の値は、1つ目は生徒のテストの点数であり、2つ目は合格点です。
7行目はif文の条件文です。もし合格点よりテストの点数が高ければ、「~点なので合格です。」と画面に表示します。そうでなければif文の内部処理は行われず、9行目のelse文の内部処理が実行されます。この場合は、「~点なので不合格です。」と画面に表示されます。
25行目で呼び出されている場合は、点数である変数pointの値は85、合格点である変数passPointは50であるので、if文の内部処理が実行され「85点なので合格です。」と画面に表示されます。
最後に12行目で境界線の記号(- – -)を表示させます。
12行目が実行されるとcheckPassメソッドの処理は全て終了するので、次は呼び出し元の続きである27行目の処理に移ります。
27、28行目と30、31行目と33、34行目も24、25行目と同じような流れになっています。
27行目では「B君は、」と表示し、28行目ではint型の変数pointBの値である32とint型の値である50を引数として受け渡すcheckPassメソッドを呼び出します。
30、31行目と33、34行目も同様にメソッドを呼び出して処理を行います。
10.3.2 違う型の引数を複数持つメソッドを使用したプログラム
次のプログラムでは、異なる型の変数を3つ受け取るメソッドを作成し、結果を確認します。
➢ VariousArgument.java
package jp.co.f1.intro.ch10; public class VariousArgument { static void checkPass(String name, int point, int passPoint) { System.out.print(name + "は、"); if (point >= passPoint) { System.out.println(point + "点なので合格です。"); } else { System.out.println(point + "点なので不合格です。"); } System.out.println(" - - - "); } public static void main(String[] args) { // 点数を管理する変数の宣言と初期化 int pointA = 85; int pointB = 32; int pointC = 60; int pointD = 40; checkPass("A君", pointA, 50); checkPass("B君", pointB, 50); checkPass("Cさん", pointC, 50); checkPass("Dさん", pointD, 50); } }
実行結果
解説
このプログラムは、10.3.1項で作成したTwoArgument.javaをさらにメソッドを使って効率化したものです。TwoArgument.javaで生徒の名前を表示させていたplintlnメソッドを自作のメソッドの中に入れたことで、繰り返し同じ記述をする必要がなくなりました。
プログラムの実行順に解説していきます。20~23行目はTwoArgument.javaでも作成しましたが、生徒の点数を管理するint型の変数を宣言し初期化しています。
次に、25行目でcheckPassメソッドを呼び出します。引数は、メソッドの宣言部分である5行目の引数の型と数、順序と一致して記述しています。このcheckPassメソッドの引数の数は3つで、1つ目はString型、2つ目はint型、3つ目はint型です。
25行目でcheckPassメソッドを呼び出すと、5~15行目のcheckPassメソッドの宣言部分の内部処理である7~13行目が実行されます。仮引数の変数nameには、「A君」という値が代入され、変数pointには85、変数passPointには50が代入されている状態です。
7行目では、変数nameの値と文字列を表示します。「A君は、」と画面に表示されます。
8行目ではif文の条件式「point >= passPoint」が判定され、ここでは「85 >= 50」となるためこの条件は満たされ、9行目が実行されます。
9行目では、「85点なので合格です。」と表示されます。
if文の条件が満たされ、続くelse文の内部処理は実行されません。
13行目は、「 – – – 」という文字列を画面に表示します。
27、29、31行目もcheckPassメソッドを呼び出しています。25行目と同じように処理を行います。
TwoArgument.javaとの違いは、名前の表示もメソッド内で行うかどうかです。TwoArgument.javaとの記述の違いを確認しましょう。
10.3.3 配列の要素をメソッドの引数に渡すプログラム
配列の要素を引数に受け取るメソッドを作成し、呼び出して実行します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch10
③ 名前 :MethodWithArrayElement.java
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ MethodWithArrayElement.java
package jp.co.f1.intro.ch10; public class MethodWithArrayElement { static void checkPass(int point){ if(point >= 50){ System.out.println(point + "点なので合格です。"); }else{ System.out.println(point + "点なので不合格です。"); } System.out.println(" - - - "); } public static void main(String[] args) { // String型の名前を管理する配列の宣言と初期化 String[] aryName = {"A君", "B君", "Cさん", "Dさん"}; // int型の点数を管理する配列の宣言と初期化 int[] point = {85, 32, 60, 40}; for(int i = 0; i < aryName.length; i++){ System.out.print(aryName[i] + "は、"); checkPass(point[i]); } } }
実行結果
解説
このプログラムでは、mainメソッドの上に自作のメソッド本体が記述されています。プログラムの実行順に解説していきます。
まず初めに実行されるのは、mainメソッド内の最初の処理である19行目です。String型の配列変数aryNameを宣言し、4つの要素を作成と同時に任意の値で初期化しています。
次に、22行目ではint型の配列変数pointを宣言し、4つの要素を作成と同時に任意の値で初期化しています。
24~27行目はfor文です。aryName.lengthは、19行目で作成したString型の配列変数aryNameの要素の長さのことで、値は4です。そのため、条件式は「iが4より小さい」となります。
iが0の時の動きを説明します。25行目では、aryName[0]の値である「A君」という文字列と「は、」という文字列を表示しています。
次に、26行目のcheckPassメソッドを実行します。このメソッドには配列変数pointのインデックス0の値である85を引数に渡しています。このイメージは、図 10.3.1になります。
int型の配列変数pointの要素は全てint型の値です。checkPassメソッドはint型の値を受け取るメソッドですが、配列の要素も型が一致していれば受け取ることができます。
図 10.3.1 : point[0]の値を引数に受け渡す時
5~14行目がcheckPassメソッドです。26行目でcheckPassメソッドが呼び出されたので、checkPassメソッドの内部処理である7~12行目が実行されます。
このメソッドでは、仮引数である変数pointには85が代入されているので、8行目が実行され、「85点なので合格です。」と表示が行われます。また。12行目では「 – – – 」が表示されます。
メソッドの処理が終わり、24~27行目のfor文の1回分の内部処理も全て行われました。すると、変数iはインクリメントされ、値は1になり、条件式は「1 < 4」なので成立し、2回目の内部処理が始まります。同じように3回目、4回目と繰り返し、4回目の内部処理が終わった時、変数iはインクリメントされて4になるので、条件式は成立せずfor文の処理を終了します。
4回分繰り返したことで、生徒全員について同じ処理が行われることになります。
ポイント
・ 型が合っていれば、配列変数の要素も引数として受け渡すことができる。