なぜメソッドが存在するのか
メソッドとは、名前を呼び出すたびに実行できる、名前の付いたコードのブロックです。同じ行を何度も書く代わりに、それらをメソッドの中に一度だけ書き、必要なだけ何度でも呼び出します。これによりプログラムは短く、読みやすく、そして格段に修正しやすくなります。ロジックを一箇所変えれば、呼び出している側すべてに更新が反映されるのです。
あなたはすでにメソッドを呼び出してきました。System.out.println(...) はメソッド呼び出しですし、list.size() もそうです。これからは自分自身のメソッドを書いていきます。
メソッドの宣言と呼び出し
メソッドの宣言は4つの部分から成ります。戻り値の型、名前、(引数のための)丸括弧の組、そして波括弧で囲まれた本体です。次に挙げるのは、役に立つ最小の例です。何かの処理を行い、何も返さないメソッドです。
static void printGreeting() の各部分を読んでみましょう。
static: オブジェクトを作らずにmainから直接呼び出せるようにします(詳細は後述)。void: このメソッドは値を返しません。printGreeting: 呼び出すときに使う名前です。(): 空の丸括弧は、入力を受け取らないことを意味します。
メソッドは、その名前に続けて丸括弧を書くことで呼び出します。main 内の2回の呼び出しは本体を2回実行するので、あいさつが2回出力されます。
値を返す
ほとんどのメソッドは何かを計算し、それを return で返します。名前の前にある戻り値の型は、どんな種類の値が出てくるかを示します。ここでは int です。
square(5) は 25 に評価され、変数に格納したり、出力したり、より大きな式の中で使ったりできます。メソッド呼び出しは、それが返す値の代わりとして機能するのです。return が実行された瞬間にメソッドは終了し、制御は呼び出し元へ戻ります。同じ経路上で return の後ろにあるコードは決して実行されません。
戻り値の型と返される値は一致していなければなりません。int と宣言しておきながら return "text"; を試みるのはコンパイルエラーです。コンパイラがこの取り決めを強制します。
void と戻り値の型
区別はシンプルです。呼び出し元が値を受け取る必要があるときは実際の戻り値の型を使い、メソッドが単に何かを行う(出力する、保存する、状態を更新する)だけのときは void を使います。
void logMessage(String msg) // 処理を行うが、何も返さない
int add(int a, int b) // 呼び出し元が使う値を計算する
初心者によくある間違いは、void メソッドの「結果」を使おうとすることです。
int x = printGreeting(); // コンパイルエラー: printGreeting() は void を返す
代入する値がないので、これはコンパイルできません。もし void メソッドの結果が欲しくなったら、それはそのメソッドが何かを返すべきだというサインです。
分岐して早期に返すメソッド
return は2箇所以上から行えます。答えが分かった時点で早期に返すほうが、すべてを else の中に入れ子にするよりも読みやすいことがよくあります。
各 return はただちに抜けるので、最初に一致した条件が勝ちます。ただし、値を返すメソッドを通るすべての経路が return で終わるようにしてください。どこかの分岐が何も返さずに通り抜けてしまう可能性があると、コンパイラは「missing return statement」と文句を言います。ここでの最後の return "F"; は、どれにも当てはまらなかった場合をカバーしています。
ここでのstaticの意味
上のメソッドがすべて static であることに気づいたかもしれません。static メソッドはどのオブジェクトでもなく、クラスそのものに属します。そのため(同じく static である)main は、名前で直接それを呼び出せます。static がなければ、メソッドはインスタンスに属し、呼び出すにはオブジェクトが必要になります。
今のところ、ロジックが main のそばにある小さなプログラムを書いている間は、補助的なメソッドを static にして、同じように呼び出せるようにしましょう。自分のクラスやオブジェクトを作り始めると、非静的(インスタンス)メソッドも書くようになります。それはクラスの章で扱います。
ローカル変数はメソッドの中にとどまる
メソッドの中で宣言された変数は、そこにしか存在しません。メソッドが実行されると作られ、戻ると消えます。呼び出し元がそれを見ることは決してありません。
total と i は完全に sumTo の中だけで生きています。メソッドの外に出る唯一のものは、あなたが return する値です。この隔離は利点です。各メソッドは自己完結した単位であり、その一時変数が外に漏れたり、ほかの場所の名前と衝突したりする心配をせずに考えることができます。
次へ: メソッドの引数
ここで扱ったメソッドはどれも、入力を受け取らないか、1つの値を受け取るかのどちらかでした。本当の力は、データを中へ渡すことから生まれます。そしてJavaには、引数がどのように渡されるか、オブジェクトとプリミティブで何が違うか、引数にデフォルトのような代替値をどう与えるかについて、具体的なルールがあります。それが次のページの内容です。
よくある質問
Javaのメソッドとは何ですか?
メソッドとは、名前を呼び出すことで必要なときに実行できる、名前の付いたコードのブロックです。1つの処理を一箇所にまとめておけるので、同じ行を繰り返す代わりに再利用できます。メソッドは入力(引数)を受け取って結果(戻り値)を返すことも、処理だけ行って何も返さない(void)こともできます。
Javaでメソッドを作成して呼び出すにはどうすればよいですか?
戻り値の型、名前、丸括弧を付けて宣言します: static int square(int n) { return n * n; }。次に、丸括弧の中に引数を入れて名前で呼び出します: int result = square(5);。何も返さないメソッドは void を使い、printGreeting(); のように単独の文として呼び出します。
Javaのメソッドでvoidは何を意味しますか?
void はメソッドが値を返さないことを意味します。処理(たとえば出力)を行いますが、呼び出し元には何も渡しません。void メソッドの結果を変数に代入することはできません。呼び出し元が使う値を生み出すべきメソッドなら、int や String のような実際の戻り値の型を与え、代わりに return を使ってください。