Java 戻り値を試してみる

##アジェンダ##

- はじめに
- 投稿主が理解しているレベル
- コードでつかってみる
- 処理手順で説明する
- （結論）戻り値とはつまり、どういうものか

##はじめに##
　この記事は、プログラミング初学者であるわたしが、説明文を読んでも全く理解が及ばなかった戻り値についてやっと理解したつもりになっていたので、同じようにさっぱりわからないよ！　という方のために説明させていただく記事でございます。書籍を読んで勉強しているわけではないので、投稿主の基礎知識は低いです。（※コメントで指摘をしていただきましたので加筆修正をしています）
　認識として間違っている点につきましては、コメントで教えていただけると幸いです。また、例え話がわからない！　という方ははじめに謝罪させていただきます。申し訳ございません。
　
##投稿主が理解しているレベル##
　わたしが現在Javaを学習する中で理解している範囲でございます。つまり、これ以外は全くわからないので、もし応用表現とかあってもわかっておりません。（という言い訳）

- 基本的な型
- メソッドの意味
- 基本変数の種類
- 基本演算子
- 基本的な条件分岐
- 繰り返し処理
- 配列


##コードでつかってみる##
　まずは、コードでの説明をさせていただきます。
今回はこんなコードで説明してみようと思います。

```Java:qiita.jv
public class ReturnValue{
   public static void main(String[] arg){
      int a = 1;
      int b = 5;
      int c = a*b;

      System.out.println(a + "x" + b + "=" + c);
   }
}
```

このコードの実行結果は

1x5=5

となります。
現時点でこのプログラムは問題なく実行できてしまいます。
このプログラムに引数と戻り値を導入して同じ結果を出したいと仮定して、プログラムをみてみましょう。

まずは引数を設定するためにmainメソッドとは異なるメソッドを作成します。
ここではbackメソッドとしましょう。そして、計算式(a*b)を引数で外で処理させたいので、変数cの値にbackメソッドを指定します。

```Java:qiita.jv(2)
public class ReturnValue{
   public static void main(String[] arg){
      int a = 1;
      int b = 5;
      int c = back();

      System.out.println(a + "x" + b + "=" + c);
   }
   static int back(){

   }
}
```

変数intを用いているため、int型でbackメソッドを作成しました。

実行結果　
1x5=5
を出すためには、backメソッド内で変数を再定義し、計算式を記述する必要があります。

```Java:qiita.jv(3)
public class ReturnValue{
   public static void main(String[] arg){
      int a = 1;
      int b = 5;
      int c = back();
      System.out.println(a + "x" + b + "=" + c);
   }

   static int back(){
   int a = 1;
   int b = 5;
   int c = a*b;
   }
}

```

backメソッドで処理させようとするとこうなります。しかし、同じ記述を別メソッドで記載している上に、int型は戻り値を設定しなければならないためそもそもerrorとなります。処理結果を返すために戻り値に返すためのreturnを記述。さらに、引数を用いて変数aとbの値をbackメソッドに引き継ぎたいと思います。そうすると、


```Java:qiita.jv(4)
public class ReturnValue{
   public static void main(String[] arg){
      int a = 1;
      int b = 5;
      int c = back(a,b);
      System.out.println(a + "x" + b + "=" + c);
   }

   static int back(int x,int y){
   int a =x*y;
   return(a);
   }
}
```

　こうなります。
まず、引き継ぎたい値である変数aとbをbackメソッドの処理結果を返したい戻り値「int c = back();」の()内に記述します。今回の場合２つの変数であるため、「,」で区切ります。
　そして引継ぎ先であるbackメソッドでは、受け継ぐ値、変数a,bを受け入れる器を用意します。今回は変数x,yを用意しました。
この時点で、mainメソッドの変数a,bの値はbackメソッドの変数x,yに引き継がれます。
つまり、

int a = 1 = int x
int b = 5 = int y

ということになります。
int aを先ほどmainメソッドの値を引き継いだ変数x,yの値で再定義をします。
そして最後に、ここまでの処理結果である変数aの値を「int c」まで返します。
int cにreturn(a)されているため、backメソッドでの処理結果1*5の処理結果が変数cに代入され、

int c = 5

となります。

System.out.println(a + "x" + b + "=" + c);

はmainメソッドでの処理となるため、backメソッドで再定義した変数aの値は反映されません。
従って、通常通り代入された値と文字列を代入させることで

1x5=5

と、引数と戻り値を用いなかった式と同じ結果が得らるのです。

##処理手順で説明する##
　ここまで、コードで説明をしましたが、外へ行ったり戻ってきたりと、よくわからないという方もいらっしゃると思います。わたしはこのような説明を聞いて、混乱していました。

ですので、ここで一連の流れを整理して説明したいと思います。
何度も申し訳ありませんが、最後に完成したコードをご覧ください。

```Java:qiita.jv(4)
public class ReturnValue{
   public static void main(String[] arg){
      int a = 1;
      int b = 5;
      //手順その１
      int c = back(a,b);
　　　//手順その２

　　　//手順その６
      System.out.println(a + "x" + b + "=" + c);
　　　//手順その７
   }

   static int back(int x,int y){
　 //手順その３
   int a =x*y;
　 //手順その４
   return(a);
　 //手順その５
   }
}
```

今回はコードを見ていただければわかるようにコメントで処理の手順を記載しています。（わかりやすいですね！）
ではその手順に沿って改めてどのように処理が行われているかについて説明をしたいと思います。

手順その１
　変数aとbを定義しています。

手順その２
　backメソッドに引き継ぎたい値を変数cに定義しています。

手順その３
　mainメソッドから、変数a,bの値をbackメソッドの器、変数x,yが引き継ぐことができました。それによって、int x = 1、int y = 5となります。

手順その４
　変数aを再定義します。手順その３で受け継いだ変数x,yの計算式の結果が変数aに再定義されます。

手順その５
　returnによって、処理結果であるbackメソッドで再定義された変数aが呼び出し元に戻ります。

手順その６
　backメソッドで再定義された変数aがmainメソッドの変数cに代入されます。これによって、int c = 1*5 = 5　となります。

手順その７
　それぞれに代入された値と文字列を連結させて出力します。 

以上が、説明したコードの処理手順となります。


##（結論）戻り値とはどういうものか##

つまり、戻り値とは処理結果をあらわしたものなのです。（とコメントで説明していただきました。）
今回の場合は計算結果ですね。計算という処理の結果を反映させたものが戻り値となるため、戻り値＝処理結果となります。

わかった気になって全くわかっていなかったり、説明がわからなくなったり、余計な要素を入れたりしていたりと記事として未熟な部分ばかりで申し訳ありませんでした。