【初心者】Javaのデータ型

# はじめに

Javaのデータ型と演算子についての備忘です。

# 1. Javaのデータ型

`基本データ型`と`ラッパークラス`、あわせて関連するメソッドについてまとめておきます。

## 1-1. データ型一覧

Javaで用意されている`基本データ型`は次のようになります。
なお、最後の`String`だけはデータ型ではなく、クラスオブジェクトとなります。

|基本データ型|種類|サイズ|扱える範囲|ラッパークラス|
|---|---|---|---|---|
|byte|(整数型)|1byte|-128 ～ 127|Byte|
|short|短整数型|2byte|-32,768 ～ 32,767|Short|
|int|整数型|4byte|-2,147,483,648 ～ 2,147,483,647|Integer|
|long|長整数型|8byte|-9,223,372,036,854,775,808 ～ 9,223,372,036,854,775,807|Long|
|float|単精度浮動小数点数型|４byte|有効桁数6桁の実数|Float|
|double|倍精度浮動小数点数型|8byte|有効桁数14桁の実数|Double|
|boolean|真偽型|1bit|true 又は false|Boolean|
|char|文字型|2byte|１文字|Character|
|String|文字列型|なし|最大2,147,483,647文字？|-|

**＜Stringオブジェクトの最大文字数について＞**
最大何文字まで格納できるかは、調べてもよく分かりませんでしたが、`配列数の上限`と`メモリの上限`などに左右されるようです。

**＜C言語との相違点＞**
Javaのデータ型は、ほぼ、C言語と同じような構成になっていますが、相違点もあります。
気になったところは、次のとおりです。

C言語における`long型`は４byteだが、Javaにおける`long型`は8byteである。そのため、Javaでは18桁までの整数を扱うことができる（C言語では9桁...という認識）。
C言語には`unsigned（符号なし整数）`があるが、Javaの整数型には`unsigned`は用意されていない（ただし、ラッパークラスで符号なし整数も表現できる）。

## 1-2. ラッパークラスについて

前述の基本データ型は、値のみ（数値リテラル、文字列リテラル）を格納します。
一方、**ラッパークラス**は、`オブジェクト（参照型）`としてデータを格納するため、様々なメソッドを使用することができます。
以下、ラッパークラスの使用例として、（個人的に）よく使いそうなメソッドを挙げておきます。


### 1-2-1. 数値型から文字列型への変換

数値型から文字列型に変換するには、`toString`メソッドを使います。

```Sample01.java
public class Sample01 {
  public static void main(String[] args) {
    int num = 10;
    String numStr = Integer.toString(num);  // toStringメソッドで文字列に変換

    System.out.println(num + 1);  // numは数値なので加算される
    System.out.println(numStr + 1);  // numStrは文字列なので文字列として結合される
  }
}
```

```:ターミナル
$ javac Sample01.java 
$ java Sample01
11
101
```

`toStringメソッド`は、数値型の全てのラッパークラスで使用できます（つまり、`Byte`、`Short`、`Integer`、`Long`、`Float`、`Double`の6つ）。

### 1-2-2. 文字列型から数値型への変換

文字列型から数値型に変換するには、valueOfメソッドを使います。

```Sample02.java
public class Sample02 {
  public static void main(String[] args) {
    String numStr = "100";
    int num = Integer.valueOf(numStr);  // valueOfメソッドで文字列に変換

    System.out.println(numStr + 1);  // numStrは文字列なので文字列として結合される
    System.out.println(num + 1);  // numは数値なので加算される
  }
}
```

```:ターミナル
$ javac Sample02.java
$ java Sample02
1001
101
```

## 1-3. Stringオブジェクトについて

これは、`ラッパークラス`ではないですが、必要性の高いものなので挙げておきます。

### 1-3-1. 文字列の長さを取得する

```Sample03.java
public class Sample03 {
  public static void main(String[] args) {
    String str1 = "あいうえお";  // 日本語文字列
    System.out.println(str1.length());  // 5文字

    String str2 = "abcdefg";  // 英語文字列
    System.out.println(str2.length());  // 7文字
  }
}
```

# 2. Javaの演算子

## 2-1. 主な演算子一覧

|演算子|説明|種類|
|---|---|---|
|+|加算|算術演算子|
|-|減算|算術演算子|
|*|乗算|算術演算子|
|/|除算|算術演算子|
|%|剰余|算術演算子|
|++|1加算（インクリメント）|算術演算子（単項）|
|--|1減算（デクリメント）|算術演算子（単項）|
|+=|和の代入|代入演算子|
|-=|差の代入|代入演算子|
|*=|積の代入|代入演算子|
|/=|商の代入|代入演算子|
|&|ビットAND|ビット演算子|
|&#x7C;|ビットOR|ビット演算子|
|^|ビットXOR|ビット演算子|
|~|ビットNOT|ビット演算子(単項)|
|<<|ビット左シフト|ビット演算子|
|>>|ビット右シフト|ビット演算子|

## 2-2. ビット演算子の使い方

```Bitop.java
public class Bitop {
  public static void main(String[] args) {
    int n1 = 4;  // ２進数 0100
    int n2 = 5;  // ２進数 0101
    int n;

    n = n1 & n2;  // 0100 and 0101 = 0100
    System.out.println(n);  // 4を出力

    n = n1 | n2;  // 0100 or 0101 = 0101
    System.out.println(n);  // 5を出力

    n = n1 ^ n2;  // 0100 xor 0101 = 0001
    System.out.println(n);  // 1を出力

    n = ~n1;  // ~0100 = 1011
    System.out.println(n);  // -5を出力（0100 の 2の補数）

    n = n1 << 1;  // 0100 を左に1ずらす = 1000
    System.out.println(n);  // 8を出力

    n = n1 >> 2;  // 0100 を右に2ずらす = 0001
    System.out.println(n);  // 1を出力
  }
}
```

# メモ

個人的な備忘として限定公開にしていましたが、参照するのが面倒なので全体に公開とさせていただきました。
限定公開にした理由が思い出せないのですが、おそらく半端な記述があるように思います。
何か間違いなどあればご指摘をいただけると幸いです。