SSTエンジニアブログ

SSTのエンジニアによるWebセキュリティの技術を中心としたエンジニアブログです。

Oracle Java SE8 Gold 受験記

はじめに

こんにちは、SSTでWeb脆弱性診断を担当しているTです。

この記事は以下の投稿の続きの内容になっています。

techblog.securesky-tech.com

前回の内容に続き、去年12月に「Oracle Java SE8 Gold」資格に挑戦し合格しました。そこで、その際に勉強した内容についても共有させて頂きます。

Java SE8 Goldは「設計者の意図を正しく理解して独力で機能実装が行える中上級者向け」を対象としたOracle様の認定資格です。 詳しくは以下の公式サイトを参考にしてください。

www.oracle.com

受験勉強

期間:2020年の9月~12月上旬 資格勉強用に以下の2冊を購入し勉強しました。

  1. オラクル認定資格教科書 Javaプログラマ Gold SE 8(山本 道子)|翔泳社の本

  2. 徹底攻略Java SE 8 Gold問題集[1Z0-809]対応 - インプレスブックス

1の教科書は学習項目に合わせて「全12章+模試」の構成で、2.の問題集は「全11章+模試」の構成でした。Silverの時に比べ、内容が大幅に増えていることがわかります。 自分の場合は試験までに1と2をそれぞれ2~3周し、最後に模試を2周ずつしてから試験に臨みました。今回は前回の反省を生かして、最後の模試を繰り返しやることでなるべく本番に近い形でならすことで前回よりも高い得点率で合格することができました。

内容について

Silverの時と試験時間は変わりませんが、試験の問題数が77→85問に増えています。問題のボリュームや覚えなくてはいけないことが増えてはいますが、その分Silverよりも意地悪なひっかけ問題は減った印象でした。以下では試験で高い頻度で問われた内容について記載します。

関数型インタフェース

関数型インタフェースは、抽象メソッドを1つだけ持つインタフェースです。それぞれ固有のメソッドを持ったものが存在し、これらのメソッドの引数や戻り値を正確に把握することが重要になります。 以下に代表的な関数型インタフェースを4つ紹介します。また、これら以外にも試験で問われる関数型インタフェースは複数存在し、それらについても暗記しておく必要があります。

関数型インタフェース 抽象メソッド
Predicate<T> boolean test(T t)
Function<T, R> R apply(T t)
Supplier<T> T get()
Consumer<T> void accept(T t)

Stream API

Stream APIは、あるデータソースを元に集計操作を行うAPIです。Stream APIはデータソースから生成したStreamオブジェクトと、それに対してパイプライン処理を行う「中間操作」「終端操作」と呼ばれるメソッドで構成されます。

以下はStreamオブジェクトを生成して、中間操作により3文字以下の文字列を抽出した後昇順ソートし、終端処理で結果を標準出力する例です。

Stream<String> nameStream = Stream.of("Alice", "Bob", "Charlie", "Dom", "Echo", "Fox");    //...1
nameStream.filter((s -> s.length() <= 3))           //...2
          .sorted()                                 //...3
          .forEach(s -> System.out.println(s));     //...4

実行結果

Bob
Dom
Fox
  1. String型のStreamオブジェクトを生成します。
  2. filter()メソッドを使って3文字以下の文字列のみを抽出して次の処理に渡します。filter()メソッドは引数にPredicate(関数型インタフェース)をとります。この場合Predicate内のtest()メソッドはString型を引数に取りboolean値を返すラムダ式を定義します。
  3. sorted()メソッドで、2のラムダ式による処理がtrueになったものを昇順にソートします。
  4. 終端処理であるforEach()メソッドで、3でソートした値を標準出力します。

この他にも試験で問われる中間処理、終端処理は数多く存在します。それぞれについて何を引数に取るのか/何を返すのかを把握しておくことが重要になります。 また、以下の事柄も覚えておくと試験の時に楽になるかもしれません。

  • Streamオブジェクトのメソッドチェーン内で、中間処理のみ記述され、終端処理がない場合処理は実行されない
  • 一度終端処理まで実行してしまったStreamオブジェクトは再実行できない(実行すると例外発生)

ローカルクラスと匿名クラス

Javaでは、クラス内にクラスを定義することができます。中でも、ローカルクラスと匿名クラスはクラスに属するメソッド内で定義されます。

ローカルクラス

ローカルクラスは、クラス内で新しい別のクラスを定義することで利用できます。

public class Outer {
    String outerMember = "OuterMember";
    public void outerMethod() {
        String outerMethodMember = "OuterMethodMember";
        class LocalClass{
            String localMember = "LocalMember";
            void innerMethod() {
                String localMethodMember = "LocalMethodMember";                  
                System.out.println(outerMember);                             
                System.out.println(outerMethodMember);                
                System.out.println(localMember);
                System.out.println(localMethodMember);
            }
        }
    }
}

ローカルクラスを使う上では、以下のルールが存在します。

  • クラス名にpublic, protected, privateを使えない
  • 外側のクラス(ここではOuterクラス)のメンバにアクセスできる
  • 外側のクラスのメンバにアクセスするには、各メンバがfinalでなくてはならない
  • ↑の場合、外側のクラスのメンバにアクセスする際には、暗黙的にfinalが付与される

匿名クラス

匿名クラスは「new 【インタフェース名】(){}」や「new 【スーパークラス名】(){}」のように、既存のインタフェースやスーパークラスを使って内部でメソッドをオーバーライドすることで利用されます。

interface Anonymous{
    public void anonymousMethod();
}

public class Outer {
    String outerMember = "OuterMember";
    public void outerMethod() {
        String outerMethodMember = "OuterMethodMember";
        new Anonymous(){
            String localMember = "LocalMember";
            public void anonymousMethod() {
                String localMethodMember = "LocalMethodMember";
                
                System.out.println(outerMember);
                System.out.println(outerMethodMember);
                System.out.println(localMember);
                System.out.println(localMethodMember);
            }
        }.anonymousMethod();
    }
}

匿名クラスを使う上では、以下のルールが存在します。

  • コンストラクタを記述できない
  • 外側のクラス(ここではOuterクラス)のメンバにアクセスできる
  • 外側のクラスのメンバにアクセスするには、各メンバがfinalでなくてはならない
  • ↑の場合、外側のクラスのメンバにアクセスする際には、暗黙的にfinalが付与される

ローカルクラスと匿名クラスで共通のルールも多いため、共通でないルールと区別して暗記すると効率的です。

マルチスレッドについて

マルチスレッドについてですが、教科書でもかなりのページ数が解説に割かれています。というのも、この単元自体が膨大なためJava SE8 Goldという資格の勉強だけでは根本的な理解が難しいことが原因です。 勿論この資格用の教科書で勉強するのもいいですが、後に実務等で使用することを考えると以下の書籍でマルチスレッドについて学習することをお勧めします。

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編 | 結城 浩 | コンピュータ・IT | Kindleストア | Amazon

入出力ストリーム

入出力ストリーム

入出力ストリームはファイル等への入出力を行う際に利用されます。 入出力ストリームは大きく分けてバイトストリームとキャラクタストリームの二つに分けられます。バイトストリームはbyte単位でデータを扱う場合、キャラクタストリームはchar単位でデータを扱います。

試験で問われる可能性がある入出力ストリームは数が多く、どのクラス(またはインタフェース)で何のメソッドが利用できるかが混乱しがちです。そのため、自分は以下のようにクラス図(よく問われるメソッドのみ記載)を作成して継承関係を把握しながら暗記しました。これに限らず、自分の覚えやすい方式で工夫して覚えることをお勧めします。

f:id:yu_material256:20210917193219p:plain
バイトストリームのクラス図

f:id:yu_material256:20210917193259p:plain
キャラクタストリームのクラス図

まとめ

前回に引き続きJava SE8 Goldについて書かせて頂きました。まだまだ書き足りない項目はありますが、紹介は以上になります。Silverに比べ試験範囲は広くなりましたが、同時に暗記していれば解ける問題も増えるかと思います。また、Silver/Gold受験とそのための勉強を通して、本格的なプロダクトの開発経験のない自分にとっては非常に参考になったと思います。これからこの資格の取得を目指したり、Java開発に必要な基礎知識を身に着けたいとお考えの方々にとってこの記事が参考になれば幸いです。