はじめに
【内容】
先日JAVA SE11 Gold試験(Java SE 11 Programmer II)に合格した為、備忘録も兼ねて重要な箇所をまとめておくもの。
【想定読者】
JAVA SE11 Goldの受験を考えている方、受験勉強中の方。
※そもそもSilverに合格していないとGoldの受験が出来ない為、それなりにJavaのソースが読め、問題形式(選択式)についても理解されている方を想定。
時間がない方向けの説明
・黒本を買って問題の内容、解説までを把握しておくこと
・問題の半分(体感)にはラムダ式(関数型インタフェース)、ストリームAPIが絡んでいるので特に対策しておくこと
・試験前日は良く寝ておくこと
学習方法
基本的に黒本(以下問題集)を使用。
SE8用の書籍もあるが、試験範囲が相当に違っているので決して使い回したり(経験談)しないこと。
あと「回答解説が本体」と言わんばかりに豊富に記載されているので、
単に問題解いて、答えの選択肢見て「合ってた(間違ってた)」の繰り返しだけでは足りない。
「なぜ他の選択肢は間違いだったのか」「問題で出てきたクラスには他にどういったメソッドがあるのか」といった深堀もきちんと行うこと。
初見で黒本の第13章(総仕上げ問題)を解いて6割以上取れていれば、本番でも十分合格出来るだけの知識を身に着けていると思われる。
以下、黒本に記載されている章をベースに要点を説明したい。
総括
黒本に記載されている試験範囲は全部で12章に分かれているが、章ごとに実際に出される頻度が違っていた。
体感的には以下の通りとなる。
実施回によって割合は多少変わると思われるが、(SE8も含めた)数回の受験の中で「ラムダ式・関数型インタフェース、ストリームAPI」まわりが多く出題されることは変わらなかった。
第1章:クラスとインタフェース:良く出る
第2章:関数型インタフェースとラムダ式:非常に良く出る
第3章:並列処理:良く出る
第4章:ストリームAPI:非常に良く出る
第5章:入出力:出る
第6章:JDBCによるデータベース連携:出る
第7章:汎用とコレクション:良く出る
第8章:アノテーション:ほぼ出ない
第9章:例外とアサーション:出る
第10章:ローカライズ:出る
第11章:モジュール・システム:良く出る
第12章:セキュアコーディング:良く出る
第1章:クラスとインタフェース
・問題文で提示されているクラスやメソッドにstaticやprotectedといった修飾子がないかはよく見ること。
例えば、インナークラスのインスタンスを生成するにはエンクロージングクラス(外側のクラス)のインスタンスを生成する必要があるが、
staticインナークラスには不要といった違いがある。
アクセス修飾子については、Silverの範囲でもあるようにオーバーライド時の制限(アクセス修飾子を厳しくすることが出来ない)に関係してくる。
・インタフェースについてもstaticメソッドやデフォルトメソッド、privateメソッドといった要素が定義できるようになっている。
それぞれのメソッドがどういった意図で用いられるかを確認しておくこと。
・Enumに関する問題も何問か出題された。
コンストラクタをprivate(暗黙的にprivateだが、問題文ではpublic指定になっていてエラーになっていたりする)にする、valuesメソッドとvalueOfメソッドの内容を把握する、
使用する際は列挙子のみを記載するなど、Enumを利用するにあたっての実装方式を学んでおくこと。
第2章:関数型インタフェースとラムダ式
・以下の関数型インタフェースは、派生形も含めすべてのシグネチャ(引数、戻り値、型)を把握しておくこと。
Supplier、Consumer、Predicate、Function、Runnable、Callable
・ラムダ式の文法を把握すること。Eclipseなどで実際にサンプルをコーディングして慣らすのがオススメ。同時にメソッド参照の書き方についても慣れておくと選択肢を絞り込みやすい。
第3章:並列処理
・第12章(セキュアコーディング)とも関係するが、スレッドセーフにする為の方法を把握すること。
synchronizedやReentrantLockクラスといった排他制御用の機能は適切に用いられないと意味がないので、
キーワードだけでなく正しい実装の方式まで含めて覚えておく。
・並列処理することによる弊害(想定外の更新が実行される、デッドロックなど)と対策手順を把握しておくこと。
第4章:ストリームAPI
・Optionalクラスのインスタンス生成、要素の取得の仕方を把握すること。
例えば、要素を抜き出す場合はgetメソッドを利用するが、対象の要素がnullだった場合は実行時例外が発生する点など。
・ストリームAPIの中間操作と終端操作の内容、引数・戻り値を把握すること。
終端操作は1つのストリームにつき1回しか利用できず、同ストリーム内で2回以上終端操作を実行しようとすると実行時エラーとなる。
・IntStreamとStream<Integer>の違いを把握すること。
作成の仕方や利用できるメソッドが異なるので注意。
例として要素の合計を求めるような場合に、IntStreamではsumメソッドを利用するが、Stream<Integer>ではreduceメソッドを利用する。
・Collectorsクラスの利用方法を把握すること。
グルーピングの為のメソッド(groupingBy、partitioningBy)を含め、若干複雑な構造となる為、問題文を見て、必要な項目がテストプログラムに存在しているかを確認すること。
第5章:入出力
・知識問題が多い分野。知っていれば分かり、知らないと分からないので、用途ごとのクラスの内容、メソッドの引数・戻り値をおさえておくこと。
・ファイル(ディレクトリ)操作として作成/移動/削除を行う際のバリエーションを把握しておくこと。
問題となるバリエーションの一例は以下の通り。メソッドによって結果が異なる場合がある点に注意。
1.あるファイルを新規作成する時に、作成先に同名のファイルが存在している場合
2.あるディレクトリを新規作成する時に、その親ディレクトリが存在しなかった場合
3.あるファイルを移動する時に、移動先のディレクトリが存在している場合
・パスの解決を行う以下メソッドの機能を把握する。
resolve、resolveSibling、relativize
第6章:JDBCによるデータベース連携
・接続文字列の書式を把握すること。
jdbc:(DBMS名)://<サーバーのIPアドレス>:<ポート番号>/データベースの場所
・PreparedStatementの利用方法を把握すること。
主な注意点は3点。
1.SQLの用途ごとに利用すべきメソッドが異なっている。
executeUpdate:SQLが挿入、更新、削除の場合。戻り値はSQLによって実行された件数(挿入件数・更新件数・削除件数)。
executeQuery:SQLが検索の場合。戻り値は検索結果(ResultSet)。
execute:SQLの種類が未定の場合。戻り値は「ResultSet型の実行結果が返ってきたか」を表すboolean型の判定結果。
2.SQL文のパラメータを渡す際に、置き換え文字として「?」を使用する。値を設定する際は「setXXX(Xは型名)」メソッドを使用する。
・第1引数には「何番目の置き換え文字であるか」を指定するが、1から始まる為、1番目の置き換え文字を指定する際に「0」を指定すると実行時エラーとなる。
・SQL文にある「?」はすべて置き換えされる必要がある。1つでも値の設定しなかった場合、実行時エラーとなる。
・一度置き換え文字に設定した値は、再度「setXXX」で上書きしない限り残り続ける。
3.executeQueryを実行した際に戻ってくる「ResultSet」を扱う場合、カーソルを操作することになる。値を取得する場合は「getXXX(Xは型名)」メソッドを使用する。
・カーソルの初期位置は「先頭レコードの1個上」である為、nextメソッドを一回も使わずに「getXXX」メソッドを使用すると実行時エラーとなる。
・第1引数には「何番目のカラムを取得するか」を指定するが、1から始まる為、カラム指定する際に「0」を指定すると実行時エラーとなる。
第7章:汎用とコレクション
・オートボクシング(プリミティブ型からラッパークラスの変換)の対応関係を把握すること。
・総称型(ジェネリクス)を用いた実装方式を把握すること。
主な注意点は2点。
1.<>の中身がない場合はObject型として扱われる。
以下の通り実装してもコンパイルエラーにはならないが、項目を利用する場合は適宜キャストしないと実行時例外となる。
List list = new ArrayList<>();
2.superやextendsを利用した宣言をした場合、特定の型のスーパークラス(サブクラス)となるように、定義可能な型を制限できる。
クラスの継承関係について把握しておくこと。
List<? super Integer> list = new ArrayList<Number>(); // OK
List<? extends Number> list = new ArrayList<Integer>(); // OK
List<? extends Number> list = new ArrayList<Object>(); // コンパイルエラー
・コレクション(List、Queue、Deque、Set、Map)について機能や違いを把握しておくこと。
また以下の通り、イコールを使って代入する形でコピーを行った場合、
「シャロー・コピー」として扱われ、代入元のListオブジェクトの内容を変更した際に、代入先の内容も同様に変わってしまう点(逆も然り)に注意。
List<データ型名> 新しいListオブジェクト = 元のListオブジェクト
・Comparator(比較器)、Comparatable(比較可能)インタフェースの区別をつけること。
第8章:アノテーション
・主要アノテーションの名前と機能を覚えておくこと。
(@Retention、@Override、@Deprecatedなど)
第9章:例外とアサーション
・マルチキャッチの実装について把握すること。継承関係にある例外は1つのcatch句に同時に記載できない点に注意。
・例外中に別の例外が発生した場合の挙動を把握すること。
・assert文の実装方法を把握すること。条件式を満たさなかった場合にAssertionErrorをスローする点に注意。
第10章:ローカライズ
・Localeクラスのインスタンスを生成する為の実装方法を把握すること。
1.getDefaultメソッドを使う
2.コンストラクタを使う
3.ロケール定数を使う
4.ビルダーを使う
5.IETF言語タグを組み込んだファクトリメソッドを使う
・デフォルトのロケール情報と配置されているプロパティファイル、指定したリソースバンドルから、どのロケール情報が用いられるかの相関を把握すること。
優先順位は以下の通り。条件に該当するプロパティファイルがなければMissingResourceExceptionが発生。
言語コード・国コードが一致 ⇒ 言語コードが一致 ⇒ 国コードが一致 ⇒ デフォルト
・日付のフォーマット書式(DateTimeFormatterクラス)の定義パターンを把握すること。
前ゼロの有無(「07月」「7月」)や、どこまで細かく日付情報を出すかといった箇所も指定できる為、バリエーションを確認する。
第11章:モジュール・システム
・モジュールの定義ファイルに記載する以下ディレクティブの役割を把握すること。
requires、exports、uses、opens、provides(~with)
・名前付きモジュール、自動モジュール、無名モジュールのアクセス関係を把握すること。
第12章:セキュアコーディング
・セキュアコーディングで重要な要素トップ10(Top 10 secure coding practices)を確認すること。
(順位順。太字は特に出題に関係するところ)
1.入力を検証する
2.コンパイラからの警告に注意を払う
3.セキュリティポリシーを実装するように設計する
4.シンプルにする
5.拒否をデフォルトにする
6.最小権限の原則に従う
7.ほかのシステムに送信するデータを無害化する
8.多重防御を実践する
9.効果的な品質保証テクニックを利用する
10.セキュアコーディング標準を採用する
・機密性の高い情報(例外情報・コアダンプ・ログなど)は漏洩防止の為、極力早く消す。それを他人に見せてはいけない。
・各分野ごとの攻撃と対策を対応付けする。また、選択肢の中には、セキュリティの観点とは関係がない用語(カプセル化など)も含まれるため、区別できるようにすること。
一例:
整数オーバーフロー攻撃:アップキャスト
DoS攻撃:ファイルサイズの制限、try-with-resources
SQLインジェクション攻撃:PreparedStatement
最後に
一夜漬け(徹夜)はオススメしない。
試験時間中に頭が回らなくなり、変な汗をかき、睡魔に襲われることになる。