メソッドを解説してみた

## 初めに
- この記事を開いてくれてありがとうございます．
- 教え方が下手な自分がなんとかまとめたものなので，多めに見てください．
- 要望，指摘あればどんどん書いてください．
- それでは，長らくのお付き合いお願いします．

## そもそもメソッドとは
#### 10人のテストの平均点、最高点、最低点を表示してください。
```java=Question_11.java
package Question_04;

public class Question_11 {
	public static void main(String[] args) {
		int[] english = {98,80,78,85,65,86,90,94,70,92};
		int high = english[0];
		int low = english[0];
		int avg = 0;
		for(int i = 0;i < english.length;i++) {
			if(high <= english[i]) {
				high = english[i];
			}else if(low >= english[i]){
				low = english[i];
			}
			avg+=english[i];
		}
		avg/=english.length;
		System.out.println("平均点："+avg+"点");
		System.out.println("最高点："+high+"点");
		System.out.println("最低点："+low+"点");
	}
}

```
- 上記のブログラムは以下のようなmainメソッド1つのメソッド構成になっています．
- このプログラムではmainのメソッドに **「変数宣言」**，**「計算部分」**，**「結果出力」** の動作すべてが書き込まれているということになります．
1. **変数宣言(mainメソッド)**：テストの点数を格納
2. **計算部分**：テストの点数を比較
3. **結果出力**：テストの点数を表示
- mainメソッド1つでもいいのですが，もし，大きなプログラムを書く場合に，数千行という行数になってしまい管理が**とても大変**です．
- そこで，**「変数宣言」**，**「計算部分」**，**「結果出力」** を分けようということで，メソッドという考え方を使用します．

![](https://i.imgur.com/b7WECu1.png)

## どのような基準でメソッドを分けるのか．
- 「行数が増えると大変だからメソッドを分けるのか」という漠然とした理解を得られたところで，どのように分けていくか解説します．
- まず，プログラムを大きく分けると以下のように分けられます．

#### 変数宣言部分
- 変数宣言部分では，使用する変数に値を格納している動作です．

```java=Question_11.java
int[] english = {98,80,78,85,65,86,90,94,70,92};//englishに10人分の点数を格納
int high = english[0];//最高点を比較するための変数を宣言
int low = english[0];//最低点を比較するための変数を宣言
int avg = 0;//平均点を算出するための変数を宣言
```
#### 計算部分
- 計算部分では，点数の比較を行い，最高点，最低点，平均点を算出します．

```java=Question_11.java
for(int i = 0;i < english.length;i++) {//10人分の点数を比較するために10回（人数分）ループ
    if(high <= english[i]) {//最高点を選別
        high = english[i];
    }else if(low >= english[i]){//最低点を選別
        low = english[i];
    }
    avg+=english[i];//平均点を算出するために点数の合計を格納
}
```
#### 結果出力部分
- 結果出力部分では，問題文であるように，「表示してください」の動作を行っています．

```java=Question_11.java
System.out.println("平均点："+avg+"点");
System.out.println("最高点："+high+"点");
System.out.println("最低点："+low+"点");
```

## 実際どのようなプログラムになるのか
```java=Question_11.java
package Question_05;

public class Test {
	public static void main(String[] args) {
		int[] english = {98,80,78,85,65,86,90,94,70,92};
		int highscore = english[0];
		int lowscore = english[0];
		int avgscore = 0;
		int highend = high(english,highscore);
		int lowend = low(english,lowscore);
		int avgend = avg(english,avgscore);
		display(highend,lowend,avgend);
	}
	public static int high(int[] english,int highscore) {
		for(int i = 0;i < english.length;i++) {
			if(highscore <= english[i]) {
				highscore = english[i];
			}
		}
		return highscore;
	}
	public static int low(int[] english,int lowscore) {
		for(int i = 0;i < english.length;i++) {
			if(lowscore >= english[i]){
				lowscore = english[i];
			}
		}
		return lowscore;
	}
	public static int avg(int[] english,int avgscore) {
		for(int i = 0;i < english.length;i++) {
			avgscore+=english[i];
		}
		avgscore/=english.length;
		return avgscore;
	}
	public static void display(int highend,int lowend,int avgend) {
		System.out.println("平均点："+avgend+"点");
		System.out.println("最高点："+highend+"点");
		System.out.println("最低点："+lowend+"点");
	}

}
```
![](https://i.imgur.com/lziZBY5.png)
- このように分けることができます．

## メソッドを分けることができるのは分かったが，引数や，戻り値って何？
- メソッドを分けたことによって変数宣言したものは，メソッド内でしか，呼び出すことができません．
    - 例：mainメソッドで```int x = 0;```とコードを書いても，highメソッドで```System.out.println(x);```のように使用してもxの値を表示することはできません．
    - つまり，変数宣言してもメソッド内でしか使用することができない．
- なので，引数や，戻り値を使って値を呼び出します．

![](https://i.imgur.com/XVa5LOg.png)
## 引数や，戻り値を使う理由
- 変数宣言（mainメソッド）で宣言した点数格納用のenglishや，点数を比較するためのhighscoreなどの変数は計算部分で使用するために宣言したものです．
- なので，引数として，これらの変数を参照します．そして，計算結果を戻り値として，変数宣言に戻します．こうすることで，mainメソッドで計算結果を扱うことができます．
- 同様に，出力結果を出力するためには，計算結果が必要です．
- なので，引数として，計算結果を先ほど戻り値として返した変数宣言から参照します．
- これらの動作によって出力結果を出力することができます．

## 最後に
- お付き合いいただきありがとうございました．
- 質問や要望があればどんどん書いてください．