【 Java 】Javaとは/基本文法

# Javaとは
Javaは、オブジェクト指向プログラミング言語のひとつ。1995年にSun Microsystemsのエンジニアチームによって開発・初公開された。

※後にSun Microsystemsは、Oracle Corporationによって買収された。

## 特徴
### オブジェクト指向
クラスとオブジェクトの概念を重視しているため、プログラムのモジュール化、再利用性、保守性が高い。

###  プラットフォーム
JVM上で実行されるため、ソースコードを再コンパイルせずにさまざまなプラットフォームで動作する。そのため、ポータビリティが高い。

### 豊富な標準ライブラリ
豊富な標ライブラリが付属しており、データ構造、入出力、ネットワーキング、GUIなど多くの機能をサポートしている。

### セキュリティ
セキュリティを重視しているため、安全なコンピュータプログラムの開発をサポート。Java仮想マシンは、サンドボックス環境を提供し、不正な癖すやメモリの競合を防止。

### マルチスレッドサポート
複数のスレッドを同時に実行することができるため、並行処理を行うアプリケーションの開発が容易。



# Javaコードの実行方法
コマンドプロンプトより操作。

カレントディレクトリに移動し、以下のコマンドを順に実行する。

### 1.コンパイル
```
javac [実行するファイル名(`.java`拡張子含む)]
```
`.class`拡張子のバイトコードファイルが生成される。

### 2.実行
```
java [実行するファイル名(拡張子なし)]
```
実行結果が表示される。

# 命名方針

|変数名|すべて小文字|
|--|--|
|定数名|すべて大文字|
|クラス名|Pascal記法|
|メソッド名|camelCase記法|

# 基本データ型の種類
|boolean|true/false|
|--|--|
|byte|8ビット整数|
|short|16ビット整数|
|int|32ビット整数|
|long|64ビット整数|
|float|32ビット単精度不動小数点数|
|double|64ビット倍精度不動小数点数|

## リテラル
リテラルとは、プログラム中に記述された具体的な値。

〇整数（int型）リテラル
```java:
int integerLiteral = 123;
```

数値リテラルは、それだけではどんな意味を持つ数値か分からず、ソースコードが難読化してしまう。そのため、変数として名付けて管理する。

数値リテラルは、`マジックナンバー`（意味は分からないがコードは正常に動作する、魔法の数字）とも呼ばれる。
〇整数（long型）リテラル

```java:
int longLiteral = 10000000L;
```
`L`を最後に付ける。
〇少数点数（double型）リテラル
```java:
double doubleLiteral = 3.14;
```
〇少数点数（float型）リテラル
```java:
float floatLiteral = 1.08F;
```
`F`を最後に付ける。
〇文字列（char型）リテラル
```java:
char charLiteral = 'こんにちは';
```
`シングルクォーテーション`で囲う。
〇文字列（String型）リテラル
```java:
String stringLiteral = "こんばんは";
```
`ダブルクォーテーション`で囲う。
〇論理値（boolean型）リテラル
```java:
boolean booleanLiteral = false;
```

# データ型の変換
条件を満たしていれば、代入元の値の型と代入先の型に食い違いがあっても、内部的に`自動型変換`が行われる。

## 変数における自動変換

< 条件 >
・代入元と代入先が共に整数型または小数点数型
・変数の大きさ（許容メモリサイズ）が代入先の型＞代入元の型

< どうやって自動変換されるか >
代入先の型と同じ型の変数を作り、代入元のデータを詰め替える。

< オーバーフロー >
オーバーフローとは、代入しようとすると桁があふれてエラーになること。代入先の許容メモリが小さいと、代入元の変数が入らない。

## 算術演算子における自動変換

・整数同士であれば一番大きな型に揃えて演算される
・小数点数を含む演算は、整数もdoubleに揃えて演算される
・文字列を含む足し算は文字列の連結となる

## キャスト
`キャスト演算子`を使うと`一時的な型変換`ができる。
例）代入する瞬間だけlong型をint型として扱う。
```java:
long x = 5;
int y = (int)x;
```

## 文字列⇔整数の変換
文字列型⇔整数型など、データの種類が違う型の変換を行う際は、特殊なメソッドを使用する。
〇整数←文字列
```java:
String x = "5";
int y = Integer.parseInt(x);
```
〇文字列←整数
```java:
int x = 5;
String y = String.valueOf(x);
```



# エスケープシーケンス
文字列リテラル内で特別な文字を表現するための特別な文字列。`""`で囲まれた文字列ではなく、`\`で始まり、その後に特別な意味を持つ文字が続く。

以下のエスケープシーケンスを使用することで、文字列内に特殊な文字を含めたり、文字列を複数行にまたがって記述できる。

`\n`：改行文字
`\t`：タブ文字
`\'`：シングルクォート文字
`\"`：ダブルクォート文字
`\\`：バックスラッシュ文字
`\r`：復帰文字
`\b`：バックスペース文字
`\f`：フォームフィード文字

例）
```java:
System.out.println("Hello\nWorld");
System.out.println("He said, \'Hello\'");
```

# 配列
```java:
String[] sweets = new String[3];
sweets[0] = "アイス";
sweets[1] = "ケーキ";
sweets[2] = "パフェ";

String x = sweets[1];
System.out.println("要素の参照：" + x );

int count = sweets.length ;
System.out.println("要素数：" + count );
```
簡単に配列を定義
```java:
String sweets = new String[]{'アイス','ケーキ','パフェ'};
String sweets = {'アイス','ケーキ','パフェ'};
```
多次元配列
```java:
int[][] rooms = {{11,12,13}, {21,22,23}, {31,32,33}};
System.out.println("rooms[1][2]:" + rooms[1][2]);
System.out.println("rooms[1],length:" + rooms[1].length)+
```

# 2種類の型

## プリミティブ型（基本データ型）
値をひとつだけ入れられる箱。

箱の大きさ（変数を作るために必要なメモリ領域）が決まっている。

|種類|データ型|サイズ|
|--|--|--|
|整数|byte|1バイト|
||short|2バイト|
||int|4バイト|
||long|8バイト|
|少数点数|float|4バイト|
||double|8バイト|
|文字|char|2バイト|
|論理値|boolean|1バイト|

## 参照型（参照型）
値を持っている変数の場所情報。

箱の大きさが決まっていない。

# String型と参照型の違い
１文字＝２バイト必要。

## 疑似プリミティブ型
String型変数はプリミティブ型のように`型名 変数名`で生成することができるが、これはString型が特殊なだけで、本来参照型の変数はこの方法で生成できない。

〇String型の正式な生成方法
```java:
String data = new String("データ");
```

String型はプリミティブかのように使用されることが多いため、プリミティブ型と同じような感覚で扱えるように特別なプログラムが作成された。

String型は文字列を内部的にchar型配列で管理。String型の変数が参照された際は、配列で管理している文字をすべて取得・結合した値を参照元に渡す処理を内部的に行うことでプリミティブ型にみせている。

## String同士の比較
参照型であるString型同士を`==`で比較すると、場所情報の比較になるため、それぞれの文字列データが等しいかは比較ができない。

データを比較する場合は`equals`を使用する。
```java:
sweets1.equals(sweets2)
```

# コマンドライン引数
コマンドライン引数とは、javaプログラムを実行する際にプログラムを渡すことができる追加情報やパラメータのこと。これにより、プログラムが実行される際に、外部から情報を受け取れる。

```java:
java Sample ドーナツ ホットケーキ クッキー
```
自動的にString型の`args`配列に代入される。
※配列名は`args`と定められている。
→ファイルでわざわざ配列と要素を宣言しなくても取り出せる。
```java:
System.out.println("好きな食べ物は"  args[0]);
```
# クラスブロック
特定の目的を達成するためのコードをまとめたもの。
```java:
public class クラス名 {
    //　クラスのメソッドやフィールドを記述
}
```
# メソッドブロック
クラスの中で特定の処理を行うために必要なプログラムをまとめたもの。
```java:
public class クラス名 {
    publick void メソッド名 {
        // メソッドの処理を記述
    }
}
```

# フィールド
クラスの中でデータの値を定義する。
```java:
public class クラス名{
    private データ型 フィールド名;
} 
```


## final
`final`を使用することで、安全性やパフォーマンスが向上。
### 1.変数の修飾
`final`を使用して変数を修飾ですると、その変数は一度初期されたら、再代入ができなくなす。

```java:
final int result = 10 * 3;
```

### 2.メソッドの修飾
メソッドを`final`で修飾すると、そのメソッドをサブクラスでオーバーライドすることができない。
```java:
class Parent {
    final void display() {
        System.put.println("Parent's desplay method");
    }
}
```

### クラスの修飾
`final`でクラスを修飾すると、そのクラスを継承・サブクラスとして拡張できない。
```java:
final class クラス名 {
    // クラスの定義
}
```

# 繰り返し

### 構造化プログラム
構造化プログラムは、以下のプログラム構造を組み合わせて開発する。
・`順次`：コードを上から順に処理
・`選択`：条件によって処理を分岐
・`反復`：ある処理を繰り返す

### 制御構文
条件に応じて処理を分岐する`分岐構文`、ある条件の元で処理を繰り返す`繰り返し処理`に分類できる。

## for
```java:
for (初期化; 条件; 更新) {
    // 処理
}
```
・初期化・・・反復処理の最初に一度だけ実行される。通常、反復処理を制御するためのカウンター変数の初期化を行う。

ここで定義された変数を`カウンター変数`という。

・条件・・・定義した条件がtrueの場合は処理を実行、falseの場合は反復を修了。
・更新・・・各反復の最後に実行され、通常はカウンタ変数を更新する。

例）
```java:
for (int i = 1; i <= 10; i++) {
    System.out.println(i);
}
```
```java:
public class Main {
    public static void main(String[] args) {
        // 配列の定義と初期化
        String[] sweets = {"プリン", "ケーキ", "パフェ", "モンブラン", "チョコレート"};

        // 配列の要素を順番に表示する
        for (int i = 0; i < number.length; i++) {
            System.out.println("要素" + (i + 1) + "：" + numbers[i]);
        }
    }
}
```

## while

```java:
while (条件) {
    // 条件が真の場合に実行される処理
    // ステートメント
}
```
例）
```java:
public class Main {
    public static void main(String[] args) {
        int i = 1;
        while (i <= 5) {
            System.out.println(i);
            i++;
        }
    }
}
```

## do-while
```java:
do {
    // 条件が真も場合に実行される処理
    // ステートメント  
} while (条件);
```
例）
```java:
public class Main {
    public static void main(String[] args) {
        int i = 1;
        do {
            System.out.println(i);
            i++;
        } while (i <= 5);
    }
}
```
# 条件分岐
```java:
if (条件1) {
    // 条件が真の場合に実行される処理
    // ステートメント
} else if (条件2) {

} else {

}
```

例)
```java:
public class Main {
    public static void main(String[] args) {
        int number = 10;

        if (number > 0) {
            System.out.println("numberは正の値です。");
        } else if (number < 0) {
            System.out.println("numberは負の値です。");
        } else {
            System.out.println("numberはゼロです。");
        }
    }
}
```

# その他の制御構文

## break
例）
```java:
String print1 = "";

for(int i = 0 ; i < 10 ; i ++) {
    if(i == 5){
        break;
    }
    print1 += i + "";
}
```

## continue
繰り返し処理を中断し、次の繰り返し処理に移る。
例）
```java:
String print2 = "";

for(int i = 0; i < 10 ; i ++){
    if( i == 5 ){
        continue;
    }
    print2 += i + "";
}
```
## ラベル
ラベルは、コード内の特定の位置に名前をつけることができる。さらに、その名前を使用して他の場所から、その位置にジャンプすることができる。主にループや条件分岐などの制御構造の中で使用される。
例）
```java:
//outerLoopという名前のラベルを定義
outerLoop:for (int i = 0; i < 3; i++) {
    innerLoop:for (int j = 0; j < 3; j++) {
        if (i == 1 && j == 1) {
            break outerLoop: //outerLoopのついたループから抜ける
        }
        System.out.println("i=" + i + ", j=" + j):
    }
}
```

## switch
例）
```java:
public class Main {
    public static void main(String[] args) {
        int dayOfWeek = 2;

        String dayName;
        switch (dayOfWeek) {
            case 1:
                dayName = "Monday";
                break;
            case 2:
                dayName = "Tuesday";
                break;
            case 3:
                datName = "Wednesday";
                break;
            case 4:
                datName = "Thursday";
                break;   
            case 5:
                datName = "Friday";
                break;
            default:
                dayName = "Invalid day";
                break;
        }
        System.out.println("Day of the week is:" + dayName)
    }
}
```

# 参考・引用
https://www.javadrive.jp/start/const/index2.html#section3

https://www.javadrive.jp/start/var/index4.html

https://qiita.com/rkonno/items/1b30daf83854fecbb814

https://java-code.jp/category/syntax