メソッド(基礎編)でシンプルなメソッドの使い方について説明しました。
今回は少しステップアップして引数のあるメソッドについて説明します。
メソッド(基礎編)に関してはこちらを参考にしてください。
引数のあるメソッド
- void メソッド名 ( 型 変数名 ) {
- 命令文
- }
メソッド(基礎編)では呼び出し側からメソッドを呼び出して、処理を依頼するときになにも無しで渡していました。
今度はなんらかの数字を呼び出すと同時に渡します。
そのときにこの引数をどのようにして利用するかというと、メソッドの処理の中にこの数字を使わないと次には進まないような仕様を記述します。
つまり呼び出し側からの「この数字を使ってなんらかの処理をしてください」というリクエストになります。
呼び出し側がメソッドに引数を渡して、メソッド内ではその引数を利用してなんらかの処理をして呼び出し側に戻る、という流れになります。
書き方はメソッド(基礎編)では void メソッド名 ( )の( )の中身は空でした。
今度は void メソッド名 ( 型 変数名 ) で渡す引数のことを記述します。記述は変数の宣言と同じ書き方になります。
引数のあるメソッドの文法
- 引数のあるメソッドの呼び出し
- メソッド名 (引数) ;
- 引数は複数指定できる
- 型1 引数1,型2 引数2,・・・
- 引数の数と型は、呼び出す側と受け取る側で一致する必要がある
- 受け取った引数はメソッド内のみ使用
メソッド名 ( )⇐ の中に引数を指定します。引数は ,(カンマ)で区切って複数指定することができます。
引数を渡す側と受け取る側で数と型が異なるとエラーになってしまいます。(int 型と double 型の相違など)
受け取った引数がどのブロック内で通用するかを気を付けないとエラーとなってしまいます。
変数のスコープに関してはこちらを参考にしてください。
引数のあるメソッドの書き方
メソッド(基礎編)で利用したShowMessage を改良します。
class InputRansu2 のプログラムは乱数を利用してユーザーに正解の数を当ててもらうというプログラムでした。キーボードからユーザーに好きな数字を入力してもらい、正解の数より大きいか小さいかのヒントを表示し正解の数字を当ててもらうというプログラムです。
その際、ユーザーが入力した値が10より大きい場合にエラーメッセージを出力しました。
今回は class InputRansu3 プログラムを作成し、このエラーメッセージを引数を利用したものに改良したいと思います。 class InputRansu3 プログラムでは、そのエラーメッセージに証拠として、ユーザーがどのような数字を入力したのかを追加してフィードバックとして表示します。
つまり警告メッセージにユーザーが前回入力した値も併せて表示させるというものです。
元の乱数プログラムはこちらを参考にしてください。
メソッドを利用した乱数プログラムはこちらを参考にしてください。
▶プログラムコード
- import java . io . * ;
- class InputRansu3 {
- public static void main ( String [ ] args ) throws IOException {
- BufferedReader br = new BufferedReader ( new InputStreamReader ( System . in ) ) ;
- int ainput = -2 ; // ainput : 入力された値
- int answer = ( int ) ( Math . random ( ) * 10 ) ; // 正解の値
- ShowMessage ( ainput ) ; // メソッドの呼び出し
- while ( 1 > 0 ) {
- System . out . print ( ” 0~9を入力 =” ) ;
- String aString = br . readLine ( ) ;
- ainput = Integer . parseInt ( aString ) ;
- if ( ainput > 9 ) { // エラーメッセージの条件追加
- ShowMessage ( ainput ) ; // メソッドの呼び出し
- }
- else {
- if ( ainput < answer ) {
- System . out . print ( ” 正解より小さいです “ ) ;
- } else if { ( ainput > answer ) {
- System . out . print ( ” 正解より大きいです “ ) ;
- } else {
- System . out . print ( ” 正解です!おめでとうございます! “ ) ;
- break ;
- }
- }
- }
- }
- static void ShowMessage ( int a ) {
- System . out . print ( ” 正解の数を当てましょう。0~9までの数字を1つ入力してください。あなたが入力した数字は “ + a ) ;
- }
- }
メソッドの中身の改造
- static void ShowMessage ( int a ) {
- System . out . print ( ” 正解の数を当てましょう。0~9までの数字を1つ入力してください。あなたが入力した数字は “ + a ) ;
- }
ShowMessage ( int a ) ⇐ 引数を1つ受け取ります。変数の名前はなんでも大丈夫です。ここでは a とします。
呼び出し側から引数を受け取ってその引数の数字もメッセージとして表示させます。
「正解の数を当てましょう。0~9までの数字を1つ入力してください。」の後に前回入力した数字を表示させます。
「あなたが入力した数字は “ + a 」を命令文に追加します。
つまりメソッドとしては呼び出されるときは必ずなんらかの引数と一緒に来ます。
そしてその引数をそのままメッセージの後ろにつける。という形になります。
呼び出し側の改造1
- BufferedReader br = new BufferedReader ( new InputStreamReader ( System . in ) ) ;
- int ainput = -2 ; // ainput : 入力された値
- int answer = ( int ) ( Math . random ( ) * 10 ) ; // 正解の値
- ShowMessage ( ainput ) ; // メソッドの呼び出し
7行目 ShowMessage ( ainput ) ⇐ メソッド側に渡す引数は ainput です。( )の中にメソッドに渡す引数を指定します。変数の宣言は5行目で済んでいます。
ここでプログラムの流れを考えてみてみましょう。
1回目の入力は何も無い状態です。そのタイミングで何を出力するかということです。
空の引数をメソッドに渡してしまうとエラーになってしまいます。なのでこの ainput は初期化しなければなりません。この ainput に十分小さい値を用意します。1回目のメッセージを表示するときはなんらかの値が必要なので、ダミーとして数字を与えておく必要があります。
なので最初の1回のみ ShowMwssage ( ainput ) に-2という数字を渡しておきます。
2回目以降はユーザーから必ずなんらかの数字を受け取るので、2回目以降は問題ありません。
初回はユーザーからの入力がなく比較のしようがないので、初回のみの数字を代入しておきます。
呼び出し側の改造2
- if ( ainput > 9 ) { // エラーメッセージの条件追加
- ShowMessage ( ainput ) ; // メソッドの呼び出し
- }
ShowMessage ( ainput )
もしユーザーから9より大きい数字を入力されたら、その数字 ainput をそのままメソッドに渡します。そしてメソッドで処理された命令文を呼び出します。
これは0~9までの数字ではないのでもう一度入力してもらうためのメッセージです。
実行結果は
正解の数を当てましょう。0~9までの数字を1つ入力してください。あなたが入力した数字は -2
0~9を入力 =
となります。
初回の出力時には「あなたが入力した数字は-2」が表示されます。もう少し複雑なメッセージも表示できるかもしれませんが、今回はダミーの-2の出力としておきます。
次からはユーザーが入力した数字によって出力されるメッセージが変わります。
まとめ
今回のプログラムで少しややこしかったのは初期化する部分だと思います。ここで何もしないと、最初1回目の変数 ainput は 空のままです。この空の ainput を引数として渡してしまうとエラーが起きてしまうのでこれを避けるために十分小さい数字をダミーとして代入しておきます。次からはユーザーからの入力を引数として渡すことができるのであくまでも最初の1回の時点の引数を指定するということです。
今回のポイントは引数です。ユーザーから入力された数字を引数としてメッセージを出力するメソッドに一緒に渡して、メソッドはその数字を受け取って表示してくれる。ということがメソッドのポイントとなります。
乱数
メソッド基礎
変数のスコープ