これまでは、すべての処理を main メソッドの中に書いてきました。処理が長くなると読みにくくなり、同じ処理を何度も書くことにもなります。処理に名前を付けてまとめたものが メソッド です。この章では、メソッドの作り方と呼び出し方、引数と戻り値、そしてメソッドの説明を書く Javadoc コメントを学びます。
この章で学ぶこと
- メソッドの定義と呼び出し
- 引数で値を渡す、戻り値で結果を受け取る(
return・void) -
staticなメソッドと、クラス名.メソッド名()の呼び方 - 変数が使える範囲(スコープ)
- Javadoc コメント(
@param・@return)
7.1 この章で作るもの
この章では、ch07 パッケージに2つのクラスを作ります。章の最後には、Method を実行するとコンソールに次のように表示されるようになります。
---------------
雷禅 海皇(26歳)
院照 心愛(27歳)
林檎 星飛(24歳)
---------------
年齢の合計:77
27 は正しい年齢です
100 は正しくない年齢です
| ファイル | 作業 | 内容 |
|---|---|---|
ch07/Method.java |
新規 | メソッドを定義して呼び出す練習用のクラス(main あり) |
ch07/AgeChecker.java |
新規 | 年齢を調べるメソッドだけを持つクラス(main なし) |
7.2 メソッドを作って呼び出す
-
srcを右クリックし、新規 → パッケージ でch07パッケージを作ります。 -
ch07パッケージを右クリックし、新規 → クラス で、名前Method、「public static void main(String[] args)」に チェックを入れて クラスを作ります。 -
// TODOの行を消し、緑の行を入力します。mainメソッドの 外(mainの}の後ろ、クラスの}の前)に、新しいメソッドprintLineを書きます。ch07/Method.javapackage ch07; public class Method { public static void main(String[] args) { printLine(); System.out.println("雷禅 海皇(26歳)"); printLine(); } static void printLine() { System.out.println("---------------"); } } -
保存して実行します。
コンソール--------------- 雷禅 海皇(26歳) ---------------
printLine が、自分で作ったメソッドです。main メソッドから printLine(); と書いて 呼び出す と、printLine の { } の中の処理が行われ、終わると呼び出した場所の次の文に戻ります。
メソッドの形
static 戻り値の型 メソッド名(引数) {
処理
}
| 部分 |
printLine の例 |
意味 |
|---|---|---|
static |
static |
main メソッドから直接呼び出せるメソッドにする印。この章では、作るメソッドにすべて付ける(static の無いメソッドは第8章、意味は第9章) |
| 戻り値の型 | void |
メソッドが返す結果の型。何も返さないときは void と書く(7.4) |
| メソッド名 | printLine |
変数名と同じく、小文字で始めるキャメルケース。「何をするか」が分かる動詞で始める |
| 引数 | (なし) | メソッドに渡す値。無いときも ( ) は書く(7.3) |
メソッドは、クラスの { } の中に、main メソッドと並べて書きます。main メソッドの中には書けません。クラスの中でのメソッドの順番は自由で、main の後ろに書いても main から呼べます。
7.3 引数
「雷禅 海皇(26歳)」の表示を、名前と年齢を変えて3回行いたいとします。名前と年齢をメソッドに 渡せる ようにしたものが 引数(ひきすう)です。
-
Method.javaを、緑の行のように書き換え・書き足します。ch07/Method.javapackage ch07; public class Method { public static void main(String[] args) { printLine(); printEmployee("雷禅 海皇", 26); printEmployee("院照 心愛", 27); printEmployee("林檎 星飛", 24); printLine(); } static void printLine() { System.out.println("---------------"); } static void printEmployee(String name, int age) { System.out.println(name + "(" + age + "歳)"); } } -
保存して実行します。
コンソール--------------- 雷禅 海皇(26歳) 院照 心愛(27歳) 林檎 星飛(24歳) ---------------
printEmployee(String name, int age) の ( ) の中が引数です。変数の宣言と同じように 型 名前 の形で書き、2つ以上あるときは , で区切ります。呼び出す側は、printEmployee("雷禅 海皇", 26) のように、同じ順番・同じ型で値を渡します。渡した値は、メソッドの中で name・age という変数として使えます。
【ご注意】引数の数と型は、定義と呼び出しで合わせる
printEmployee("雷禅 海皇") のように数が足りなかったり、printEmployee(26, "雷禅 海皇") のように順番が違ったりすると、「型 Method のメソッド printEmployee(String, int) は引数 (String) に適用できません」のようなエラーになります。
7.4 戻り値
メソッドは、処理の結果を呼び出した側に 返す ことができます。返す値を 戻り値 といい、return で返します。戻り値があるメソッドは、void の代わりに戻り値の型を書きます。
-
Method.javaに、年齢の合計を返すメソッドsumを書き足し、mainから呼びます。ch07/Method.javapackage ch07; public class Method { public static void main(String[] args) { printLine(); printEmployee("雷禅 海皇", 26); printEmployee("院照 心愛", 27); printEmployee("林檎 星飛", 24); printLine(); int[] ages = {26, 27, 24}; int total = sum(ages); System.out.println("年齢の合計:" + total); } static void printLine() { System.out.println("---------------"); } static void printEmployee(String name, int age) { System.out.println(name + "(" + age + "歳)"); } static int sum(int[] ages) { int total = 0; for (int a : ages) { total += a; } return total; } } -
保存して実行します。最後に
年齢の合計:77と表示されます。コンソール--------------- 雷禅 海皇(26歳) 院照 心愛(27歳) 林檎 星飛(24歳) --------------- 年齢の合計:77
| コード | 意味 |
|---|---|
static int sum(int[] ages) |
int の配列を受け取り、int を返すメソッド |
return total; |
total の値を返して、メソッドを終える。return の後ろの文は実行されない |
int total = sum(ages); |
sum を呼び出し、返ってきた値を total に入れる。呼び出しの式は、戻り値の型の値として使える |
戻り値の型を int と書いたら、必ず int の値を return します。return を書き忘れると、「このメソッドは型 int の結果を戻す必要があります」というエラーになります。void のメソッドには return を書きません(途中で終えたいときだけ、値を付けずに return; と書けます)。
【知識メモ】これまで使ってきたメソッド
System.out.println(…) は、引数を受け取って表示する void のメソッドです。第5章の name.equals(…) は boolean を返し、name.length() は int を返すメソッドでした。自分で作るメソッドも、これらと同じ仕組みです。
7.5 別のクラスのメソッドを呼ぶ
メソッドは、別のクラスに書いて呼び出すこともできます。「年齢が正しい範囲か」を調べるメソッドを、AgeChecker という別のクラスに作ってみましょう。このクラスには main メソッドを付けません。
-
ch07パッケージを右クリックし、新規 → クラス で、名前AgeCheckerと入力します。今回は「public static void main(String[] args)」の チェックを入れずに、「完了」をクリックします。 -
開いたエディターに、緑の行を入力します。
ch07/AgeChecker.javapackage ch07; public class AgeChecker { public static boolean isValid(int age) { return age >= 15 && age <= 99; } }return age >= 15 && age <= 99;は、条件式の結果(trueかfalse)をそのまま返しています。 -
保存します。
-
Method.javaのmainメソッドの最後に、緑の行を書き足します。ch07/Method.java(main メソッドの最後)int[] ages = {26, 27, 24}; int total = sum(ages); System.out.println("年齢の合計:" + total); check(27); check(100); } -
Method.javaの最後(sumメソッドの後ろ)に、checkメソッドを書き足します。ch07/Method.java(クラスの最後)static int sum(int[] ages) { int total = 0; for (int a : ages) { total += a; } return total; } static void check(int age) { if (AgeChecker.isValid(age)) { System.out.println(age + " は正しい年齢です"); } else { System.out.println(age + " は正しくない年齢です"); } } } -
保存して、
Method.javaを実行します(AgeChecker.javaにはmainが無いので実行できません)。コンソール(後半)年齢の合計:77 27 は正しい年齢です 100 は正しくない年齢です
別のクラスの static なメソッドは、クラス名.メソッド名(引数) の形で呼び出します。AgeChecker.isValid(age) がそれです。同じクラスの中のメソッドは、sum(ages) のようにクラス名を付けずに呼べます。
呼ばれる側のメソッドには public を付けています。public は「別のクラスから使ってよい」という印です(同じパッケージの中なら無くても呼べますが、この教材では付けます。第9章で詳しく学びます)。
【知識メモ】Java が用意しているメソッドも同じ形
Java には、最初から多くのクラスとメソッドが用意されています。たとえば、文字列を数に変える Integer.parseInt("26")(第11章)は、Integer クラスの static なメソッド parseInt を呼び出しています。Spring入門の SpringApplication.run(…) も同じ形です。クラス名.メソッド名(…) と書いてあったら、「そのクラスの static なメソッドを呼んでいる」と読んでください。
7.6 変数が使える範囲
メソッドの中で宣言した変数(引数も含む)は、そのメソッドの中でだけ使えます。sum メソッドの total と、main メソッドの total は、名前が同じでも別の変数です。変数が使える範囲を スコープ といいます。
- メソッドの中で宣言した変数は、そのメソッドの
{}の中でだけ使える -
if文やfor文のブロックの中で宣言した変数は、そのブロックの中でだけ使える(第6章のfor文のi) - 別のメソッドに値を渡したいときは、引数で渡す。結果を受け取りたいときは、戻り値で受け取る
どのメソッドからも使える変数(フィールド)は、第8章で学びます。
7.7 Javadoc コメント
メソッドの上には、/** … */ の形の Javadoc コメント で、そのメソッドの説明を書きます(第3章 3.6)。引数は @param 引数名 説明、戻り値は @return 説明 で書きます。
-
AgeChecker.javaのisValidメソッドの上に、緑の行を書き足します。ch07/AgeChecker.javapackage ch07; /** 社員の年齢が入力できる範囲かを調べる */ public class AgeChecker { /** 登録や変更の前に、年齢が 15 以上 99 以下かを確かめる * @param age 調べる年齢 * @return 範囲内なら true */ public static boolean isValid(int age) { return age >= 15 && age <= 99; } } -
保存します。コメントなので、動きは変わりません。
-
Method.javaで、AgeChecker.isValidの上にマウスを合わせてみてください。書いた Javadoc コメントが、説明として表示されます。
Javadoc コメントは、Eclipse が説明の表示に使うほか、クラスの一覧表(API ドキュメント)を作るときにも使われます。Spring入門では、Controller のメソッドに次のような Javadoc コメントを書きます。
/** 社員一覧画面を表示
* 社員IDの順に社員を取り出して表示
* @param model 表示する社員情報
* @return 社員一覧画面 */
【便利な使い方】Javadoc の書き方
- 1行目に、「どんな時に」「何のために」行う処理かを書く。何をしているかはコードを見れば分かるので、短くてよい
-
@paramには、その引数に「何が」入るかを書く。@returnには、「何を」返すかを書く - メソッドの上で
/**と入力して Enter キーを押すと、Eclipse が@paramと@returnの行を自動で作ってくれる。この教材では、行数を抑えるために、1行目を/**の後ろに続けて書き、最後の行の末尾で*/を閉じている
7.8 うまくいかないときは
| 症状 | 考えられる原因と対処 |
|---|---|
| 「メソッド printLine() は型 Method で未定義です」 | メソッド名の打ち間違いか、メソッドをクラスの外に書いています。メソッドはクラスの { } の中、main メソッドの外に書きます。 |
| 「型 Method のメソッド printEmployee(String, int) は引数 (…) に適用できません」 | 呼び出すときの引数の数・順番・型が、定義と合っていません。定義の ( ) の中と見比べてください。 |
| 「このメソッドは型 int の結果を戻す必要があります」 | 戻り値の型を書いたのに return がありません。return 値; を書いてください。 |
| 「void メソッドは値を戻すことができません」 |
void のメソッドで return 値; と書いています。値を返すなら、戻り値の型を書いてください。 |
| 「total を変数に解決できません」 | 別のメソッドで宣言した変数を使っています。変数はメソッドの中でだけ使えます。引数か戻り値で受け渡してください。 |
AgeChecker.java を実行しようとすると「選択にはメイン型が含まれていません」と表示される |
AgeChecker には main が無いので、実行できません。Method.java を実行してください。 |
ほかのコンパイルエラーは、付録A「よくあるコンパイルエラー」 も参考にしてください。
7.9 まとめと確認問題
まとめ
-
メソッド は、処理に名前を付けてまとめたもの。
static 戻り値の型 メソッド名(引数) { }の形で、クラスの中にmainと並べて書く -
引数 は、呼び出すときに渡す値。定義では
型 名前、呼び出しでは同じ順番・型で値を書く -
戻り値 は、
return 値;で返す結果。何も返さないメソッドはvoid - 別のクラスの
staticなメソッドはクラス名.メソッド名(引数)で呼ぶ。別のクラスから呼ぶメソッドにはpublicを付ける - メソッドの中で宣言した変数は、そのメソッドの中でだけ使える(スコープ)
- メソッドの説明は Javadoc コメント(
/** */)に、@param・@returnで書く。「何のために」を書く
この章で使った書き方は、付録B「文法早見表」の「メソッドとクラス」 にまとめています。
確認問題
問1 2つの int の値を受け取って、大きいほうを返すメソッド max を書いてください。
解答を見る
static int max(int a, int b) { if (a > b) { return a; } else { return b; } }
問2 static void printLine() の void は、何を表していますか。
解答を見る
戻り値が無い(値を返さない)メソッドであることを表しています。
問3 AgeChecker クラスの static なメソッド isValid を、別のクラスから呼び出す書き方を答えてください。引数は 27 とします。
解答を見る
AgeChecker.isValid(27)
問4 次のコードはエラーになります。理由を答えてください。static int sum(int[] ages) { int total = 0; for (int a : ages) { total += a; } }
解答を見る
戻り値の型が int なのに、return がありません。最後に return total; を書きます。
問5 Javadoc コメントで、引数と戻り値の説明を書くときに使う印は何ですか。
解答を見る
引数は @param 引数名 説明、戻り値は @return 説明 です。
