基本から学ぶJava - 変数について -

# 初めに
今回から執筆させていただく初心者です。
備忘録という意味合いも強いのですが、第一に、私自身が**「他人に説明できるかどうか」**を目的に執筆していこうと思います。

今回はJavaどころかプログラミング自体よくわからないという方に配慮して執筆してみます。
ですので、JVMがどうとかメモリがああだとか処理速度がどうとか等は触れずに、あくまでも**Javaというプログラム言語を扱う**事に焦点を当てていきます。

そういう意味では一番大切なことではあるのですが、Javaのインストールについては事前に済ませおり、コンパイルも出来、実行も出来る。という前提で進んで行きます。 ~~ぶっちゃけそこは他の方の記事を見ればいいんじゃないかと思います。~~
需要があればインストール方法からコンパイル方法等書こうとは思います。

元々はJavaの型について書こうと思っていたんですが、変数について書いていると大分長くなったので今回は変数のみの解説とします

## 環境について
私はjdk-11を使用し、開発環境はJavaではeclipseを使用していますが、現在は諸事情によりVscodeを使用しています。
他、環境を整えられる方なら、Vscodeやeclipse等を用いると今後の開発は楽になります。

実例としてプログラムを載せますが、行数は決して多くはなく、簡単なものです。
なので、わざわざ自身のPCの環境で書いてからコンパイルして実行、なんて手間をかけなくても、簡単なプログラムなら、**Dokojava**というWebサイトで実行することが出来ます。
[Dokojava](https://dokojava.jp/sources/Main.java) - https://dokojava.jp/sources/Main.java

「変数ぐらいはわかる。」
とお思いの方も、一度復習だと思って読むと幸せになるかもしれません。

##　変数について
Javaに限らず、プログラムを行う上でなくてはならない要素であり、これがないとプログラムで出来ることがほとんどなくなってしまう。そう言っても過言ではないのが**変数**の存在です。

「変数とは、値を入れる箱です。」

変数という言葉を聞いたことがある方はよくこういわれると思います。
そして、大体「箱ねぇ...」と終わってしまう方も居ると思います。
正直に言うと、「箱」という表現は本当に**最適解**だと思います。私自身、初めて聞いた際は「箱ねぇ...」となってましたが、プログラム学習を進めていくと、「箱」としか表現しずらいと感じました。

```java:sample1
public class Main {
	public static void main(String[] args) {
		System.out.println( 1 );
	}
}
```
```
結果
1
```
上記のコードではカッコで囲われた「１」という数字をコンソールに表示させるものです。当然ですが、それ以上もそれ以下もありません。
では、次に「1 + 1」の計算結果を表示させてみましょう。

```java:sample2
public class Main {
	public static void main(String[] args) {
		System.out.println( 1 + 1 );
	}
}
```
```
結果
2
```
出来ました。
「え？」と驚いた方もいるかもしれませんが、カッコの中身は、基本的に**結果が入る**ということを覚えていてください。
この場合は、「1 + 1」という計算結果の「２」が表示されます。

単純な足し算や、この結果が欲しい！というのであれば、このような物でもいいのかもしれませんが、少し複雑な計算だと、面倒なことになります。

```java:sample3
public class Main {
	public static void main(String[] args) {
		// 1 + 1の結果を表示
		System.out.println( 1 + 1 );

		// 1 + 1の結果にさらに 1 を足す
		System.out.println( 1 + 1 + 1 );

		// 1 + 1 + 1の結果にさらに 1 を足す
		System.out.println( 1 + 1 + 1 + 1 );
	}
}
```
```
結果
2
3
4
```
以上の様なものだとどうでしょう。
なんだかめんどくさいですよね？望んだ結果を出力できているとはいえ、コレジャナイ感を感じていただければ幸いです。
え？それ以前にこんなことしない？確かに今回の例のようにしなくても、逐一結果を実行し確認、その結果にさらに「1」を足していく。というようにすればそもそも必要がありませんが、

1. まず、〇〇の処理を行う
1. 次に、〇〇の処理で得た結果を△△の処理へと渡す。
1. △△の処理が出来たら、次は△△の処理で得た結果を✕✕の処理へ渡す。
1. ✕✕の処理が出来たら、次は...

と、なるとどうでしょうか。とてもじゃないですが、逐一結果を実行して確認して、さらに処理を追加して...では決して作ることはかないません。

しかし、どうしようもありません。なぜなら、現状だと**結果を持ち運ぶことが出来ないからです。**
なので、一つの処理を無事終えたとしても、その結果を次の処理へと渡す方法がないのです。

そこで登場するのが変数です。

```java:sample4
public class Main {
	public static void main(String[] args) {
		int i = 1;
		System.out.println( i );
	}
}
```
```
結果
1
```
上の例では`int`という型に`i`という名前を付けて変数（箱）を用意し、`=`演算子を用いて数字の「1」を格納しています。
そして「1」を入れた`i`という名前の箱を運び、箱の中身をコンソールに表示させています。

型の詳細については今回は触れません。今はスルーしていてください。
ここで重要なのは、「**どうやっても持ち運ぶことが出来なかった数字を持ち運ぶことが出来た**」ということです。

```java:sample5
public class Main {
	public static void main(String[] args) {
		int i = 1 ;
		System.out.println( i );
		System.out.println( i );
		System.out.println( i );
	}
}
```
```
結果
1
1
1
```
上の例では、数字の「1」を格納した`i`という箱を使いまわすことで`i`の中身を３回表示させることに成功しています。
この様に、変数を用いることで変数に格納した値を自由に扱うことが出来ます。
プログラムを行う上で「変数を用いた**値の格納**と**引き出し**、**持ち運び**」というものは基本の一つです。積極的に使用しましょう。

察しのいい方は気付いたと思いますが、この変数を活用することでsample3をよりシンプルにできるということです。

```java:sample6
public class Main {
	public static void main(String[] args) {
		// 1 + 1の結果を格納
		int i = 1 + 1;
		System.out.println( i );

		// 1 + 1の結果にさらに 1 を足す
		i = i + 1;
		System.out.println( i );

		// 1 + 1 + 1の結果にさらに 1 を足す
		i = i + 1;
		System.out.println( i );
	}
}
```
```
結果
2
3
4
```
いかがでしょうか？行数は増えちゃってますが、とてもスッキリとした見た目になったでしょう？
ちなみに`//`を書くことで以降の行はプログラムとしては認識されず、自由にコメントを書くことが出来ます。

sample2で 「カッコの中には結果が入る」 と言いましたが、それは変数も同じです。4行目がまさにそうですね。
ここで補足をしておくと、8行目、12行目にて`i = i + 1;`としていて、4行目での`int`という型の指定がありません。
これは、既に用意されている`i` という箱を使いまわしているからです。
この状態で8行目、12行目で`int i = i + 1;`としてしまうと、「`i`という名前が重複してるよ」とエラーとして怒られます。
少しわかりにくいかもしれませんが、

4行目の`int i = 1 + 1;`という行では、
`int`という型に`i`という名前を付けて変数（箱）を新しく用意し、`=`演算子を用いて数字の「1 + 1」の計算結果を格納しています。
そして8行目、12行目では、
既に用意されている`i`という箱の中身を取り出し、取り出した箱の中身と数字の「1」を足し合わせた計算結果を既に用意されている`i`という箱に上書きする。ということになります。

はい、長いですね。ここで留意してもらいたいのが、`=`で**箱の中身を結果で上書きする**という点です。`=`は代入演算子なので、箱の中身をキレイに新しくしてしまいます。
ですので、8行目では`i`という箱の中には「1 + 1」の結果である「2」が入っているので、

```java
// 1 + 1の結果にさらに 1 を足す
i = 2 + 1; // i = i + 1;
System.out.println( i );
```
と、同様の結果となっています。
当然10行目も同じで、`i`という箱の中には「1 + 1 + 1」の結果である「3」が入っているので、

```java
// 1 + 1 + 1の結果にさらに 1 を足す
i = 3 + 1; // i = i + 1;
System.out.println( i );
```
と同様の結果となります。

ちなみに、今回の場合は`+=`演算子、`++(インクリメント)`を用いればさらに見た目をスッキリとしたものにできます。

```java:sample7
public class Main {
	public static void main(String[] args) {
		// 1 + 1の結果を格納
		int i = 1 + 1;
		System.out.println( i );

		// 1 + 1の結果にさらに 1 を足す
		i += 1;
		System.out.println( i );

		// 1 + 1 + 1の結果にさらに 1 を足す
		i++;
		System.out.println( i );
	}
}
```
```
結果
2
3
4
```
これは`i`という箱の中身に数字の「1」を足し加える。というものになります。
今回は演算子については詳しく解説しませんが、
`+=`演算子は左辺の変数の中身に対して直接右辺の値を足し加えています。
`++`はインクリメントと言って、値に対して「1」を加えるというものです。そうです。「1」を加えます。
インクリメントに対して、`--(デクリメント)`も存在し、これは値に対して「1」を減らす。というものです。

さらに、複数の変数を使うことも可能です。

```java:sample8
public class Main {
	public static void main(String[] args) {
		// 1 + 1の結果を格納
		int i = 1 + 1;
		System.out.println( i );

		// 2 + 2の結果を格納
		int j = 2 + 2;
		System.out.println( j );

		// 1 + 1の結果にさらに 1 を足す
		i++;
		System.out.println( i );

		// 2 + 2の結果にさらに 2 を足す
		j += 2;
		System.out.println( j );
	}
}
```
```
結果
2
4
3
6
```
上述で`int i`は二つ目以降では怒られると説明しましたが、単純な話、名前を変えてあげることで怒られることがなくなります。
今回の例では`j`という名前の箱を新しく用意し、中に「2 + 2」の結果を格納しています。
この様に、型は同じでも名前を変えて宣言することにより変数はいくらでも用意することが出来ます。
ただし、型名や構文等、「**予約語**」と呼ばれている単語はそもそも変数の名前にすることが出来ず、変数の名前が重複すれば型が違っても怒られるので注意しましょう。
後、今回の例では変数名は`i`や`j`を使用していますが、このような名前は使い捨てにするような変数のみにしましょう。
中長期的に使用する変数にはそれがどんな情報を持っているのかというのが一目でわかる変数名を付けることを心がけましょう。
例として、年齢であれば`age`、誕生日であれば`birthday`、学生番号であれば`studentNumber`等。
そうすることにより、格納されている情報が中身を確認しなくても分かりますし、何より用途が決まっていてかつ限定的なので名前の重複も起きにくいです。
___
#### 補足
このように変数とは中身が動的に変わります。それに引き換え、変数の中身が変わらないものもあります。それは**定数**と呼ばれ、格納された値は操作されることはなく、参照のみの役割を担います。
あと、sample3の様に、「1 + 1 + 1」の様な変数に値を入れない数字は「**マジックナンバー**」と呼ばれており、「**マジックナンバー**」を用いて直接計算をする、といったものは「**ハードコード**」と呼ばれています。
どちらもプログラミングでは避けられています。理由としては、何故その値を使っているのかが分かりにくいというものと、同じ値を複数個所で使用している場合、一つの値を変更した場合、該当箇所全てをいちいち手動で修正しなくてはいけません。ゆくゆくは百行、千行、一万行ものプログラムを組むことになるかもしれません。そうなると、どれだけ恐ろしいことか、想像に難くないでしょう。

固定値を使うのであれば、使いまわしが出来、かつ一か所の変更で該当箇所のすべての値を変えることが出来る定数を利用するとよいでしょう。

## 終わり
ここまでで変数について簡単に解説しました。
説明不足なところはあるでしょうが、「こんなもの」という位には理解していただけたのではないでしょうか。
いまいち理解の及んでいない方も、実際に触ることでより深く理解できると思います。

気力があればどんどん書いていこうと思います。
次回は型について書こうと思います。