Javaの変数：宣言、代入、参照、初期化

## 変数とは
変数には数値や文字列などを保管することができ、また変数に保管した値を取り出して参照することが出来る。
簡単にいうと変数はデータの入れ物の事になる。
変数という言い方はプログラミングでの言い方でオブジェクト指向の考え方に言い直すと属性（情報、データなどの事）を指す。

## 変数の使い方
①変数を作る事を変数を**宣言する**と言う。
宣言するにはデータの入れ物の形である**データ型**と**変数名**を指定する。
```:変数の宣言の書き方
データ型　変数名；
int num;
char c;

//いっぺんに変数を指定したい場合はカンマ(,)で区切って二つ以上指定する事が出来る
データ型　変数名,変数名,変数名；
int year,month,day;
```
②宣言した変数に値を入れる事を**代入する**という。
```:代入の書き方
変数名　＝　値;
age = 20;

// サンプルコード
int age;
age = 20;
// 変数ageを宣言し、20という値を代入している。
```
宣言した変数に何も値を代入していない場合、データ型がintの場合は0、Stringの場合は""(空欄)、booleanの場合はfalseなどの**初期値** (デフォルト値)という値が入っている。

③変数の中身（値）を見ることを**参照する**という。
参照するとき（変数の中身をみる時）は下記の様に変数名をプログラムに記入する
```
int month = 9;
int day = 16;
    
System.out.println(month + "月" + day + "日");
```

④宣言と値の代入を同時にする事を**初期化する**という。
初期化を行わずに変数を宣言して作成すると、変数には「初期値」が格納されたままとなっている。 そこで、変数の宣言と同時に適切な値を格納することで「最初から有効な値が入っている」状態にする。 これが「初期化」である。
```:初期化の書き方
データ型　変数名　＝　値；
int age = 20,
String name = "田仲";
```

## メンバ変数とローカル変数
変数はクラスが持つ属性として定義するか、メソッド内で定義するかで**メンバ変数**と**ローカル変数**に分かれる。

**メンバ変数**とはクラスのメンバ(クラスに用意した変数やメソッドを総称してメンバ-と呼ぶ)として定義され、クラス名の直下に記述する変数のこと。メソッドの中の変数と区別をつける為にクラスが持つ属性としての変数としてメンバ変数と呼ぶ。
**フィールド**とも呼ばれ、フィールドはクラス内のメソッドから参照可能な変数になる。
```:例文(フィールドの宣言)
class Point{　←Pointという名前のクラスを宣言
	int x;　←xとyという名前のフィールドを宣言（intはデータ型の名前でxとyがフィールド名になる）
	int y;　　　　　
}
```

**ローカル変数**とはメソッド内で定義される変数のこと。
このローカル変数の有効範囲(スコープ)としてはメソッド内だけなので、他のメソッドから別のメソッドのローカル変数にアクセスすることは出来ず、メソッドを抜けるとそのローカル変数は消滅する。
```
public static void main(String[] args) {
    int a = 0;　←mainメソッド内でaという名前のローカル変数を初期化している
}
```

## クラス(static)変数とインスタンス変数
どちらもオブジェクト（インスタンス）を生成に関係する変数。
**staticとして宣言するかしないかでクラス(static)変数かインスタンス変数に分かれる**

・インスタンス変数はクラスのオブジェクト（インスタンス）を生成したタイミングで作られる変数でクラスのオブジェクト（インスタンス）ごとに管理されている（オブジェクトごとに変数が作られる）。
```:インスタンス変数の宣言
オブジェクト名（変数名）　＝　値；
```
![スクリーンショット 2022-11-03 12.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/1a85c4d6-bfea-078e-f720-ecc3a45973f7.png)

・クラス（static）変数はクラスのオブジェクトの生成（インスタンスの生成）に関係なく作られる変数（クラス変数に最初にアクセスしたタイミングで作られる）。
そのためクラスのオブジェクトに関係なく共通で管理している（共通で一つの変数が作られる）
```:クラス変数の宣言
クラス名.変数名　＝　値；
```
![スクリーンショット 2022-11-03 12.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/341a9b81-61d8-6c54-6755-ed0f59e9cec8.png)

### 例文
```:実行用クラス
public class StaticSampleMain {

    public static void main(String[] args) {
        
        StaticSample sample1 = new StaticSample();
        sample1.numPrint();
        
        StaticSample sample2 = new StaticSample();
        sample2.numPrint();
    }
}
```
```:設計図クラス
public class StaticSample {
    
     // インスタンス変数
    public int instanceNum = 0;
   
     // static変数（クラス変数）
    public static int staticNum = 0;
    
    public void numPrint() {
        // インスタンス変数を加算
        instanceNum++;
        // static変数を加算
        staticNum++;
        
        System.out.println("インスタンス変数の値:" + instanceNum);
        System.out.println("static変数の値：" + staticNum);
    }
}
```
```:出力結果
インスタンス変数の値:1
static変数の値：1
インスタンス変数の値:1
static変数の値：2
```
プログラムを実行した結果、インスタンス変数は、クラスのオブジェクト（インスタンス）毎に管理している変数のため、出力結果はいずれも「1」。

static変数は、クラスのオブジェクト（インスタンス）に関係なく共通で管理している変数のため、出力結果は「sample1.numPrint()」のときは「1」、「sample2.numPrint()」のときは「2」と、sample1のオブジェクト（インスタンス）とsample2のオブジェクト（インスタンス）で値を共有している。

static変数は、静的な変数であり、オブジェクト毎に管理しているインスタンス変数とは違い、**static変数の実体は1つとなる。**

＊静的とは「1つのみ存在する」、動的とは「インスタンスが生成されることで生まれ、いくつでも存在しうる」という意味。

### 参考記事
https://www.youtube.com/watch?v=YkD9mo5RVio&t=247s
https://www.youtube.com/watch?v=P9CVQ6IuquM&t=661s