【Java】変数と型の種類

# 変数とは
:sunny: データを入れる箱のようなもの
:sunny: その箱には自由に名前をつけることができる
:sunny: 変数を使うためには、これから変数を使いますよーという宣言が必要

```例.java
public class Main {
	public static void main(String[] args) {
	    int number;
	    number = 10;
		System.out.println(number);
	}
}
```

int number;
　→　number という名前の箱を用意しましたー！

number = 10;
　→　その number という箱に 10 をいれてくださーい！

System.out.println(number);
　→　number の中身を出力してくださーい！

```コンソール.
10
```

と表示されます。
もう少し中身を詳しく説明しますね:smile:

**int number;**
この int number; で変数の宣言をしています。
int は **型（またはデータ型）** と呼ばれるものでデータの種類をあらわします。
number は **変数名** といって変数に自由に名前をつけることができます。

number は私が勝手に名前をつけた変数名だけで、例えば age や day などでも大丈夫です。
自由に名前をつけれるといっても多少のルールがあって

・int や public などすでにjavaに組み込まれている単語は使用してはいけない。
・基本的には小文字で始まる英単語の名詞を使用（ローマ字や漢字や数字で始まるものは推奨しない）
・１文字の変数名はさける
・複数の単語をつなげて使用する場合は２単語目の先頭を大文字にする（myAgeなど）

というのが主なルールでしょうか。
型については後ほど説明しますね:smile:


**number = 10;**
変数名number に 10 という値を入れていますが
変数に値や文字などを入れることを**代入**といいます。

余談ですが、この = がついている場合は左から読んだほうがわかりやすいです。
10 という値を number という変数名の箱に入れる。
みたいな。
学校では = は等しいという意味で習ったかと思いますが
プログラミングでは == が等しいの意味を表します。
== のときは右から読んでください:smile:


**System.out.println(number);**
（）に入ってるのは変数名です。
この変数名に入っているものを呼び出します。
これを**取得**といいます。

## 変数の上書き
```例.java
public class Main {
	public static void main(String[] args) {
	    int number;
	    number = 10;
		System.out.println(number);
		number = 20;
		System.out.println(number);
	}
}
```

上記のように 変数number に 10 を代入し
そのあと再度 変数number に 20 を代入しました。
どのように表示されるでしょうか？:thinking: 

```コンソール.
10
20
```

変数number に 20 が代入され上書きされてしました。
このようにすでに値が入っている変数に値を代入すると
古い値は消滅し、新しい値が上書きされます:smile:

## 変数の初期化

```例.java
int number;
number = 10;
```

さきほど上記のように変数の宣言と変数の代入を２行にわたり記入していました。
もちろんこれはこれで問題ないのですが、これを１行にまとめて記入する方法があります。

```変数の初期化.
型 変数名 = 代入するデータ;
```

とすることで１行にまとめて記入することができます。
ではさきほどのコードをまとめてみましょう:smile:

```例.java
int number = 10;
```

このように**変数の宣言と同時に値を代入することを変数の初期化**といいます。

# 型の種類
## 整数
さきほど変数名の前に int という単語が表示されていたかと思います。
この int というのは簡単に言うと データの種類で整数型 を意味します。

int number;

というのは
変数名 number という箱に整数が入りますよー
ということなのです。

つまり、小数や文字はこの箱に入ることができません。
整数のみです。
小数や文字を代入したいときは別の型を使う必要があります。

小数や文字の型はあとで説明するとして
さきに整数の型を説明しますね。

int はデータの種類では整数とさきほどお伝えしました。
整数には違いないのですが整数だけでもいろいろと種類があるのです・・・:sweat_smile: 

|型名|格納可能な整数の範囲|消費メモリ|
|---|----------------|-------|
|byte|-128〜127 の整数|1バイト|
|short|-32768〜32767 の整数|2バイト|
|int|-2147483648〜2147483647|4バイト|
|long|-9223372036854775808〜9223372036854775807|8バイト|

テストの点数であれば0〜100点なので byte を使えば消費メモリが1バイトですみますよね:smile:
でも５教科の合計点・・・となれば short にすれば消費メモリが2バイトですみそうです。

でもそれだと消費メモリを気にして型名を毎回変えなければいけないの？:thinking: となってしまいます。

よほど大きな数字を扱わないかぎりは基本は int で問題ないです:smile:
昔のＰＣならいざ知らず、最近のPCはメモリを多く搭載してるので、そこまで厳密に使い分ける必要はないかと思います:smile:

ちなみに long を使うときは数字のあとに L もしくは l をつけます（10000L,10000l など）

## 小数
小数を扱う型にも２種類の型が存在します。
float と double です。
何が違うのか？と言えば消費メモリが違います。
格納可能な小数の範囲も違うのですが説明がちょっと面倒なので省きます:sweat_smile: 
少し調べると出てくるかと思います:smile:

|型名|消費メモリ|記入方法|
|---|--------|------|
|float|４バイト|数字のあとに F もしくは f をつける|
|double|８バイト|数字のあとに D もしくは d をつけるが基本は省略してもよい|

double は float よりは厳密な計算ができます。
厳密な・・・というのはどういうことなのかというとパソコンさんは数字しかわからないので小数点が理解できません。
そのため私達が計算するような小数の計算ではなくパソコンさんが理解できるように別の計算方法で小数を表しているのですが、その計算方法では近似値を表すため、どうしても少々誤差が生じてしまうのです。

とても小さな誤差なので通常はそれでも大丈夫なのですが、それが積み重なると大きな問題に発展しかねないので注意が必要です。

ちなみに普段は double を使用で問題ないです:smile:

## 真偽値
真偽値をあらわすには boolean という型を使います。
マルかバツか 本当か嘘か など二者択一のときに使用します。

## 文字（１文字のみ）
１文字のみ扱いたいときには char という型を使います。
全角・半角問わず１文字のみです。
**使用するときは ' ' を使います**（例：'山'　'1'　'あ'　など）
**いままで文字は ""（ダブルクオーテーション） を使用していましたが
char を使用するときは ''（シングルクォーテーション）を使用します。**

## 文字列
２文字以上扱いたいときは String を使用します。
文字は ""（ダブルクオーテーション）で囲みます。

# 定数
変数の上書き で説明したとおり、変数は上書きできてしまいます。
しかし上書きしてほしくない場合もあります。
そのときは **定数** を使用します。
定数を使用すれば、値を上書きされる心配がありません。

```定数の宣言.
final 型 定数名 = 初期値;
```

なんだかややこしそう・・・と思ってしまいますが
作成してしまえば、全然ややこしくないです:smile:
ちなみに定数名はすべて大文字で記入する必要があります。

```例.java
public class Main {
	public static void main(String[] args) {
	    final int NUMBER = 10;
		System.out.println(NUMBER);
	}
}
```

```コンソール.
10
```

変数の初期化の記入方法に似てると思いますが
一番最初に final をつけて 定数名をすべて大文字にするだけです:smile:
ちなみに定数を上書きしようとするとコンパイルエラーとなり上書きできません:smile: