【Java入門】変数と型について（変数の宣言、初期化、データ型）


#目的

Java言語を含めたプログラミングの学習を始めたばかりの方、既学習者の方は復習用に、
変数の宣言、初期化、データ型を学ぶ為に書いています。


[【Java入門目次】](https://qiita.com/morioheisei/items/6c7fc063c26e63d890ac)
今回は**変数と型について**です。

・変数と型　←今ここ
・[型変換](https://qiita.com/morioheisei/items/28ab5fd69570e01cd317)
・[変数のスコープ](https://qiita.com/morioheisei/items/c56ab32b68ce92d32206)
・[文字列の操作](https://qiita.com/morioheisei/items/e58adadd8535971b69be)
・[配列の操作](https://qiita.com/morioheisei/items/b6acbb1b0c07b40e7f56)
・[演算子](https://qiita.com/morioheisei/items/63088c61e8234dc1f7f5)
・[条件分岐](https://qiita.com/morioheisei/items/194cdc73a29bddade0a4)
・[繰り返し処理](https://qiita.com/morioheisei/items/e686e33b60c6a60e87f0)
・クラスについて（準備中）
・抽象クラス（準備中）
・インターフェース（準備中）
・カプセル化（準備中）
・モジュールについて（準備中）
・[例外処理について](https://qiita.com/morioheisei/items/d25d2b67e7530c1aab9d) 
・[ラムダ式について](https://qiita.com/morioheisei/items/2bfcc3d8d8440b00e6a9)
・[Stream APIについて](https://qiita.com/morioheisei/items/3a7be38b4d3ef712ccb2)





#変数の宣言と初期化

変数とは、
`プログラム内で使用するデータを保持するための入れ物。`

他の変数と区別する為に、

Java言語においては、変数を宣言する際に以下を注意しなければいけません。

・数値や文字列など、どんな値が格納されるのか
・どんな名前にするのか
・最初に格納する値は何なのか

##変数の宣言
`データ型 変数名;`
とする必要がある。
（データ型については後述します）

```Java:Main.java
class Main {
  public static void main(String args[]) {
    // 変数の宣言
    int num;

    // 出力しようとするとエラーになる
    System.out.println(num); // The local variable num may not have been initialized
  }
}
```

このエラーは、変数の宣言はされているが、初期化されていない、
値がセットされていない、変数を使用したために起きる。

##変数の初期化
`データ型 変数名;`とした後、
`変数名 = 値;`
とする必要がある。

```Java:Main.java
class Main {
  public static void main(String args[]) {
    // 変数の宣言
    int num;

    // 変数の初期化(numに10を代入)
    num = 10;

    // 出力
    System.out.println(num); // 10
  }
}
```
1.変数名「num」を宣言
2.numに10を代入して初期化している。（値をセット）
3.出力


##変数の宣言と初期化を同時に
`データ型 変数名 = 値;`
とすることも可能。

```Java:Main.java
class Main {
  public static void main(String args[]) {
    // 変数の宣言と初期化
    int num = 10;

    // 出力
    System.out.println(num); // 10
  }
}
```

##変数名のルール

・先頭文字は以下のみ使用可能。
アルファベット（a~z、A~Z）、ドル記号（$）、アンダースコア（_）

・２文字目以降は数字も使用可能。

・大文字小文字は厳密に区別される。

・文字数（長さ）の制限はない。

・null,true,falseは使用不可。

・予約語は使用不可。
>予約語とは、Java言語で既に使用されている名前の事。
>例：if,while,switch など

予約語について詳細：[公式ドキュメント](https://docs.oracle.com/javase/specs/jls/se11/html/jls-3.html#jls-3.9)



#型について

Javaでは、変数を宣言する際、`データ型を指定`しなければいけませんでしたね。


データ型を大別すると以下になる。

・`基本データ型（プリミティブ型）`
・`参照型`


それぞれを見ていきましょう。

##基本データ型（プリミティブ型）

###boolean型

| 型 | サイズ | 値の範囲 |
|:--|:--|:--|
| boolean | 1ビット | true/falseのどちらか |


```Java:Main.java
class Main {
  public static void main(String args[]) {
    boolean a = true;
    boolean b = false;

    System.out.println(a); // true
    System.out.println(b); // false
  }
}
```

###整数型

整数データを扱っています。

| 型 | サイズ | 値の範囲 |
|:--|:--|:--|
| byte | 8ビット | -128〜127 |
| short | 16ビット | -32768～32767 |
| int | 32ビット | -2147483648～2147483647 |
| long | 64ビット | -9223372036854775808～9223372036854775807 |


```Java:Main.java

System.out.println("byteの最小値= " + Byte.MIN_VALUE); // byteの最小値= -128
System.out.println("byteの最大値= " + Byte.MAX_VALUE); // byteの最大値= 127

System.out.println("shortの最小値= " + Short.MIN_VALUE); // shortの最小値= -32768
System.out.println("shortの最大値= " + Short.MAX_VALUE); // shortの最大値= 32767

System.out.println("intの最小値= " + Integer.MIN_VALUE); // intの最小値= -2147483648
System.out.println("intの最大値= " + Integer.MAX_VALUE); // intの最大値= 2147483647

System.out.println("longの最小値= " + Long.MIN_VALUE); // longの最小値= -9223372036854775808
System.out.println("longの最大値= " + Long.MAX_VALUE); // longの最大値= 9223372036854775807
```

`byte  < short < int  < long` という関係ですね。


ちなみに最小値、最大値を超えると値が反転します。（桁溢れ）


```Java:Main.java

System.out.println("前 byteの最小値= " + Byte.MIN_VALUE); // byteの最小値= -128
byte minByte = Byte.MIN_VALUE;
minByte--;
System.out.println("あと byteの最小値= " +  minByte); // byteの最小値= 127 ←反転している

System.out.println("前 byteの最大値= " + Byte.MAX_VALUE); // byteの最大値= 127
byte maxByte = Byte.MAX_VALUE;
maxByte++;
System.out.println("あと byteの最大値= " + maxByte); // byteの最大値= -128 ←反転している

```

整数の計算をする時などに用いたりします。

```Java:Main.java

int a = 1;
int b = 1;
int sum = a + b;

System.out.println(sum); // 3

```


####long型を使う時の注意

int型を超える整数を変数に格納する場合、末尾に「L」か「l」を付ける。

```Java:Main.java
// エラーが出る
long longNumber = 214748364712342; // The literal 214748364712342 of type int is out of range

long longNumber = 214748364712342L; // 末尾に「L」か「l」を付けなければいけない。

System.out.println(longNumber); // 214748364712342
```






###浮動小数点型

小数点を含む数値のデータを扱っています。

| 型 | サイズ | 値の範囲 |
|:--|:--|:--|
| float | 32ビット | ±1.40239846×10^-45～±3.40282347×10^38 |
| double | 64ビット | ±4.94065645841246544×10^-324～±1.79769313486231570×10^308 |

```Java:Main.java

System.out.println("floatの最小値= " + Float.MIN_VALUE); // floatの最小値= 1.4E-45
System.out.println("floatの最大値= " + Float.MAX_VALUE); // floatの最大値= 3.4028235E38

System.out.println("doubleの最小値= " + Double.MIN_VALUE); // doubleの最小値= 4.9E-324
System.out.println("doubleの最大値= " + Double.MAX_VALUE); // doubleの最大値= 1.7976931348623157E308

```

少数の計算をする時などに用いたりします。

```Java:Main.java

// int型の割り算
int a = 10;
int b = 3;
int result1 = a / b;

System.out.println(result1); // 3

// float型の割り算

// 浮動小数点数は、デフォルトとして、double型として認識される
// float c = 10.0; // Type mismatch: cannot convert from double to float

float c = 10F; // よって、float型の変数に代入する時は末尾にFかfををつける
float d = 3f; // 同上
float result2 = c / d;

System.out.println(result2); // 3.3333333

// double型の割り算
double e = 10.0D; // Dまたはdを末尾につける
double f = 3.0; // ただ上述の通り、デフォルトでdobule型と認識されるので省略しても問題ない
double result3 = e / f;

System.out.println(result3); // 3.3333333333333335

```





###char型
１文字を表すのに扱うのに使われている。



| データ型 | サイズ | 値の範囲 |
|:--|:--|:--|
| char | 16ビット | 16ビットの文字コード |
1文字を扱うのに使われています。

####char型を使う時の注意
シングルクォーテーションで囲うこと。
１文字ではないとダメ。

```Java:Main.java
// エラーが出る
char a = 'ああ'; // Invalid character constant
char a = "あ";  // Type mismatch: cannot convert from String to char

char a = 'あ';
System.out.println(a); // あ
```


##参照型
クラス、配列、インターフェースなどを含む基本データ型以外の型全ては、参照型になります。

変数が値そのものを保持するのではなく、値が置いてある場所を保持する。
どこに格納されているか参照しているので参照型。



```Java:Test.java
public class Test {
  public int number = 0;
}
```

```Java:Main.java
class Main {
  public static void main(String args[]) {
    Test test = new Test();
    test.number = 10;
    System.out.println(test.number); // 10

    Test test2 = new Test();
    test2.number = 10;
    System.out.println(test2.number); // 10

    test = test2; // testにtest2の値を代入している訳ではなく、test2の値の置いてある場所を代入している
    test.number = 99; // よって、ここでtestを99に変更したら、test2まで変更されてしまう。

    System.out.println(test.number); // 99
    System.out.println(test2.number); // 99

  }
}
```

test = test2;は、
testにtest2の値を代入している訳ではなく、test2の`値の置いてある場所`を代入している。

test.number = 99;
よって、testを99に変更したら、test2まで変更されてしまう。


###ラッパークラス

基本データ型の値を参照型として扱う事ができる。

参照型ではあるが、基本データ型と同じで値は変更されない。
値の置いてある場所ではなく、値そのものを代入している。

```Java:Main.java
class Main {
  public static void main(String args[]) {
    Integer num = 10;
    Integer num2 = 10;
    System.out.println(num); // 10
    System.out.println(num2); // 10

    num = num2;
    num = 99;
    System.out.println(num); // 99
    System.out.println(num2); // 10

    String greet = "おはよう";
    String greet2 = "こんにちは";
    System.out.println(greet); // おはよう
    System.out.println(greet2); // こんにちは

    greet = greet2;
    greet = "Good Morning";
    System.out.println(greet); // Good Morning
    System.out.println(greet2); // こんにちは
  }
}
```

#終わりに

変数の宣言、初期化、データ型について学びました。
次回は[型変換](https://qiita.com/morioheisei/items/28ab5fd69570e01cd317)を掘り下げていこうと思います。