(備忘録)Javaの変数

# 概要
* JavaとRubyでは変数の扱い方が大きく異なり、その違いや使い方を覚えておきたい。

# 目的
* データ型の理解
* 変数の理解


# プログラミング言語の分類
* 変数の扱い方により、プログラミング言語は大きく、「動的型付け言語」と「静的型付け言語」の２種類があ流。
* Rubyは「動的型付け言語」、Javaは「静的型付け言語」の代表例

# データ型とは？

* 変数に格納するデータの種類のことをデータ型という。
* 例えば、Rubyの場合、「数値としての1」と「文字としての1」はプログラムの上では異なるものとして扱われる。
* データ型は、このような「数値」や「文字」といった種類をより細かく定めたもので、Javaの基本データ型には8つの種類がある。



# データ型が必要な理由
* データ型はコンピュータのリソースを効率よく使うための仕組み。
* プログラムを実行すると、変数の値はコンピュータ内の「メモリ」と呼ばれるパーツに保存されるが、データ型があることで、このメモリを効率よく使用することができる。
* メモリとは、イメージで例えると、データを入れるための箱が連続して並んでいるもの。
* 箱の中に、数値を入れて保存したり、取り出して使用するが、この際の数値は、人間が普段使っている「10進数」ではなく「2進数」に変換してから扱われる(現在のコンピュータでは、性質上2進数しか扱えないため)


:::note 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843483/8d619626-7dde-37fa-8ae6-ab7bd59cb7c0.png)										
メモリは、データを入れるための箱が連続して並んでいるもの
:::

:::note 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843483/43632ddc-86f9-9973-7c4a-579019e7bd9f.png)			
例えば、10進数の「100」は、2進数では「1100100」になり、これをメモリに格納すると上のようになる。
:::

##### 格納する数値が大きくなると、以下のように桁数も増える。

|10進数  |2進数  |
|---|---|
|100  |1100100  |
|10,000  |10011100010000  |
|1,000,000  |11110100001001000000  | 

* 箱の数を多めに用意しておけば大きな数値でも格納できるが、その中に小さな数値を入れると無駄が生じる。
* データ型は、この無駄を少なくするための仕組みであり、「使用する変数」に「どのような範囲の値を格納するのか」事前に決め、それに適した数の箱を確保することでメモリを効率的に使用できるようにしてくれる。

# 基本データ型の種類
* Javaの基本データ型は8種類

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843483/b6b7cd80-1f7b-ba8d-2fff-396be9878c94.png)

* 使用頻度が高いのはint型とlong型
* 小さめの数値を扱うint型では「32bit」、大きめの数値を扱うlong型では「64bit」のメモリを使用する
* Javaで変数を使用する際は、変数をどのデータ型として扱うのかプログラムに伝えるため、あらかじめ「宣言」してから使用。
* その反面、Rubyでは変数を使用し始める際に、データ型を宣言せず、変数を使用する。
:::note
Rubyで型の宣言が不要なのは、RubyとJavaではデータ型の扱い方が大きく異なるためである。
:::



# RubyとJavaにおいて、データ型の扱い方の違い

### 動的型付け言語
* 動的型付け言語は、プログラムの実行時に変数のデータ型を決定する方式。
* Rubyはこちらに含まれる。
:::note
イメージの例
```Ruby
a = 1
puts(a * 2)
# 2と出力される

a = "ruby"
puts(a * 2)
# rubyrubyと出力される
```
:::

* aに「1」が代入されている場合 = 数値演算が行われ、「2」と出力される。
* 一方、「"ruby"」が代入されている場合 = 文字列操作が行われ、「rubyruby」と出力される。
* つまり、Ruby(動的型付け言語)では、どのような値が代入されたかによって、変数のデータ型が柔軟に変更され、そのデータ型に基づいて処理が行われている。

### 静的型付け言語

* 静的型付け言語は、変数のデータ型を最初に決定したら変更できない仕組み。
* Javaはこちらに含まれる。
* 例えば、最初に「整数」として宣言した変数に、「文字列」を代入しようとするとエラーになる。

:::note
柔軟性なく不便に見えるが、処理が高速になったり、データ型の不整合によるエラーを実行前に検知できるなどのメリットもある！
:::
* Javaは静的型付け言語なので、変数を使用し始める際は「型の宣言」が必要になる。

# Java変数を理解する
* 変数の役割は、JavaもRubyと同じ。
* ただし、Javaでは「宣言」を行わないと変数を使うことはできない。


# 変数の宣言と使い方

:::note
変数を宣言のするため、型名に続けて変数名を記述。
```java
型名 変数名;
//行末に;（セミコロン）」がつく。
```
:::

* Javaでは、命令の終わりにセミコロンが必要&書き忘れるとエラーになる。
* 宣言した後の変数は、Rubyと同様に使える。

:::note
コードの例
```java
class Main {
  public static void main(String[] args) {
    int radius;
//int radius;によって、int型の変数radiusを宣言
    radius = 10;
//radius = 10;によって、変数radiusに整数の10を代入
    System.out.println(radius * radius * 3.14);
//System.out.printlnは、（）で囲んだ中身を出力するメソッドで、Rubyのputsに相当
  }
}
```
:::

:::note warn
ただし、Javaには「型推論」と呼ばれる仕組みで、宣言に関するコードを省略できる。
:::

# 型推論の理解

:::note
型推論を利用した変数の宣言方法
```java
var 変数名 = 値;
```
:::

* 「var」を使って宣言を行い、初期値を代入。
* この記述を行うと、値の種類によってデータ型が推論され、推論されたデータ型で宣言が行われる。

:::note
例文
```java
class Main {
  public static void main(String[] args) {
    var radius = 10;
    System.out.println(radius * radius * 3.14);

    System.out.println(((Object)radius).getClass().getSimpleName());
  }
}
//出力
//314.0
//Integer
```
:::

:::note
Javaで変数を使用する際は宣言が必要!
ただし、宣言と同時に初期値を代入する場合は、省略することも可能。
:::