この記事は、JPOUG Advent Calendar 2023 16日目の記事です。
15日目は wmo6hash さんの記事 「働き方の新しいスタイル」への仕事道具最適化'23 - wmo6hash::blog でした。
去年はOracle Databaseの従来型監査の検証について書きましたが、今年はOCJPを受験したため、受験した感想や学習で躓いたポイントを書こうと思います。
これから受験を考えている方の何かの参考になれば幸いです。
OCJPとは?
OCJP(Oracle Certified Java Programmer:Oracle認定Javaプログラマ)は日本オラクル社が主催するJava言語に関する知識を問う試験です。
Bronze(未経験者向け)/ Silver(開発初心者向け)/ Gold(開発中上級者向け)の3段階の難易度の試験が用意されています。
各試験の試験時間や出題範囲、受験料など詳細は日本オラクル社の公式サイトをご参照ください。
(参考)Java SE 11 認定資格 | オラクル認定資格制度 | Oracle University
※参考リンクはSE11の情報です。本記事の執筆中に知ったのですが、2023年12月1日からSE17のSilverの試験がリリースされていました。
(参考)新着ニュース | Oracle University
私が勉強を始めた当時はSE11が最新でした。
※元々はSCJP(Sun Certified Java Programmer:Sun認定Javaプログラマ)としてサン・マイクロシステムズ社が主催する試験でしたが、2010年1月の買収に伴い、オラクル社が試験の運営を引き継いでいます。
プログラマー経歴
私は元々アプリケーション側のエンジニアで、プログラマーとしての経験は以下のとおりです。
・C言語(約4年)
・Java言語(約3年)
現在はOracle DBA業務が中心のため、もう6~7年はプログラムから離れています。(たまにVBAでツール作っている程度です)
なぜ受験したのか?
「Oracle DBA業務が中心なのになぜ今ごろJavaの試験を受けたのか?」とツッコミがありそうですが、私が受験した主な理由です。
・元プログラマーとして、資格試験を通じてプログラムの知識を体系的に復習・整理するため
・アプリケーション(Java)のエラーが発生した際、エラー内容が理解できればエラーの発生起因がアプリケーション側なのか基盤側なのか切り分けやすくなると思ったため
・(Goldの範囲ですが)スレッドプログラミングやJDBCの理解を深めるため(特にOLTPではこの辺の知識もあると強みになると思います)
・Goldは会社から報奨金が出るため(これが一番の理由かもしれません(笑))
→SilverはGold受験の前提資格となるため、先ずSilverまで受験しました。
学習時間
纏まった時間はあまり取れないため、Bronze、Silverともに2ヶ月ぐらい掛かりました。
平日は通勤時間と夜に少々、休日は空いた時間で勉強する程度でした。
学習方法
Bronze、Silverともに紫本と黒本を使用しました。
紫本
・オラクル認定資格教科書 Javaプログラマ Bronze SE(試験番号1Z0-818)
・オラクル認定資格教科書 Javaプログラマ Silver SE11(試験番号1Z0-815)
黒本
・徹底攻略Java SE Bronze問題集[1Z0-818]対応
・徹底攻略Java SE 11 Silver問題集[1Z0-815]対応
現役の方は黒本だけでも十分と巷では言われていますが、私はJava(というかプログラム)から離れてブランクがあるため、紫本からやり直しました。
Bronze、Silverともに最初の1ヶ月間は紫本を1周しました。(Javaを思い出すことが目的のため、章末問題、模擬問題はやりませんでした)
残りの1ヶ月間で黒本(模擬試験含む)を3周しました。
3週目でもスムーズに解答できなかった問題には付箋を貼っておき、試験直前まで付箋が貼られた問題を繰り返し解いていました。
また、自宅の検証用PCにJavaをインストールし、実機検証しながら理解を深めていました。
実際の動きを確認しながら理解を深めることができるため、実機検証は有効な手段だと思います。
※JavaはSE21が最新(2023年12月16日時点)ですが、SE11対応の試験ということでSE11をインストールしました。
(参考)Oracle Java SE Supportロードマップ | Oracle 日本
試験結果
Bronzeは95%、Silverは85%で無事合格できました。(Bronzeは60%、Silverは63%が合格ライン)
試験問題については言及できませんが、黒本の類似問題が体感5割ぐらい出題されたと思います。
躓いたポイント
黒本の問題で個人的に躓いたポイントをいくつか紹介します。
全部を紹介するとキリがないため、特に覚えられなかったもの(思い出せなかったもの)だけ紹介します。
【Bronze編】
ポリモーフィズム(多態性、多相性)
Javaに限らず、オブジェクト指向プログラミングでは一度は目にするキーワードですね。
サブクラス型のオブジェクトをスーパークラス型で扱い、オブジェクトごとで異なる動作を実現する仕組みです。(スーパークラスの特定のメソッドをサブクラスでオーバーライドするため、is-a関係が成り立つことが前提)
…ということを忘れていました。
たとえば下記のようなコードがあったとします。
実行結果
FugaクラスもPiyoクラスもHogeインタフェースとis-a関係にあるため、ポリモーフィズムが実現可能です。
hoges[0](Fugaインスタンス)のfunc()メソッドは Merry christmas! 2023 を出力します。
hoges[1](Piyoインスタンス)のfunc()メソッドはFugaクラスのfunc()メソッドをオーバーライドしているため、Happy new year! 2024 を出力します。
クラス図は下記のようになります。表現が正しいか不明ですが個人の理解で書いたイメージ図も載せます。
配列の変数宣言
C言語の配列の変数宣言の記憶とごちゃ混ぜになり、なかなか覚えられませんでした。
たとえば下記のうち、配列の宣言、配列インスタンスの生成方法として正しいものはどれでしょうか?
答え
3、5、7
C言語は変数宣言時に要素数を指定しますが、Java言語は変数宣言時に要素数は指定できないなど結構混乱しました。
【Silver編】
switch文の条件式にnullが設定されているString型オブジェクトを指定
バージョン7からswitch文の条件式にString型オブジェクトも指定できるようになったそうです。
私が触っていた当時は確かバージョン5ぐらいで馴染みがないため、なかなか覚えられませんでした。
たとえば下記のようなコードがあったとします。
実行結果
msgはnullが入っているため、default句でmsgに"def"が設定されると予想していました。
switch文の条件式にString型オブジェクトを指定した場合、String型オブジェクトのhashCode()メソッドを実行し、ハッシュコードで分岐する動きになります。
つまり、ここではmsgはnullが入っているため、「null.hashCode()」となり、「NullPointerException」が発生します。
※msgはフィールド変数のため、値を指定しない場合、デフォルト値(null)で初期化されます。
1次元配列と2次元配列のclone()
同じclone()でも1次元配列と2次元配列で動きが異なります。(シャローコピーとディープコピー)
当時もここは躓いていたと思います。
◆1次元配列のclone()
たとえば下記のようなコードがあったとします。
実行結果
検証結果から1次元配列の要素(値)をコピーしていることが分かります。(arr2の1次元目の要素を変えてもコピー元の値は変わりません)
なお、検証では要素がプリミティブ型、参照型どちらも同じ動きをしました。
arr1、arr2で別々の参照を持つのか裏を取るため、配列インスタンスのハッシュコードも表示してみました。
arr1、arr2でそれぞれハッシュコードが異なる(別々の参照を持っている配列インスタンスである)ことが分かります。
◆2次元配列のclone()
たとえば下記のようなコードがあったとします。
実行結果
検証結果から1次元配列の要素(参照)をコピーしていることが分かります。(arr2の2次元目の要素を変えるとコピー元の値も変わります)
なお、検証では要素がプリミティブ型、参照型どちらも同じ動きをしました。
こちらも配列インスタンスのハッシュコードも表示してみました。
arr1、arr2でそれぞれハッシュコードが異なる(別々の参照を持っている2次元配列インスタンスである)ことが分かります。
しかし、arr1[0]とarr2[0]、arr1[1]とarr2[1]はそれぞれハッシュコードが同じ(同じ参照を持っている1次元配列インスタンスである)ことが分かります。
なお、arr3はarr1およびarr2の1次元配列インスタンスとハッシュコードが異なる(別々の参照を持っている1次元配列インスタンスである)ため、arr2の2次元目の要素を変えてもarr3の要素は変わりません。
具体例を書く時間が取れなかったのですが、他にもラムダ式やモジュール・システムなどの新機能も馴染みが無いため、なかなか覚えられず苦労しました。
引っ掛かったポイント
黒本の問題で個人的に引っ掛かったポイントをいくつか紹介します。
こちらも全部を紹介するとキリがないため、特に引っ掛かったものだけ紹介します。
【Bronze編】
if文に中括弧がない
たとえば下記のようなコードがあったとします。
実行結果
良く見るとif文に中括弧がありません。
msgがnullのため、if文には入りません。
if文の中括弧を省略した場合、true時の処理として最初の1文だけ実行されます。(true/falseに関わらず、7行目の"Hello, Java!"は出力されます)
switch文のcase句にbreakがない
たとえば下記のようなコードがあったとします。
実行結果
良く見ると「case 'b':」にbreakがありません。
breakがないと次のcase句の処理も実行されます。
【Silver編】
初期化されていない変数の使用
たとえば下記のようなコードがあったとします。
実行結果
5行目のif文がfalseだった場合、iが不定値の状態で11行目で出力されてしまうため、コンパイルでエラーになります。
上記のように注意して読まないと見落としてしまうようなものが他にもありました。
受験する際の注意事項
・試験予約は早めにした方が良い(特にSilver)
受験日の1か月前にSilverの試験予約をしようとしたのですが、最寄りのテストセンターは空いていませんでした。(最短で1.5か月先とか)
Silverは試験時間が180分あるため、180分の席を確保できる日があまり無かったのではと思います。
受験日を先延ばししたくないという方には、あらかじめ試験予約だけしておくことをお勧めします。
・トイレは済ませておく
試験中も退室できますが、試験時間は止まりません。
・計算用紙(ホワイトボード)はなるべく余白を残しながら使う
計算用紙としてホワイトボードを渡されますが、書いたら消せません。
ホワイトボードは交換してもらえますが、待っている間は手元に計算用紙がない状態になってしまいます。
・Bronzeは試験時間が鬼門
Bronzeは試験時間65分に対し、試験問題60問です。(1問につき約1分で解くペースになる)
・Silverも試験時間が鬼門
Silverは試験時間180分に対し、試験問題80問です。(1問につき約2分半で解くペースになる)
Bronzeに比べ、時間的に余裕ありそうと錯覚してしまいますが、見直しを含めると私は余裕が無かったです。
・分からない問題は消去法
試験時間には限りがあります。時間を掛け過ぎる前に分からない問題は消去法で選択肢を絞る方法も有効だと思います。
参考資料
徹底攻略Java SE Bronze問題集[1Z0-818]対応
徹底攻略Java SE 11 Silver問題集[1Z0-815]対応
さいごに
今年は業務ではAWRレポート(Oracle Databaseの性能レポート)を読んで性能分析する機会も多い年でした。
読めば読むほど知らないことが多いという現実を突きつけられるため、とても勉強になる年でもありました。
来年はOCJPのGold取得やOGG(Oracle GoldenGate)、RAT(Real Application Testing)にも手を出せたらいいなと思います。
最後までお読みいただきありがとうございました。
17日目の記事もお楽しみに!