Java基礎（初心者メモ）

:::note warn
公開設定を誤り公開してしまったが、初心者の勉強日記のため注意
:::

## 基礎の基礎
以下コードは1つのクラスにつき1つ、必須のコード注意。このメソッドの中に一連の処理を記載する。（JVMによって最初に実行されるメソッド）
細かい処理内容などはmainブロック外に別メソッドを作成して、このメソッドの中で呼び出す。

```
public static void main(string[] arg){
    //内容
}
```
## 変数の型変換ルール
小さなデータ型は大きなデータ型へ無条件で変換可能

- 小数>整数
- 整数：long(8バイト)>int(4バイト)>short(2バイト)>byte(1バイト)
- 小数：double(8バイト)>float(4バイト)

:::note warn
注意
longに100が代入されていた場合、値が小さいとしても箱が大きいため、小さい箱のintに型変換は出来ない
:::

大きなデータ型から小さなデータ型へ変換する際はキャストを使う
```
long number1 = 100;
int number2 = (int)number1;
```
キャストすると、小数点が切り捨てられて整数へ変換できる
```
double number1 = 100.5;
long number2 = (long)number1;
```
結果：number2 = 100

## インクリメント/デクリメント
インクリメントまたはデクリメントは、変数の前につけた方が良い。
後ろにつけると、画面に表示された後（実行後）に反映される。
例１）
```
int number = 10;
System.out.println(++number + 1);
```
結果：
12

例２）
```
int number = 10;
System.out.println(number++ + 1);
```
結果：
11

例３）
```
int number = 10;
System.out.println(number++ + 1);
System.out.println(number + 1);
```
結果：
11
13

### 補足
前置インクリメント演算子（++i）と後置インクリメント演算子（i++）はどちらもiにi+1の結果を代入する演算子

`for (int i = 0; i < n; ++i)`
`for (int i = 0; i < n; i++)`

どちらもよく見るforループだが、このように++i, i++が単独で現れ、式の値を使わない場合は動作に関して違いはない。
また最近のコンパイラでは最適化によって実行速度にも違いがないため、好みの方を使えばいい。
※参考
[i++と++iの違い（Qiita）](https://qiita.com/suuungwoo/items/e054fdcb5a4805bb226b)

## エスケープシーケンス
例）
```
System.out.println("こんにちは\nお元気ですか");
```
結果：
こんにちは
お元気ですか
<table>
  <thead>
    <tr>
      <th>記載方法</th> <th>説明</th>
    </tr>
  </thead>
    <tr>
      <td>\b　</td> <td>バックスペース　</td>
    </tr>
    <tr>
      <td>\t</td> <td>水平タブ</td>
    </tr>
    <tr>
      <td>\n</td> <td>改行</td>
    </tr>
    <tr>
      <td>\r</td> <td>復帰</td>
    </tr>
    <tr>
      <td>\f</td> <td>改ページ</td>
    </tr>
    <tr>
      <td>\'</td> <td>シングルクオーテーション</td>
    </tr>
    <tr>
      <td>\"</td> <td>ダブルクオーテーション</td>
    </tr>
    <tr>
      <td>\\</td> <td>\文字</td>
    </tr>
    <tr>
      <td>\ooo</td> <td>8進数の文字コードが表す文字</td>
    </tr>
    <tr>
      <td>\uhhhh</td> <td>16進数の文字コードが表す文字</td>
    </tr>
</table>

## swich構文
break;を記載しないと次のbreak;があるcase文の処理まで飛び上書きされて表示される。
例）
```
int age = 20;
String result = null;

swich(age){
    case():
        result = "私は20代";
    case():
        result = "私は30代";
        break;
    default:
        result = '年齢は秘密♪';
    }
System.out.println(result);
```
結果：私は30代

## 論理演算子
AND
例）
```
int age = 20;
char blood = 'A';
if(age == 20 && blood.equals("A")){
   System.out.println("私の年齢は20歳、血液型はA型です。");
}
```
結果：
私の年齢は20歳、血液型はA型です。

:::note warn
注意
短略評価により、左側の条件が不成立の場合、右側の条件は見られないので注意
:::

OR
例）
```
int age = 20;
if(age == 20 || age == 25){
    System.out.println("あなたの年齢は20歳または25歳ですね？");
}
```
結果：
あなたの年齢は20歳または25歳ですね？

:::note warn
注意
短略評価により、左側の条件が成立する場合、右側の条件は見られないので注意
:::

以下の例のように、条件に!がついている場合は、***まず()内の判定をした後にtrueとfalseが入れ替わる***ため、「ageがage < 7 に当てはまらないけど、反転されるからtrueになる」ことはないので注意。
```
int age = 60;
if (!(age < 7 || age >= 60)) {
    System.out.print("割引適用！！");
} else {
    System.out.print("普通の価格です");
}
```
結果：普通の価格です

後置インクリメント演算子又は後置デクリメント演算子は、変数の現在の値を返した後に、変数の値を1増やす又は減らす。
以下の例では変数yにx++が代入されているが、変数x自体が+1されて6となる。
変数yは実行された後にx++が6となった値が代入されるため、実行直後は5のまま。
例）
```
public class Test {
    public static void main(String[] args) {
        int x = 5;
        int y = x++;
        System.out.println("x = " + x + ", y = " + y);
    }
}
```

## whileループ構文とdo-whileループ構文
***whileループ構文***は、初めから条件を見て繰り返すかを判定したい場合に利用。
例）
```
int number = 1; // 番号(1から始まる) 

while(number <= 10) {
    System.out.println(number + "番目");
    number++; // iに1を加算する 
}
```
結果：
1番目
2番目
3番目
4番目
5番目
6番目
7番目
8番目
9番目
10番目

***do-whileループ構文***は、初めに1度だけ無条件で実行したい処理がある場合に利用する。
例）
```
System.out.println("多い番号順から点呼とります!"); 
int number = 11; // 番号(11から始まる)
do {
    System.out.println(number + "番目");
    number--; // iに1を減算する
}
while(number <= 10 && number >= 1);
```
結果：
10番目
9番目
8番目
7番目
6番目
5番目
4番目
3番目
2番目
1番目

## StringUtilsを使う方法
以下を参考にしてApache Commons Langライブラリをダウンロードし、javaのライブラリに外部JARとして選択。
[java 「Apache Commons Lang」の「StringUtils」を利用してnullと空文字チェックを行う](https://mebee.info/2020/07/20/post-14390/)

## 配列
***配列の宣言、要素の作成と代入（初期化）***
要素の型[] 配列変数名;
配列変数名 = new 要素の型[];
配列変数名[添字（index）] = 値;
```
int[] scores;
scores = new int[5];
scores[1] = 100;
```
引数など、とあるデータによって表示する配列の値を変えたい場合に使うと良い。
```
int a = 1; //どこかから受け取った値
String[] customer;
customer = new String[5];
switch(a){
    case(1):
        customer[0] = "山田　太郎";
        customer[1] = "xxx@mail.com";
        break;
    case(2):
        customer[0] = "山田　太郎";
        break;
}

for(int i = 0; i < customer.length; i++){
	// nullではない場合のみ表示する
	if(customer[i] != null) {
		System.out.println(customer[i]);
	}
}
```
省略記法{}は、初めから中身が決まっている場合に使う。
宣言と同時に初期化する方法でないと、上記方法を真似してもコンパイルエラーとなる。　
NG例）
```
int a = 1; //どこかから受け取った値
String[] customer;
switch(a){
    case(1):
        customer = {"佐藤","加藤","遠藤"};
        break;
    case(2):
        customer = {"佐藤","加藤"};
        break;
    default:
        customer = {"不明"};
        break;
}
for(int i = 0; i < customer.length; i++){
	// nullではない場合のみ表示する
	if(customer[i] != null) {
		System.out.println(customer[i]);
	}
}
```
OK例）
new（初期化）すれば可能。
ただ、初期化と同時に値を入れているため、***後から要素数を増やして値を追加することが出来ない***ので注意。
```
int a = 1; //どこかから受け取った値
String[] customer;
switch(a){
    case(1):
        customer = new String[]{"佐藤","加藤","遠藤"};
        break;
    case(2):
        customer = new String[]{"佐藤","加藤"};
        break;
    default:
        customer = new String[]{"不明"};
        break;
}

for(int i = 0; i < customer.length; i++){
	// nullではない場合のみ表示する
	if(customer[i] != null) {
		System.out.println(customer[i]);
	}
}
```

#### 省略記法1
要素の型[] 配列変数名 = new 要素の型[] {値1,値2,値3};
```
int[] scores = new int[] {20,30,40,50,80};
```
#### 省略記法2
要素の型[] 配列変数名 = {値1,値2,値3};
```
int[] score = {20,30,40,50,80};
```
### 配列の初期値について
数値のデータ型（int,byteなど）の配列の値は、0が初期値。
boolean型はfalse。
char型は''(空文字)。
String型はnull。
```
String[] text = new String[5];
System.out.println(text[2]);　
// nullが表示される。
```

## 拡張for文
初めから終わりまでを繰り返す。
```
String[] customer = {"佐藤","加藤","遠藤"};
for(String Name : customer){
    System.out.println(Name);
}
```

## 参照型変数
配列やオブジェクトの場所情報が入った変数は「参照型」と呼ばれる。
int型などの基本データ型とは異なり、
値が置いてある場所を示す(参照型の)値を保持する変数を 参照型変数という。
※値を保存しているアドレス
そのため、参照型変数を新たな変数に代入し、その変数を上書きしてしまうと参照元変数の中身まで上書きされる。
例）
```
int a[] = {1};
int b[] = a;
b[0] = 2;
System.out.println(a[0]); // => 2を返す
```
[【Java】参照型とは？](https://qiita.com/shunsuke227ono/items/07c08cf5640564f7739c)

[参照型とプリミティブ型について](https://qiita.com/hiroki-harada/items/cb6fa4affffab2019cde)

参照値そのものを代入した場合、参照値が更新される。
```
public static void main(String[] args) {
    int[] array = { 0 };
    System.out.println(array[0]);   // => 0
    method1(array);
    System.out.println(array[0]);   // => 0
}

static void method1(int[] a) {
    int[] other = { 10 };
    a = other; // otherは参照値のため、arrayの参照値を見ていたaは、
    　　　　　　　　　　　　　　　　　　　　　　　　　　　　otherのアドレスを参照することになる。
}
```
参照値が示す値を更新した場合、参照値が示す値が更新される。
```
public static void main(String[] args) {
    int[] array = { 0 };
    System.out.println(array[0]);   // => 0
    method2(array);
    System.out.println(array[0]);   // => 100
}

static void method2(int[] a) {
    a[0] = 100;　// aはarrayの参照値を持っており、
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　参照値が示す値(添え字0の値)を更新しているため、
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　arrayの値も更新されることになる。
}
```

## 可変長引数
可変長引数とは
Java言語における可変長引数は、メソッドに任意の数の引数を渡すことができる機能。
メソッドの定義側では配列と同じように扱う。
また、呼び出し側で直接配列を指定することも可能。
```
例）static void Sample(String... name) {}
```
```
// メソッド呼び出し側
例）Sample("111", "abc", "aiueo");
```

## for文
continue;ループをスキップする
break;ループを中止する
```
continue例）
String[] strArray = {"a","b","c"};
String str = "b";

for (int i = 0; i < strArray.length; i++) {
            if (strArray[i].equals(str)) {
                continue;
            }
            System.out.println(strArray[i]);

// 結果：
// a
// c
```
以下は少し難しい。
[ラベル付きcontinue文、break文の使い方](https://kanda-it-school-kensyu.com/java-basic-intro-contents/jbi_ch07/jbi_0707/)

「nextInt()について」（https://miki-prosho.com/?p=1154#toc1）

##