Integer型とint型の違い

# Integer型とint型の違い

私自身プログラミングが非常に浅く、日々新しい言葉に疑問を持ちながらそのうち分かるようになると言われていましたが、一度腹落ちするまで調べました。

# int型（プリミティブ型）
intはJavaのプリミティブデータ型（基本データ型）の一つで、整数を表します。これはメモリに単一の整数値単を直接格納する効率的な方法です。

<details><summary>単一の整数値とは</summary>
単一の整数値とは、1つの整数の値を指します。整数は、数学的には0, ±1, ±2, ±3, ...のような小数点以下がない数のことです。整数は整数型（例: int）で表現され、通常はプログラム内で計算や処理の対象となります。
</details>

## 整数値を直接格納する効率的な方法とは

#### 今、箱の名前を **「年齢」** と宣言しました。

格納するものは「箱のようなもの」としてイメージしましょう。

年齢を扱う基本データ型は整数の「int型」になります。
これでint型の変数を年齢と宣言しました。
```diff_java
public class Main {
    public static void main(String[] args) {
        // int型の変数を宣言して年齢を代入
        int myAge = 40;

        // 変数を使って何かをする（この場合はコンソールに出力する）
        System.out.println("私の年齢は: " + myAge + " 歳です");
    }
}
```

#### 私の年齢は４０歳ですと出力されます。
<br>

:::note alert
 __変数は数字ではありません。__
:::

私は変数をここでいう「４０」と誤認識していました。
「数」と書いていても数ではないです。「myAge」が変数です。

#### int型とIntgerの違いを調べていると思いますので、まず改めてここを腹落ちさせましょう。

## 型と変数と値（リテラル）

![スクリーンショット 2024-02-16 8.11.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536260/8c82460c-b6f7-4a12-41b9-e55ad2be805b.png)

### int型は整数を扱う箱になります。

まず、基本データ型とメモリについて理解していきましょう。

## 基本データ型の種類

### Javaの基本データ型（プリミティブ型）には以下の8つがあります

| 型名 | 類別 | 有効範囲 |ビット数|
|:---:|:----:|:------:|:----:|
| byte | 整数型 | -128 から 127|8ビット|
| short | 整数型 | -32768 から 32767 |16ビット|
| int | 整数型 | -2^31 から 2^31 - 1|32ビット|
| long | 整数型　|-2^63 から 2^63 - 1|64ビット|
| float| 浮動小数点型　|-|32ビット|
| double | 浮動小数点型　|-|64ビット|
|char|文字型|Unicode文字を表現|16ビット|
|boolean|真偽値型|ture　か　false|-|

**基本データ型は、それぞれがメモリ上で直接の値を持ちます。**
**これらは単なる値を保持するだけで、オブジェクトではありません。**
**基本データ型はスタックメモリ領域に保存され、メモリの管理が容易で高速です。**
**ここでは有効範囲は特に深く考えなくて大丈夫です。**

## 基本データ型のメモリ上の動作

![スクリーンショット 2024-02-22 8.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536260/5262bee9-8afb-f050-df93-bb8ea0f08c9a.png)

ここで一度変数を宣言して値を代入してみます。
```java
public class Main {
    public static void main(String[] args) {
        // int型の変数を宣言して収穫量を代入
        int crop = 40;
    }
}
```
変数を宣言するときにこれらの基本データ型を使用し、変数にはそのデータ型に対応する値が直接格納されます。例えば、int crop = 40; という宣言では、cropという変数がint型であり、値として40が直接メモリ上に保存されます。
![スクリーンショット 2024-03-03 23.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536260/8cd89779-152e-b68c-bea2-2fff8ce57435.png)


### メモリの概念
メモリはコンピュータ内のデータを格納する場所です。
変数はメモリ内の特定の場所を指し示します。



### null許容性
基本データ型は、nullを許容できません。これは、基本データ型が単なる値を保持し、オブジェクトとしての性質を持っていないためです。nullはオブジェクトが存在しないことを示す特別な値であり、基本データ型は値そのものを保持するだけで、オブジェクトとしての概念がありません。

<details><summary>nullとは</summary>
null（ヌル）は、プログラミング言語において特定の変数やオブジェクトが存在しないことを示す特別な値です。nullは「何もない」という状態を表現し、変数やオブジェクトが有効なデータを持っていないことを示します。


</details>



# リファレンス型（参照型）

参照型の変数は、実際のデータが格納されているメモリのアドレスを保持します。変数自体が実際のデータではなく、そのデータへの参照（アドレス）を示しています。

<br>
基本的に、プリミティブ型以外のすべての型は参照型です。
主な参照型には、クラス、インターフェース、配列、列挙型、およびジェネリクスが含まれます。

## 参照型の特徴

### メモリ上の動作

参照型の変数が宣言されると、実際のデータはヒープメモリ領域に格納されます。
変数は、そのデータへの参照（アドレス）を持ちます。

![スクリーンショット 2024-02-28 22.24.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536260/fafd37fe-757d-f6f4-1cf4-629a3f04e19a.png)



### null許容性

参照型の変数はnullを持つことができます。nullは、変数が何も指していないことを示します。

![スクリーンショット 2024-03-01 8.37.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536260/9ac55dfe-f64d-5dc8-d9cd-6d34ea433bf6.png)
![スクリーンショット 2024-03-01 8.52.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536260/0e0a0908-da55-cc73-8521-a52e59383cd5.png)

### オブジェクト指向プログラミング

参照型は、オブジェクト指向プログラミング（OOP）の概念に基づいています。オブジェクト指向では、データとそのデータに対する操作を結びつけることが強調されます。

### クラスやインターフェースのインスタンス

クラスやインターフェースのインスタンスは参照型です。これらの型は実際にはヒープ上のオブジェクトとして存在します。

### ガベージコレクション

参照型のオブジェクトは、使用されなくなった場合、ガベージコレクションによって自動的にメモリから解放されます。

:::note 
一通り書きましたが、全部覚えなくてOKです。
オブジェクト指向については他で詳しく出てます。
ガベージコレクションもメモリをやりくりしてくれるもので今はOK
:::


# Integer型について

IntegerはJavaのクラスで、整数をラップ（包む）するためのクラスです。
ラッパークラスといいます。具体的には、intというプリミティブ型の整数を
オブジェクトとして扱うために使用されます。
自動ボクシング（Autoboxing）と呼ばれる機能を提供します。

## ラッパークラス
ラッパークラスは、基本データ型（int、char、boolean など）をオブジェクトとして扱うためのクラスです。プリミティブ型は単なる値であり、オブジェクトではないため、オブジェクトを要求する状況や特定のメソッドを使用する必要がある場合に不都合が生じます。この問題を解決するために、それぞれの基本データ型に対応するラッパークラスが提供されています。

:::note
**Autoboxing機能によってInteger型からint型。**
**int型からInteger型を用いることが可能です。**
:::

# Integer型とint型の違い　まとめ

**・Integerは<font color = red>参照型</font>。int型は<font color = red>基本データ型</font>。**
**・<font color = red>メモリへの格納方法</font>が違う。**
**・Integer型はnullが許容されるがint型は許容されない。**
**・ラッパークラスは<font color = red>Integer型から引数としてint型を要求しても変換してくれる。</font>**
**・その逆の<font color = red>int型から引数としてInteger型を要求しても変換してくれる。</font>**