【Java】基本的なメソッドのノート

#シンプルなメソッド定義#
必要最低限な定義は下記の通り。
ここでは`main`メソッドで`hello`メソッドを呼び出して使っている。

 - 呼び出し元：`main`メソッド
 - 呼び出し先：`hello`メソッド

↑こういう言い方をする時もある。

```java
public class Main{

	// メインメソッド定義
 	public static void main(String[] args){
		hello();
	}

	// helloメソッド定義
	public static void hello(){
		System.out.println("Hello World!");
	}
}
```

メソッド呼び出しを入れ子構造にすることももちろんできる。

```java
	// メインメソッド定義
	public static void main(String[] args){
		methodA();
	}

	// methodA定義
	public static void methodA(){
		System.out.println("this is methodA");
		methodB();
	}

	// methodB定義
	public static void methodB(){
		System.out.println("this is methodB");
	}
```
※class定義分は省略。

#引数の利用#
メソッド定義文で引数を設定することができる。
呼び出し先の方で記述される引数は**仮引数**というらしい。


```java
	// メインメソッド定義
	public static void main(String[] args){
		printName("tanaka");
		printName("suzuki");
		printName("satou");
	}

	// printNameメソッド定義
	public static void printName(String name){
		System.out.println( name + "さん、こんにちは");
	}

```

複数の引数を利用する場合、オーバーロードを利用することができる。
この場合、引数の個数・型・並び順が異なれば良い。
**シグネチャ**が異なれば良いとも言う。
※シグネチャ：メソッド名+引数の個数・型・並び順

```java
	// メインメソッド定義
	public static void main(String[] args){
		System.out.println("引数は２："+ov(10,20));
		System.out.println("引数は３："+ov(10,20,30));
		System.out.println("引数は４："+ov(10,20,30,40));
		System.out.println("引数は文字でも良い："+ov("takahashi"));
	}

	// ovメソッドの定義
	public static int ov(int p, int q){ //仮引数2
		int ans = p *q;
		return ans;
	}
	public static int ov(int p, int q, int r){ //仮引数3
		int ans = p * q - r;
		return ans;
	}
	public static int ov(int p, int q, int r, int s){ //仮引数4
		int ans = p * q - r * s;
		return ans;
	}
	public static String ov(String name){ //
		String ans = name;
		return ans;
	}
```

ちなみにmainメソッド自体も例外なくメソッドなので、ターミナルでコマンドライン引数を引数を打ってやれば、その情報をプログラムに追加することもできる。

例えばターミナルで

```
java Main 24歳 学生
```

と打ってやると、Main.javaファイルのmainメソッドで

```java
public static void main (String[] args)
```
このString型の配列`args`に`24歳`,`学生`という要素が追加される。
`args[0]==24歳`, `args[1]==学生`ということ 。


#戻り値の利用#
メソッド宣言文で戻り値を設定することで、mainメソッドに値を渡すことができる。
ここではint型の戻り値を`return`でメインメソッドに返すようにしている。

```java
	// mainメソッド定義
	public static void main(String[] args){
		System.out.println("100と200の積は"+ret(100,200));
	}

	//retメソッド定義
	public static int ret(int x, int y){
		int ans = x * y;
		return ans;
	}

```

#配列を用いる時の注意点#
普通に引数として配列をメソッドに渡す場合はこんな感じ。
ここではprintArrayメソッド定義時に引数の型を`int`->`int[]`とするだけで良い。

```java
	// mainメソッド定義
	// こっちで配列作成
	public static void main(String[] args){
		int[] array={10,20,30,40};
		printArray(array);
	}

	// printArrayメソッドの定義
	public static void printArray(int[] x){
		for(int value: x){
			System.out.println(value);
		}
	}
```

もちろん戻り値に配列を用いることもできる。
その場合は、makeArrayメソッド定義文の戻り値を`void` -> `int[]`にしてやる。
このプログラムはメインメソッドで指定した値を元に、makeArrayメソッドがその値に従って要素数を決め、配列を1,2,3,...と作る。それを戻り値としてメインメソッドに返している。

```java
	// mainメソッド定義
	public static void main(String[] args){
		int[] newArray= makeArray(5);
		for(int value: newArray){
			System.out.println(value);
		}
	}

	// makeArrayメソッドの定義
	// こっちで配列作成
	public static int[] makeArray(int size){
		int[] x = new int[size];
		for(int i=1; i<x.length; i++){
			x[i] = i;
		}
		return x;
	}

```

##値渡しと参照渡し##
普通に引数・戻り値をメソッド間でやりとりする場合は、それは値そのものをやりとりしていると言っていい(**値渡し, call by value**)。
ただ、配列を引数・戻り値としてメソッド間でやりとりする場合は、値そのものではなく、メモリ上のアドレスを渡している(**参照渡し, call by reference**)。
したがって、mainメソッドで作成した配列

```java
int[] array = {1,2,3,4} // mainメソッド
```
を引数として他のメソッドに渡した後、そのメソッド内で

```java
array[0]=10; // 呼び出し先メソッド
```
とか代入してしまうと、メモリ上の値が変わることになる。そのため、mainメソッドで

```java
System.out.println(array[0]);
```

とか打つと、返ってくる値は`1`ではなく`10`になる。
配列が`10,2,3,4`と書き換えられるということ。

###P.S###
値そのものではなく、メモリ上のアドレスが代入される変数は**参照型**と呼ばれる。配列型以外のものでは**クラス型**が参照型に含まれる。

##サンプルコード##
参照渡しで配列が書き換えられる例としてはこんなところか。

```java
	// mainメソッド定義
	public static void main(String[] args){
		int[] array={1,2,3,4};
		incArray(aray);
		for (int value: aray){
			System.out.println(value);
		}
	}

	// incArrayメソッド定義
	public static void incArray(int[] x){
		for(int i=0; i<x.length; i++){
			x[i]++;
		}
	}
```
返ってくる配列は`2,3,4,5`になっているはず。

#参考書籍#
[スッキリわかるJava入門第２版]
(https://www.amazon.co.jp/dp/B00MIM1KFC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
第5章 Pp.170-202, 336.