Java Gold SE 11 合格体験記 【1ヶ月半攻略】



本日、Java Gold SE 11を受検し、無事合格しましたので、合格までの経緯を共有させていただきます。

まずは私について。

- 事業会社開発職, 新卒一年目（入社3ヶ月目）
- 学位：学士（経済学）
- 情報系資格：基本情報技術者, Java Silver
- Javaの実務経験：なし
- 開発経験：ベンチャー企業でインターンシップを半年間（フロントエンドの開発に従事）

入社前にJavaを使うとは聞いていたので、大学4年のときにJava Silver SE 11を受検し、合格はしていたのですが、早速Java Goldを受検するよう指示が出たので、今回受検の運びとなりました。

Javaの実務経験がない中、Java Goldを受検するのはなかなかレアかもしれないということで、以下合格体験記です。

と、その前に、Java Gold SE 11の試験についての情報はまだまだサーチャブルではないのではないかと思いますので、そちらにも触れていきます。

（Java Gold SE 8の情報はたくさんあるんですがね...）

# 旧試験との範囲比較

Java Gold SE 8と11とでは出題範囲が少々異なります。

以下、Oracleが公式に発表している情報ですが、ご参考ください。

[Java Gold SE 8](https://education.oracle.com/ja/java-se-8-programmer-ii/pexam_1Z0-809)

[Java Gold SE 11](https://www.oracle.com/jp/education/certification/1z0-816-jpn-31705-ja.html)

僭越ながら[こちら](https://qiita.com/snowrabbit_ccf/items/db9de0e8fb5fd82e8ad3#%E5%87%BA%E9%A1%8C%E7%AF%84%E5%9B%B2%E3%81%AE%E7%9B%B8%E9%81%95%E7%82%B9)の記事も参考にさせていただきますと、以下のような相違点があるでしょうか。

## 新範囲で追加されたトピック

- インターフェースのprivate具象メソッド
- アノテーション
- varによる変数宣言
- モジュールシステム
- PreparedStatementおよびCallableStatement
- セキュアコーディング

## 新範囲で削除されたトピック

- 日付/時刻 API
- Fork/Join
- デザインパターン

# 使用教材

- [オラクル認定資格教科書 Javaプログラマ Gold SE11（試験番号1Z0-816）](https://www.shoeisha.co.jp/book/detail/9784798162027)

- [オラクル認定資格教科書 Javaプログラマ Gold SE11 スピードマスター問題集（試験番号1Z0-816）
](https://www.shoeisha.co.jp/book/detail/9784798162010)

- [徹底攻略Java SE 8 Gold問題集［1Z0-809］対応](https://book.impress.co.jp/books/1116101039)

- [Java SE 8 Programmer II (1Z0-809) サンプル問題](https://www.oracle.com/jp/education/certification/java-809a-3516143-ja.html)

執筆時はいわゆる黒本がJava Gold SE 11に未だ対応していませんので、旧版を活用しました。

---

また、公式ドキュメントは常に参照するようにしていました。

あいにく日本語ドキュメントは機械翻訳調なので、英語ドキュメントも適宜参照していました。

私は日本語のほうが得意ですが、英語のほうがすんなり理解できたケースが数多くありました。

[公式ドキュメント（日本語）](https://docs.oracle.com/javase/jp/11/docs/api/index.html)

[公式ドキュメント（英語）](https://docs.oracle.com/en/java/javase/11/docs/api/index.html)

---

どうしても理解できない・サーチできない事項については、stackoverflowを活用してイメージだけでも得るようにしていました。

# 学習スケジュール

幸いなことに、私の場合は勤務時間をそのまま学習に充てることができましたので、以下はどの程度ご参考になるかわかりませんが、共有いたします。

ご自身の状況に合わせて、スケジュールや目処を立ててみていただけますと幸いです。

`勉強期間`：
5/10 - 6/23

`一日の勉強時間`：
10h / day

## 5/10 - 6/1

この期間は**主に紫本にてInput中心の学習**を行いました。

とはいえ、コードもかなりゴリゴリ書いていた思い出があります。

この期間で目指していたのは、**Input内容を人に説明できるようにする**ことです。

同期や先輩にInput内容を週に1, 2回共有させてもらい、フィードバックを得ていました。

人に説明することで、かなり理解が深まり、なおかつ定着した印象です。

## 6/2 - 6/23

この期間は**主に黒本・白本にてOutput中心の学習**を行いました。

Inputの内容を点数に落とし込むことを意識しつつ、やはり以前と同様に「なぜこのような挙動をするのか？」を常に考えながら問題演習を行いました。

この時期もコードはゴリゴリ書いていましたね。

学習の順序としては、`黒本→黒本模擬試験1→白本→白本模擬試験1→黒本模擬試験2→紫本模擬試験1→白本模擬試験2`という流れで進めました。

こちらもよくされる議論ですが、私の体感としての難易度は以下のとおりでしょうか。

＜易＞ `黒本` `白本` ＜難＞

模擬試験については、`黒本模擬試験1`を易しいとすれば、`その他の模擬試験`は難しいと評価します。

実際の試験を受けた体感としては、`その他の模擬試験`のレベル感が近いと感じました。

こちらは蛇足かもしれませんが、それぞれの模擬試験の初回得点率も以下に共有いたします。

- 黒本模擬試験1: 73% (6/9)
- 白本模擬試験1: 81% (6/15)
- 黒本模擬試験2: 81% (6/16)
- 紫本模擬試験： 73% (6/17)
- 白本模擬試験2: 85% (6/20)


以上の教材は反復し、すべて理解した上で試験に臨みました。



# 学習の論点

Java Goldの学習の中で、私が意識したポイントを各章ごとにまとめていきます。

私の能力では暗記ゲーで敵いませんので、大局を見ることを意識しました。

点数に直結しない論点も含まれますが、ご了承ください。

## Javaクラスの基礎

- インターフェースの条件
    - private具象メソッド
    - static具象メソッド
    - defaultメソッド
    - 関数型インターフェースの条件

- Enum
    - Enumとはそもそも何か
    - Enumの各種メソッド
    - Enumのメンバ宣言
    - Enumのprivateなコンストラクタ
    - switch文での使用

- Objectクラスのメソッド
    - equals()とhashCode()の関係およびオーバーライド

- instanceof演算子
    - true
    - false
    - コンパイルエラー

- ネストクラス
    - 各種ネストクラスの特徴
    - ネストクラスのアクセス方法
        - 内から外は見えるが、外から内は見えない（にくい）


## アノテーション

- 各種アノテーションの特徴・はたらき
    - @FunctionalInterfaceの条件
    - @SurppressWarnigsと@SafeVarargsの違い
    - メタアノテーション@Targetで指定するElementType列挙型の定数
    - メタアノテーション@Retentionで指定するRetentionPolicy列挙型の定数


## 例外処理

- マルチキャッチ
    - マルチキャッチの条件
    - マルチキャッチで受け取った例外の型

- throwとthrows
    - throwとthrowsの違い
    - throwsを行うメソッドのオーバーライドの条件

- rethrow
    - rethrowとはなにか
    - rethrowとは何のために行うのか・どのようなことが可能なのか

- try-with-resources
    - try-with-resourcesの条件
        - try()に記述可能なクラスの条件
        - 暗黙的finalな仕様
    - 抑制された例外

- アサーション
    - アサーションは何のために、どのようなときに行うのか
    - アサーションの有効・無効


## ジェネリクスとコレクション

- コレクション
    - 各種コレクションの特徴・はたらき
        - 管理方法等の違い
        - QueueとDequeの違い
    - 各種コレクションインターフェースの実装クラス
        - 管理方法, 重複の許容等の違い
        - TreeXXXの順序付けはどのようにおこなわれるか
        - nullを許容するコレクションと許容しないコレクションの整理
    - immutableなコレクション
        - immutableな利点
        - 生成方法
        - 例外がスローされる可能性等、またそれはなぜか

- ジェネリクス
    - ジェネリクスの目的は何か
    - 型変数と型引数とは何か
    - 型パラメータリストとワイルドカード
        - 型パラメータリストとワイルドカードの違い
        - 上限境界と下限境界について

- オブジェクトの比較  
    - Comparableインターフェース
        - compareTo()
    - Comparatorインターフェース
        - compare()
        - comparing()
    - 各々の違い



## 関数型インターフェースとラムダ式

- ラムダ式
    - なぜラムダ式を使うのか
        - 冗長表現の簡略化
            - 匿名クラス→ラムダ式, 匿名クラス←ラムダ式の書き換え
        - ラムダ式以前とラムダ式以降の実装の変化
            - 関数を変数で渡すことによる影響
            - 遅延実行による影響
    
- メソッド参照
    - インスタンスメソッド参照
    - staticメソッド参照
    - コンストラクタ参照
    - ラムダ式→メソッド参照, ラムダ式←メソッド参照の書き換え

- 基本データ型を扱う関数型インターフェース


## ストリームAPI

- なぜストリームAPIを使うのか
    - immutableなオブジェクト
    - 並列処理への対応
   
- ストリームAPIが得意なこと・不得意なこと

- 終端操作
    - 終端操作とはなにか
    - 終端操作の各種メソッド
    - collect()メソッドによる終端操作
        - 可変リダクション

- 中間操作
    - 中間操作とはなにか
    - 中間操作の各種メソッド

- Optional型のオブジェクト
    - Optional型のオブジェクトを生成するメソッド
    - Optional型のオブジェクトを操作・評価するメソッド
        - orElse(), orElseGet(), orElseThrowの違い
            - ヒントは引数の型です。もっといえば遅延実行について。

- ストリームの型変換
    - 型変換のための各種メソッド

- 基本データ型を扱うストリームにのみ宣言されている各種メソッド

## モジュールシステム

- なぜモジュールシステムを使うのか
    - 情報隠蔽
    - その他情報隠蔽の方法とは何か

- なぜ間接エクスポートを使うのか

- なぜServiceLoaderを使うのか

- 各種コマンド・オプションの特徴
    - javac, java, jdeps, jar, jlink等

- 各種モジュールの違い
    - 無名モジュール
    - 自動モジュール
    - 名前付きモジュール


## 並列処理

個人的には、Java Goldの中で山場はどれかと問われたら迷わず本分野と答えるでしょう。（出題のウェイトとしてはそこまで大きくないのですが...）

- 並列処理の基礎
    - どうして並列処理を行うのか
    - 並列と並行の違い
        - 一般的な使い分け
        - Javaにおける使い分け
    - スレッドとは何か
    - 基本的な並列処理のやり方
        - Threadクラス継承
        - Runnableインターフェース実装

- 排他制御と同期制御
    - 排他制御と同期制御の違い
    - synchronizedによる排他制御
        - synchronizedの指定方法
        - ロックする対象は何か

- 同期コレクションと並列コレクション
    - 通常のコレクション, 同期コレクション, 並列コレクションの違い
    - synchronizedXXX()メソッドによるラップによって生成されるコレクションの特徴
    - java.util.concurrentパッケージで提供されているコレクションの特徴
        - イテレーション時のConcurrentModificationExceptionのスロー可能性
        - 複合アクションについて
        - 弱一貫性(weakly-consistent)とは何か
   

- Executor
    - Thread, Runnnable, Executor の比較
    - execute(), submit() の比較
    - Futureオブジェクトの挙動
    - Runnnable, Callable の比較
    - タスクのスケジューリングについて

- 並列処理によるインクリメントの挙動
    - 排他制御なし
    - synchronized修飾子による排他制御あり
    - AtomicIntegerクラスによる排他制御あり
        - AtomicIntegerクラスの各種メソッド

- パラレルストリーム
    - シーケンシャルストリームとの違い

- Fork/Joinフレームワークとは何か（SE11範囲外のようですが一応確認しました）

## 入出力

- 入出力におけるストリーム
    - バイトストリームとキャラクタストリームの違い
    - ノードストリームとフィルタストリームの違い

- Systemクラスの定数
    - in
    - out
        - System.out.println()とは何か
    - err

- コンソール
    - 生成方法
    - 一意性
    - nullが返る場合
    - パスワード入力時のエコーバック抑制

- シリアライズ・デシリアライズ
    - 両者の違い
    - やり方
    - シリアライズの対象
        - インスタンス変数
        - static変数
        - transient
    - シリアライズの継承
        - 親クラスのみがSerializableを実装していた場合
            - デシリアライズ時の挙動
        - 子クラスのみがSerializableを実装していた場合
            - デシリアライズ時の挙動
        - 以上の挙動の理由

- java.nio.fileパッケージ
    - java.io.fileとjava.nio.fileの違い
    - Pathインターフェース
        - Pathオブジェクトとは何か
        - 各種メソッド
            
    - Filesクラス
        - 各種メソッド
            - copy(), move()の違い、オプション指定時の挙動
            - getAttribute(), readAttributes()の違い
            - walk(), find(), list(), lines()の違い



## JDBC

- JDBCAPIとJDBCドライバ
    - 両者の性質・はたらき・違い

- JDBCの利用フロー
    - DB接続
        - JDBC4.0以前と以降のドライバクラスのロード
        - JDBC4.0以降の自動ロードのメリット
    - Statementの取得
        - Statement, PreparedStatement, CallableStatementのの違い
            - SQLインジェクション対策
            - プリコンパイル
            - ストアドプロシージャ
    - SQL実行
        - 各種メソッド
            - 返り値の違い
    - 結果の取得
        - ResultSetの操作
            - ResultSetインターフェースの定数
            - 各種メソッド
            - 挿入方法
            - 更新方法
            
    - close()
        - なぜclose()するのか
        - ガベージコレクタとDB

## ローカライズとフォーマット

- ローカライズ
    - ロケールオブジェクト生成方法
        - Localeクラスのコンストラクタによる生成
        - Localeクラスのメソッドによる生成
        - Localeクラスの定数による生成
        - LocaleクラスのstaticなインナークラスBuilderのbuild()による生成
    - リソースバンドル
        - ListResourceBundleクラスの利用
        - PropertyResourceBundleクラスの利用
        - 両者の違い

- フォーマット
    - 数値
    - 通貨
    - 日時
        - パターン文字
    - メッセージ

## セキュアコーディング

- SQLインジェクション対策
- 特殊文字の標準化
- パス名の正規化
- Dos攻撃対策
- シリアライズの互換性
- 特権処理
- シングルトンパターン


# 参考になった記事等

その他参考になった記事等をご紹介します。

## JavaGold11合格体験記

Java Gold SE 11は依然として情報が多くありません。その中でも有用だった記事等を紹介します。


https://www.selikoff.net/2019/08/31/my-experience-taking-the-new-java-se-11-programmer-ii-1z0-816-exam/

https://thiscraps.com/259/

https://qiita.com/snowrabbit_ccf/items/db9de0e8fb5fd82e8ad3



## 解く問題がなくなったとき

日本で出版されている書籍にすべて手を付けてしまったとき、気休め的にではありますが以下に取り組みました。

https://www.oracle.com/jp/education/certification/java-809a-3516143-ja.html

https://education.oracle.com/5278_Java11-Programmer_Study-Guide_V1_E94B.pdf

https://issuu.com/alicecooper86/docs/1z0-816__oracle_java_se_11_programmer_ii




# 結果

83%で合格です。

なにか一つのものに没頭できるというこの不思議な高揚感は久々でした。

改めて、勉強というものはほんとうに楽しいし、その都度その対象が変わるだけなのだということを実感しました。

以上になります。