Javaの変数の使い方

この記事は、他の言語でプログラミングしていた人が、Javaでプログラムを組んでみると言う人に向けて書いた記事です。
今回は変数についての説明をします。

## 変数とは
変数とは、データを格納しておく領域のことです。
もっと大雑把に言うと、値を入れられる箱のようなものです。

## 変数の種類
変数の種類ごとに括って記載します。

#### 数値系
| データ型名 | 名称 | 消費メモリ | 範囲 |
|:---------|:-----|:---------|:----|
|byte|バイト型|1バイト|-128~127|
|short|短整数型|2バイト|-32768~32767|
|int|整数型|4バイト|-2147483648~2147483647|
|long|長整数型|8バイト|-9223372036854775808~ 9223372036854775807|
|float|単精度浮動小数点数型|4バイト|±3.40282347E+38~ ±1.40239846E-45|
|double|倍精度浮動小数点数型|8バイト|±1.79769313486231570E+308~ ±4.94065645841246544E-324|

---
#### 文字系
| データ型名 | 名称 | 消費メモリ | 範囲 |
|:--|:--|:--|:--|
| char | 文字型 | 2バイト | ¥u0000~¥uFFFF |
| String | 文字列型 | 4バイト(64ビットJVMでは8バイト) | 参照型 |

---
#### 特殊な型
| データ型名 | 名称 | 消費メモリ | 範囲 |
|:--|:--|:--|:--|
|boolean|ブーリアン型|1バイト|true(真)/false(偽)|
※真偽判定用変数。


## 変数の宣言
変数は変数名とデータ型名が必要です。
書き方は　"データ型名(半角スペース)変数名;" です。
例）

```java:example.java
int i;
String s;
```


## 変数の初期化
宣言をしただけでは、型ごとに決められた値しか入りません。自分が入れたい値を入れる必要があります。
書き方は "変数名=入れたい値;" です。
宣言と同時に初期化も行え、その場合は"データ型名(半角スペース)変数名=入れたい値;"と書きます。
※補足説明。数字はそのまま。文字型は''(シングルコーテーション）で囲む。文字列型は""（ダブルコーテーション）で囲む。
例）

```java:example.java
int i;
String s;

i = 1;
s = "str文字列";
char c = 'あ';
```

ただし、型ごとに入れられる値が決まっているので気をつけてください。また、先に宣言をしていないといけません。
悪い例）

```java:bad_example.java
int i;
String s;

i = "str文字列"; //整数型に文字列型
s = 2432; //文字列型に数字型
c = 'あ'; //宣言なし
```


## 型変換（キャスト）の仕方
[【Java入門】キャスト(型変換)とアップキャスト、ダウンキャスト](https://www.sejuku.net/blog/22975) の内容をまとめたものです。
型変換とはある型を別の型に変換することです。自動で行われるものと宣言して行われるものがあります。
まず自動で分かりやすいのが下の例です。

```java:example.java
int i = 2;
float f = i;

System.out.println("int i = " + i);
System.out.println("float f = " + f);
```

System.out.println(); は（）内を文字として出力します。
このプログラムを実行すると、
int i = 2
float f = 2.0
が出力されます。
この場合、iとfは文字列型として扱われています。つまり、String型に変換されているということです。
また、float型のfにint型のiを代入できています。これは、iの値を自動でfloat型に変更しているからです。
今の例が自動で行われる型変換（キャスト）です。

次に、自分で行う場合です。自分で行う場合とはどういう事例があるか、一例をあげます。

```java:example.java
String s1 = "9";
String s2 = "1";

System.out.println(s1 + s2);
```

このプログラムを実行すると、
91
が出力されます。それは、String型なので"9"という文字列と"1"という文字列を1つの文字列にするからです。しかし、ここで計算して10を出したい場合、以下のように記載します。

```java:example.java
String s1 = "9";
String s2 = "1";

System.out.println(Integer.parseInt(s1) + Integer.parseInt(s2));
```

Integer.parseInt(); は（）内の文字列をint型に変更する処理です。これにより、s1,s2の値をint型にして計算することができるので、出力結果は
10
となります。

### 型変換の仕方
#### 数値型同士
数字型の場合、(型名)値でやり取り可。

```java:number.java
int i = 1;
short s = (short)i;
float f = 2.4;
long l = (i+s+f);
System.out.println(l); //出力結果＝5
```

#### 数値→文字
String.valueOf();を使用する。 あるいは文字列と＋で繋げる。

```java:number.java
int i = 3;

System.out.println(String.valueOf(i)+2); //出力結果＝32
System.out.println("番号" + i); //出力結果＝番号3
```

#### 文字→数字
int型以外は
[データ型名 (最初の文字のみ大文字)].parse[データ型名 (最初の文字のみ大文字)](文字); と記載する。
int型は
Integer.parseInt(文字); と記載する。

```java:number.java
String s = 03;

int i = Integer.parseInt(s);
int l = Long.parseLong(s);

System.out.println(i); //出力結果＝3
System.out.println(l); //出力結果＝3
```


###型変換の注意点
型変換には以下の注意点があります。
・型変換はあくまで受け取った値の型を指定するだけなので、変数名を入れたとしても元の変数の値の方は変更されません。
・受け取った値が変換したい方にあっていない場合、エラーが出ます。
・変換した結果、変換前と後で値が変動することがあります。


例）

```java:bad_example.java
String s1 = "sss9";
String s2 = "1";
String s3 = "03";

System.out.println(Integer.parseInt(s1) + Integer.parsparseInt(s2); //"sss"部分は整数でないのでエラー
System.out.println(Integer.parseInt(s3)); //3と出力される。0は消える
System.out.println(s3); //03と出力される。上の行のInteger.parseInt(s3)の影響は受けない。
```