[個人用]Java Gold SE7試験範囲ポイントまとめ[随時追記]

個人メモ用

# **1章.Javaクラス設計**
- **switch**
    - `扱えないデータ型`  
      - double,Double,long,Long

    - `ラッパークラス使用時注意`  
      - 初期値はnullなので、そのまましようとするとヌルポで落ちる。

    - `文字列での分岐`  
      - Stringの`hashCode()`と`equals()`の順で比較される。  
      - 大文字小文字は区別される。

```java
public class Sample {
    static int num1;
    static Integer num2;

    public static void main(String arg[]) {
        // 基本データ型は初期化されるので0になる
        switch (num1) {
        case 0:
            System.out.println(0);
            break;
        default:
            System.out.println(1);
            break;
        }

        // ヌルポで落ちる
        switch (num2) {
        case 0:
            System.out.println(0);
            break;
        default:
            System.out.println(1);
            break;
        }
    }
}
```

```shell-session
// 結果
[skanehira@MacBook java]$ java Sample
0
Exception in thread "main" java.lang.NullPointerException
        at Sample.main(Sample.java:17)
[skanehira@MacBook java]$
```

---

- **拡張されたリテラル**
    - `_(アンダースコア)がある整数リテラル`  
      - 先頭及び末尾、記号の前後は利用できない。

---

- **アクセス装飾子とカプセル化**  
    - `カプセル化`  
      - メンバ変数にprivate、GetterとSetterにpublicをつけることで、  
        メソッドを通してしかデータにアクセスできないようにする。
    - `protectedとprivateはメソッドのみ使用できる`
    - `アクセス範囲（下表）`

|　アクセス装飾子 | 意味 |
|:-:|:-:|
| public  | どこからもアクセス可能  |
| protected  |  同一パッケージか継承したクラスからのみアクセス可能 |
| 指定なし  | 同一パッケージからのみアクセス可能  |
| private  | クラス内からのみアクセス可能  |

---

- **finalとstatic装飾子**  
    - `staticメンバの呼び出し方`  
      - クラス名.staticメンバ  
      - 変数名.staticメンバ  

    - `インスタンスとstaticメンバのクラス内の直接アクセス`  
      - static → instance　はNG  
      - instance → static　はOK

    - `final装飾子`

| 適用箇所 | 意味 |
|:-:|:-:|
| 変数  |  定数になる |
| メソッド  | オーバーライドできなくなる  |
| クラス  | 継承できなくなる  |

---

- **イニシャライザブロック**  
    - `staticイニシャライザ`  
      - クラスがロードされる時に一度だけ実行されるブロック。
    - `イニシャライザ`  
      - インスタンス化する時に、コンストラクタが呼ばれる前に実行されるブロック。
    - `実行の順番`  
      - staticイニシャライザ→イニシャライザ→コンストラクタ。

```java
public class Sample {
    public static void main(String arg[]) {
        new Init();
    }
}

class Init {
    // staticイニシャライザ
    static {
        System.out.println("static initializer");
    }

    // イニシャライザ
    {
        System.out.println("initializer");
    }

    // コンストラクタ
    Init() {
        System.out.println("construct");
    }
}
```

```shell-session
// 実行結果
[skanehira@MacBook java]$ java Sample
static initializer
initializer
construct
```

---

- **列挙型**
    - `Enum`  
      - enumを定義した場合、java.lang.Enumクラスを継承したfinalクラスになるため継承できない。  
      - 定義した変数は自動的に`public static final`がついてクラス定数になる。  
      - newによるインスタンス化はできない。  
      - インターフェイスを実装できる。  
      - Comparableインターフェイスを実装しているため、定義した変数の順番は保証される。

    - `列挙型でのコンストラクタ・変数・メソッド定義`  

```java
public class Sample {
    public static void main(String arg[]) {
        // toString(): 定数名が返却される
        System.out.println(Status.ACTIVE);
        System.out.println(Status.STOP);

        // 定義したメソッド
        System.out.println(Status.ACTIVE.getNum());

        // ordinal(): 定数の位置を返却
        // 定義した順から0,1,2...
        System.out.println(Status.ACTIVE.ordinal());
        System.out.println(Status.STOP.ordinal());

        // values(): 定義した定数一覧を取得
        for (Status s : Status.values()) {
            System.out.println(s);
        }

        // valueOf(): 定義した定数のオブジェクト取得
        Status active = Status.valueOf("ACTIVE");

        // name(): 定数名を取得
        System.out.println(active.name());
    }
}

enum Status {
    // コンストラクタにintを渡して、Status型のObjectをnewしている
    ACTIVE(0), STOP(1);

    // 変数を定義
    private int num;

    // コンストラクタ
    Status(int n) {
        this.num = n;
    }

    // メソッド
    public int getNum() {
        return num;
    }
}
```

```shell-session
// 結果
[skanehira@MacBook java]$ java Sample
ACTIVE
STOP
0
0
1
ACTIVE
STOP
ACTIVE
```

---

- **Objectクラス**
    - `toString()`  
      - オーバーライドする時は`public`をつける（よく忘れる…）

    - `finalize()`  
      - ガベージコレクタによってオブジェクトが破棄される前に実行される。  
      - 実施タイミングは指定できず、VMが適当にやってくれる。  
      - superのfinalize()は明示的に呼び出す必要がある。

    - `equals()とhashCode()`  
        - `equals()`は同じオブジェクトかどうかを比較する  
            Stringクラスの場合は同じ文字かどうかを比較する
        - オーバーライド時のルールは以下。  
          `equals()`がtrue時、`hashCode()`は同じ値を返す  
          `hashCode()`が異なる値の場合、`equals()`はfalseを返す  
          `equals()`がfalseでも、`hashCode()`はどちらもでもOK。

---

- **staticインポート**
    - 構文  
    `import static パッケージ名.クラス名.*;`  
    `import static パッケージ名.クラス名.staticメソッド;`  
    `import static パッケージ名.クラス名.static変数;`

```java
import static java.lang.System.out;

public class Sample {
    public static void main(String arg[]) {
        out.println("import static");
    }
}
```

```shell-session
// 結果
[skanehira@MacBook java]$ java Sample
import static
```

---

# **ポリモフィズム**
- **継承**
    - `オーバーライドと隠蔽`  
        - オーバーライド  
          - アクセス装飾子は親クラスと同等か、それ以上広くなければいけない。  
          - 戻り値、メソッド名、引数の数、順番は完全一致でなければいけない。  
        - 隠蔽  
          - staticメンバーをオーバーライドした時、変数の型によってアクセス先が決まる。  
          - 非staticメンバーは、インスタンスの型によって、アクセス先が決まる。

    - `可変長引数`  
      - 構文は`データ型...`である。  
      - 引数リストの最後尾に定義しなければいけない。  
      - １つしか定義できない。
      - 引数を渡さない場合は空の配列になる。
      - nullを渡した場合は、`string`もしくは`[]string`にキャストしないと警告がでる。
      - 引数リストを明示的に定義したメソッドが優先的に呼ばれる。

    - `可変長引数とオーバーロード`  
      - オーバーロード時引数は以下の優先順位で判定される。  
        `完全一致 → 暗黙の型変換 → AutoBoxing → 可変長変数`
      
    - `thisとsuper`  
      - コンストラクタが定義されていない場合、コンパイル時に引数なしのコンストラクタが定義される。  
      - コンストラクタが定義されている場合、コンパイル時に引数なしのコンストラクタを定義されない。  
      - サブクラスのコンストラクタに`super()`もしくは`super(引数あり)`がない場合は、  
        コンパイル時に引数なしの`super()`が定義される。  
      - `this`と`super`はコンストラクタの先頭に定義しなければいけない。  

---

- **抽象クラス**
    - `抽象クラスとは`
       - abstractをつけたクラスのこと。
       - 抽象メソッド（abstractをつける）と具象メソッド（実装あり）を定義することができる。
       - インスタンス化できない。

    - `抽象クラスの継承クラス`
      - 抽象メソッドはオーバーライドしなければいけない。
      - 抽象クラス同士の継承はできる、その際抽象メソッドのオーバーライドはしなくて良い。
      - すべての抽象メソッドを実装する必要がある。

    - `抽象クラスのstaticメンバ定義`</summary>
      - 抽象クラスに定義したインスタンスメンバは、実装した抽象メソッドから呼び出すようにする必要がある。
      - staticメソッドは、他同様`クラス名.staticメンバ`で呼び出せる。

---

- **インターフェイス**
    - `インターフェイスとは`
      - 抽象メソッドとstatic変数のみを定義できる。
      - publicなstatic変数を定義できる。
      - サブインターフェイスを定義できる。

    - `定数とメソッド`
      - static変数は強制的に`public static final`がつくので、宣言時に初期化する必要がある。
      - メソッドは強制的に`public abstract`がつくので、オーバーライド時は`public`を必要がある。

    - `実装クラス`
      - extendsとimplementsを同時に使用できるが、extendsを先に書く必要がある。

    - `継承`
      - 多重継承（`subIF extends XIF, YIF{}`）と多重実装（`class A implements XIF, YIF{}`）ができる

---

- **型変換**
    - `基本データ型の型変換ルール`
        - 暗黙  
          - `byte`→`char or short`→`int`→`long`→`float`→`double`  

        - キャスト  
          - 暗黙型変換とは逆順

        - 注意  
          - データサイズが型に収まれば、`byte,short,char`型にそのまま代入できる。
          - 演算子で計算する場合、片方Aがdouble,float,long,intの場合は、  
            片方Bがそれよりも小さいデータ型であれば、片方Aのデータ型に変換される。

    - `参照型の型変換ルール`
        - 暗黙  
          - サブクラスのインスタンスをスーバークラスの変数で扱える。

        - キャスト  
          - サブクラスのインスタンスをスーパークラスの型に変換できる。
          - 逆はできない。（スーパークラスはサブクラスを含んでいないから）

        - 注意
          - 継承関係にないクラスは型変換できない。

---

# **ネストクラス**
- **ネストクラス**
    - `とは`
      - クラス中で定義するクラスのこと。
      - 外側クラスのメンバの一つであるため、アクセス修飾子、abstract、finalを使用できる。
      - staticと非staticネストクラスがある。非staticクラスはインナークラスと呼ぶ。

    - `ルール`
      - 外側クラスの同じ名前は使用できない。
      - アクセス修飾子、abstract、finalを使用できる。
      - staticクラスは非staticメンバとstaticメンバを持つことができる。  
        外側クラスのインスタンス変数にアクセスできない。
      - インナークラスは、staticメンバを持つことができない。
        外側クラスのインスタンス変数にアクセスできる。

    - `定義とコンパイル`
      - ネストクラスもコンパイルされるので、生成されるクラスファイルは`外側クラス名$ネストクラス名.class`になる。

    - `ネストクラスへのアクセス`
      - `外側クラス.非staticクラス名 変数名 = new 外側クラス().new 非staticクラス名();`
      - `外側クラス.staticクラス名 変数名 = new 外側クラス.staticクラス名()`
      - メソッド内でネストクラスを使用するときは  
        `new 非staticクラス名().methodA()`  
        `staticクラス名.methodB()` or `new staticクラス().methodB()`

    - `ネストクラスの応用`
      - ネストクラスはinterfaceを実装、抽象クラスを継承することができる。
        ルールは同じ。

---

- **ローカルクラス**
    - `とは`
      - メソッド内で定義するクラスのこと。

    - `ルール`
      - 非staticクラスのみ定義できる。
      - アクセス修飾子は使用できない。
      - abstract、finalは使用できる。
      - 外側クラスのインスタンス変数にアクセスできる。
      - 外側クラスのメソッドの引数とローカル変数のうち、final指定されたものだけアクセスできる。

---

- **匿名クラス**
    - `とは`
      - メソッド内でクラス名を指定せず、  
        クラス宣言とインスタンス化を一つの式で定義できるクラスのこと。  
        式として定義するので、最後に`;`が必要。

    - `ルール`
      - 非staticクラスのみを定義できる。
      - アクセス修飾子は使用できない。
      - abstract,finalを使用できない。
      - 外側クラスのインスタンス変数にアクセスできる。
      - 外側クラスのメソッドの引数とローカル変数のうち、final指定されたものだけアクセスできる。
      - コンストラクタを定義できない。

---

# **オブジェクト指向の設計**
- **is-a関係**
    - 継承関係の事を指す。  
      犬も猫も人間も動物であると同じ理屈。  

---

- **has-a関係**
    - 別クラスの機能を持っていること。  
      車はタイヤ、ハンドルを持っていると同じ理屈。  

---

- **凝集度と結合度**
    - `凝集度`
      クラスの役割分割の適切度合いを指す。  
      凝集度が高い場合は、
      クラス間のメソッドや変数の関連が強く、  
      仕様変更が生じたときに影響範囲が大きい。

    - `結合度`
      クラス間の依存度合いを指す。  
      依存度合いが低いことを疎結合という。  
      度合いが低いことが望ましい。  
      合っているかはわからないけど、例えば車はタイヤがないと動かないのは結合度が高い。  
      DVDプライヤーがなくても車は動くのは結合度が低い。

---

- **コンポジション**  
  - 集約の中で特に強い関係をコンポジションと言う。（↑車の例）  
    全体クラスと部分クラスの生存期間が同じ。

---

- **パターン**
    - `シングルトーン`
      一つしかオブジェクトを生成しないパターン。
      `private`コンストラクタを作成し、  
      `private static final`変数にインスタンスを保持し、  
      インスタンスを返す`public`メソッドを用意することで実現できる。
      
    - `DAO`
        - 永続化オブジェクトとアプリケーションロジック（DB接続（ファイルを開く）、CRUD）を分けるパターン。

    - `ファクトリ`
      - インスタンスを生成する役割を持つクラスを作るパターン。
        java標準APIだと各ラッパークラスの`valueOf()`がこれに当たる。

---

# **Java API**
- **StringBuilderとStringBufferの違い**
    - `とは`
        - 一度生成した文字列に対して、操作を行うことができる。  
          要はメモリ上にデータをいじることができるから、複製しないということ。  
          str1.append(str2)`しても参照先は変わらず、str2がstr1に追記される感じ。
    - `違い`
        - `StringBuilder`はスレッドセーフではない、`StringBuffer`はスレッドセーフ。  
          それ以外はほぼ同じ。

    - `equalsメソッド`
        - Objectのequalsをオーバーライドしていないので、参照先比較になる。  
          `equals`をオーバーライドしているのは`String`やラッパークラス(Integerなど）

    - `その他のメソッド`

| コンストラクタ | 説明 |
|:-:|:-:|
| StringBuffer()  | 16文字の容量を持つStringBufferを構築  |
| StringBuffer(int capacyty)  | 指定した容量のStringBufferを構築  |
| StringBuffer(String str)  | 指定した文字で初期化されたStringBufferを構築  |


| メソッド　 | 説明 |
|:-:|:-:|
| StringBuffer append(String str)  | 末尾に指定した文字列を追加する  |
| StringBuffer insert(int offset, String str)  | offset-1の位置に指定した文字列を挿入  |
| StringBuffer reverse()  | 文字列をリバースする(abcならcba)  |
| void setCharAt(int index, char ch)  |  indexの文字を指定した文字に置換 |
| StringBuffer replace(int start, int end, String str) | startからend-1までの文字を指定した文字に置換  |
| String subString(int start, int end)  | startからend-1までの文字を指定した文字列を返却  |
| String subString(int start)  | startから末尾までの文字列を返却  |
| StringBuffer delete(int start, int end)  | startからend-1までの文字列を削除  |

---

- **ラッパークラス**
    - `とは`
        - 基本データ型を操作するためのクラス。  
          数値を文字列に変換したり、その逆も行いたい時に使うと便利。

    - `メソッド`
        - `ValueOf()`  
          基本データ型をラッパークラスに変換するstaticメソッド

        - `parseXXX`  
          文字列を基本データ型に変換するstaticメソッド

        - `ValueXXX`  
          ラッパークラスを基本データ型に変換するメソッド

---

- **AutoBoxingとUnboxing**

---

- **ロケール**

---

- **リソースバンドル**
    - `とは`


    - `ListResourceBundleクラスの使用`


    - `リソースバンドルとその使用クラスの実装①`


    - `リソースバンドルとその使用クラスの実装②`


    - `PropertyResourceBundleクラスの使用`


    - `リソースバンドルの検索`


    - `ResourceBundle.Controlクラス`

---

- **フォーマット**
    - `NumberFormat`
    - `DecimalFormat`
    - `DateFormat`
    - `SimpleDateFormat`

---

- **正規表現**
    - `とは`
    - `メタ文字`
    - `java.util.regex`

---

- **コレクション**
    - `とは`
    - `種類と特徴`
    - `List,Set,Queue,Map`
    - `Listインターフェイスの実装`
    - `Setインターフェイスの実装`
    - `イテレータ`
    - `Queue実装`
    - `Mapインターフェイスの実装`

---

- **ジェネリックス**
    - `とは`
    - `ダイアモンド演算子`
    - `クラス定義`
    - `メソッド定義`
    - `インターフェイス宣言`
    - `継承を使用したジェネリックス`
    - `ワイルドカードを使用したジェネリックス`

---

- **オブジェクトの順序付け**
    - `ComparebleインターフェイスとComparatorインターフェイス`
        - `Comparable`
        - `Comparator`
        - `配列とリストのソートと検索`
        - `Arraysクラス`

---

# **例外処理**
- **例外クラス**
    - `checked`
    - `unchecked`
    - `独自例外クラス`

---

- **try-catch-finally**
    - `各ブロックの役割`
    - `複数ブロックキャッチ`
    - `マルチキャッチ`

---

- **throwとthrows**
    - `throw`
    - `throws`
    - `rethrows`
    - `オーバーライド時注意`

---

- **try-with-resources**

---

- **Throwableクラスの機能拡張**

---

- **アサーション**

---

# **入出力**
- **File**

---

- **FileInputStream**

---

- **FiltOutputStream**

---

- **DataInputStream**

---

- **DataOutputStream**

---

- **FileReader**

---

- **FileWriter**

---

- **BufferdReader**

---

- **BufferdWriter**

---

- **System定数**

---

- **シリアライズ**

---

- **ObjectInputStream**

---

- **ObjectOutputStream**

---

- **シリアライズの継承**

---

- **Console**

---

- **ストリームの書式化および解析**
    - `ストリームの書式化`
    - `ストリームの解析`

---

# **NIO.2**
- **パッケージ**
    - `java.nio.file`
    - `java.nio.file.attribute`
    - `java.nio.channels`

---


- **Pathインターフェイス**

---

- **Files**

---

- **ランダムアクセスファイル**

---

- **ディレクトリ操作**
    - `ディレクトリへのアクセス`
    - `ファイルツリーの探索`
    - `ファイルの探索`
    - `変更と監視`

---

# **JDBC** 
- **パッケージ**
    - `java.sql`
    - `javax.sql`
    - `javax.sql.rowset`

---

- **JDBCドライバ**

---

- **例外**

---

- **SQLステートメントの実行**
    - `ステートメントインターフェイス`
    - `問い合わせ`
    - `挿入`
    - `削除`

---

- **PreparedStatementインターフェイス**

---

- **CallbackStatementインターフェイス**

---

- **高度なデータ型**

---

- **メタデータ**
    - `ResultSetMetaDataインターフェイス`


---

- **ResultSetの拡張**
    - `問い合わせ結果のスクロール、絶対/相対位置指定`
    - `ResultSetオブジェクト上でのデータ挿入・更新`


---

- **トランザクション**
    - `制御`
    - `トランザクション分離レベル`


---

- **RowSet関連のコンポーネント**
    - `RowSetインターフェイス`
    - `RowSet実装タイプ`
        - `Connected RowSet`
        - `Disconnected RowSet`

---

# **スレッドと並行処理**
- **スレッド**
    - 作成と開始
    - 状態
    - 優先度
    - 制御
    - 排他制御と同期制御
        - 排他制御
        - 同期制御
        - デッドロックとスレッドスターベーション

---

- **並行コレクション**
    - パッケージ
    - Queueインターフェイスの拡張
    - Mapインターフェイスの拡張
    - ArrayListとSetインターフェイスの拡張
    - Executorフレームワーク
        - スレッドプール
        - ScheduleThreadPoolExecutorクラス
        - Callableインターフェイス
        - アトミックとロック
            - java.util.concurrent.atomicパッケージ
            - java.utii.concurrent.locksパッケージ
    - Fork/Joinフレームワーク