#メソッドの作成
##メソッドの定義
Javaのプログラムはmainの中を上から順番に実行していきます。mainの中にすべての命令を記述していくと、命令が長くなったり、同じようなコードが出てきたり、非効率です。そこでよく使う命令を一つにまとめる構文があります。複数の命令をまとめた元をメソッドと言います。
例えば、足し算の結果を出力するプログラムを考えてみます。次のような命令があったとします。
System.out.println("足し算の結果は");
System.out.println(2+3);
System.out.println("です。");
ここでは3つの出力命令を利用しています。この3つの命令をまとめるには{}(中括弧)を利用します。{から}までをブロックと呼び、命令の範囲を指定することができます。mainメソッドの外側に命令を移動し、ブロックで囲んでみましょう。
{
System.out.println("足し算の結果は");
System.out.println(2+3);
System.out.println("です。");
}
しかし、このままだとこの3つの命令をどのように呼び出せばよいか分かりません。そこでこの3つの命令をまとめたものに名前を付けます。足し算をしているのでaddと名前を付けましょう。
add {
System.out.println("足し算の結果は");
System.out.println(2+3);
System.out.println("です。");
}
これがメソッドの原型になります。ただし、このままではコンパイルが通りません。よく考えるとこのaddメソッドは2+3の結果しか表示できません。例えば電卓で2+3の結果しか表示しないものがあった場合、これは使い物になりません。そこでこのメソッドを使う利用者がどのような足し算を行うか決めることができるようにしてみましょう。メソッド実行時に利用者が与える情報を引数(ひきすう)といい、次のように定義します。
add(int a, int b) {
System.out.println("足し算の結果は");
System.out.println(a+b);
System.out.println("です。");
}
引数はint aのように、「型 変数名」の形式で定義します。この時aのような変数名を仮引数と呼びます。また,(カンマ)で区切ることで複数の引数を定義することができます。メソッドを定義する場合、コンパイルエラーにならないためにはもう少し情報がひつようですが、一旦、完成させてしまいましょう。
static void add(int a, int b) {
System.out.println("足し算の結果は");
System.out.println(a+b);
System.out.println("です。");
}
staticの意味は別の回で解説します。voidについては後に解説します。
よくある間違いでmainメソッドの中に、メソッドを定義してしまうことがあります。今回作成したaddメソッドとmainメソッドは同列ですのでmaimメソッドの中には記述しないようにしましょう。
//【間違い】
public class HelloWorld {
static public void main(String [] args) {
static void add(int a, int b) {
System.out.println("足し算の結果は");
System.out.println(a+b);
System.out.println("です。");
}
}
}
//【正しい】
public class HelloWorld {
static public void main(String [] args) {
}
static void add(int a, int b) {
System.out.println("足し算の結果は");
System.out.println(a+b);
System.out.println("です。");
}
}
##メソッドの利用
作成した、メソッドを利用するにはmainメソッド内で次のように記述します。
static public void main(String [] args) {
add(1,2);
}
メソッドは何回でも呼び出すことができます。
static public void main(String [] args) {
add(1,2);
add(3,5);
add(10,20);
}
```
add(1,2)と記述した時に、1,2がそれぞれ仮引数のa,bに代入されて処理が実行されます。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/22658/8530638e-176f-bf29-d7f3-5ecc4d121306.png)
このときの、1や2を実引数といいます。さてこのaddメソッドは、足した結果を出力するだけのプログラムになります。mainメソッド内で足した結果を元にさらに演算など処理を行いたい場合は、addメソッドから足した結果をmainメソッドに戻す必要があります。このようにメソッドを利用したところに処理の結果を戻す仕組みを「戻り値」といいます。戻り値を示すにはreturnというキーワードを利用します。次のようにaddメソッドを書き換えてみます。
```java
static void add(int a, int b) {
return a+b;
}
```
するとエラーになります。エラーメッセージは「Void methods cannot return a value」というものです。戻り値を利用する場合は、戻り値の型を示さなければなりません。今は足した結果はint型の整数ですから、int型の値が返却されることを示す必要があります。戻り値の型をint型と示すには、次のように記述します。
```java
static int add(int a, int b) {
return a+b;
}
```
以前、voidと記述していたところが、intに変わっています。メソッド名の前にどの型の値が返却されるかを記述するのです。voidは特別な型で戻り値が無い場合に利用します。戻り値を指定すると、addメソッドを利用しているmainメソッド内で、結果を受けることができるようになります。そのためには変数の代入と同じように、左辺と右辺の型を合わせます。
```java
static public void main(String [] args) {
int result = add(3,5);
System.out.println("足し算の結果=" + result);
}
```
###応用:可変長引数
引数には可変長引数と呼ばれる仕組みがあります。addメソッドでは2つの値の足し算を行いましたが、複数の値の足し算を行いたいときなど、引数の数が決まらない場合、可変長引数を利用します。可変長引数は他の引数とともに利用できますが、引数のリストの最後に記述する必要があります。可変長引数で定義した仮引数は配列として扱うことができます。
```java
public class HelloWorld {
static public void main(String [] args) {
int result = add(3,5);
int result2 = add(3,5,7,9,9);
System.out.println("足し算の結果=" + result);
System.out.println("足し算の結果=" + result2);
}
static int add(int ...nums) {
int sum = 0;
for (int num : nums) {
sum += num;
}
return sum;
}
}
```