【Javaの基礎知識】型や変数について

#はじめに

こちらの記事は、
- Javaをこれから学習し始める
- 基本的なことをおさらいしたい

という方向けです。

#基本型(プリミティブ型)
Javaで予め用意されている型で、
メモリ領域に決められた分のサイズを使って、情報を保持します。

**整数のデータ型**

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

<br>

**浮動小数点数のデータ型**

| データ型名       |       サイズ |    値の範囲    |
|:-----------------|------------------:|:------------------:|
| float            |              32ビット |        -3.4028235E+38 ～ -1.401298E-45       |
|            |             |       1.401298E-45 ～ 3.4028235E+38       |
| double           |            64ビット |       -1.79769313486231570E+308 ～ -4.94065645841246544E-324       |
|           |             |       4.94065645841246544E-324 ～ 1.79769313486231570E+308       |


int型、double型、float型で計算の結果が違うのが下図でわかると思います。

```java
    int a = 7;
    int b = 3;
    System.out.println(a / b);//出力結果＝2

    double c = 7;
    double d = 3;
    System.out.println(c / d);//出力結果＝2.3333333333333335

    float e = 7;
    float f = 3;
    System.out.println(e / f);//出力結果＝2.3333333
```

<br>

**文字のデータ型**
1文字を格納できるデータ型です。

| データ型名       |       サイズ |    値の範囲    |
|:-----------------|------------------:|:------------------:|
| char             |              16ビット |       ¥u0000～¥uFFFF        |

Unicodeの文字コードで「A」と表示したいとき下図のようにできます。
参考サイト：[Unicode版 文字コード表](http://www.m-hoz.com/jsp/unicode.jsp?Bgn=0&End=65536)

```java
    char a1 = 'A';
    char a2 = 65;
    char a3 = 0x0041;
    System.out.println(a1);//出力結果＝A
    System.out.println(a2);//出力結果＝A
    System.out.println(a3);//出力結果＝A

```
**char型とStirng型の注意点**
char型のときは「'」で囲って、String型のときは「"」で囲みましょう。

```java
    String s = "A";
    char c =  'A';

    エラーが出る
    String st = 'A';//Type mismatch: cannot convert from char to String
    char ch = "A";//Type mismatch: cannot convert from String to char
```

<br>


**boolean型**
格納できる値はtrueまたはfalseのいずれかだけです。

| データ型名         |   サイズ    |    値    |
|:-----------------|------------------:|:------------------:|
| boolean             |     1ビット　          |        true or false        |

下図では、aとbは等しくないため、falseと表示されます。

```java
    boolean a = true;
    boolean b = false;
    System.out.println(a == b);//出力結果＝false
```

##データ型の使い分け
上の表にもあるようにデータ型によって、扱えるデータの範囲が異なります。
メモリの大きさを気にする必要がないぐらいメモリがある場合は、データ型を気にしなくてもなんとかなりますが、
メモリに限りがあったり、莫大なデータを扱うときは、
適切なデータ型を選んでメモリに負担をかけないよう心がけたいところですね。

##ラッパークラス
Javaには、基本型の値を持つことができるクラスが用意されています。
ラッパークラスは、値型なので、代入時は値がそのまま代入されます。

| 基本データ型 | ラッパークラス |
|:-:|:-:|
| boolean  |  Boolean |
| char  | Character  |
| byte  | Byte  |
| short  |  Short  |
| int  |  Integer  |
| long  |  Long  |
| float  |  Float  |
| double  |  Double  |

int型とIntegerクラスを使った例をご覧ください。
他のラッパークラスに関しての説明は、基本型（プリミティブ型）と振る舞いが一緒なため割愛させていただきます。

```java
    int a = 3;
    Integer b = 7;
    System.out.println(a + b);//出力結果＝10
    System.out.println(b instanceof int);//Incompatible conditional operand types Integer and int
    System.out.println(b instanceof Integer);//出力結果＝true
    
    int c = b;
    b = 8;
    System.out.println(c);//出力結果＝7
    System.out.println(b);//出力結果＝8
```
型を判定するのに「オブジェクトinstanceof 型」という方法がありますが、基本型（プリミティブ型）には使えないので注意が必要です。

##Stringクラス
Stringクラスは文字列を扱うためのクラスで、参照型です。
内部に文字列を保持し、それを操作するためのメソッドを提供します。
クラスからオブジェクトを作るときは、通常new演算子を使います。
しかし、String型はnew演算子を使わず、文字列を代入するだけでいいです。

```java
String s = "hoge";
String ns = new String("hoge");//わざわざnew演算子使わなくて良い
```



```java
    String a = "イニエスタ";
    String b = a;
    System.out.println(a);//出力結果＝イニエスタ
    System.out.println(b);//出力結果＝イニエスタ

    b = "本田";
    System.out.println(a);//出力結果＝イニエスタ
    System.out.println(b);//出力結果＝本田
```
参照型だけど、値の振る舞いは値渡しのようになっています🤔うーん
つまり、Stringクラスの特徴として、オブジェクト自身を変更する関数がないということがわかりました。

#参照型
クラス型、インターフェイス型、配列型があります。


配列型で説明していきます。

```java
    int[] a = {1,2,3};
    int[] b = a;
    b[0] = 6;
    System.out.println(a[0]);//出力結果＝6
    System.out.println(b[0]);//出力結果＝6
```
上図にあるように、配列aの0番目が6になってしまいました。
基本型では、それぞれの「箱」の中に値が入っているのに対し、
参照型は、「同じ場所を見ている（参照している）」ということになります。
よって、同じ場所を指しているため、配列aの0番目が6になってしまうわけです。

#昇格(プロモーション)
shortやbyteで計算したくても、型が違うとエラーが出てしまう時があります。
下図をご覧ください。

```java
    short a = 4;
    short b = 6;
    short ab = a * b;//Type mismatch: cannot convert from int to short
    // ↑ shortじゃなくてintに直しなさいと怒られています
    System.out.println(ab);

    byte c = 4;
    byte d = 6;
    byte cd = c * d;//Type mismatch: cannot convert from int to short
    // ↑ byteじゃなくてintに直しなさいと怒られています
    System.out.println(cd);
```
解決方法は、２パターンあります（他にもあったらすみません）

```java
    short a = 4;
    short b = 6;
    int ab = a * b;//intに変えてあげる
    System.out.println(ab);//出力結果＝24

    byte c = 4;
    byte d = 6;
    byte cd = (byte) (c * d);//キャストしてあげる
    System.out.println(cd);//出力結果＝24

```

#型キャスト(型変換)
ある型から別の型に変換することをキャストといいます。

**自動型変換**

```java
    int i = 7;
    double d = 3;
    System.out.println(i / d);//出力結果＝2.3333333333333335
    //勝手に型が変換され、double型になっています。
```

**強制型変換**
下図では、int型同士の計算ですが、double型の計算結果を見たい場合、
どちらか一方をキャストすることで型を変えられます。

```Java
    int i = 7;
    int d = 3;
    System.out.println((double)i / d);//出力結果＝2.3333333333333335
```



#変数の宣言/定義
変数名は、データ型や入る値にふさわしい名前をつけましょう。

```java

int number;
String name;
//データ型[半角スペース]変数名

```

#変数の初期化
変数の宣言/定義をすると同時に値を代入することができます。
このことを「変数の初期化」といいます。

```java
int number = 3;
String name = "イニエスタ";

```
#変数名を決める時の注意点

```Java:良い例◎
text //　英単語であること
userId //　2語以上の場合は大文字で区切る（キャメルケース）

```
```Java:悪い例　or　好ましくない
1text     //　数字始まり
user_id   //　アンダーバーで区切る（スネークケース）
atai      //　ローマ字
値        //　日本語

```
---

この記事では変換に関しては軽くしか触れてないので、
下記の記事で変換についてより詳しく触れていきます。
[【Javaの基礎知識】型変換について](https://qiita.com/gatchan03/items/b0e41067751f347b412d)