はじめに
Javaエンジニアとして働いているとOracle Java Silver(Java SE 11 Programmer I)くらいなら、試験勉強なしでも合格できるのでは?と思ったことはありませんか?
実務で扱っているJavaだし、試験問題を見ても「実務のほうが難しいから意外といけるかも」と思いますよね、特に複雑なクラス構成を持つ比較的大規模なアプリケーションの設計や開発を経験していると、なおさらそう感じるかもしれません。
会社勤めをしていると年度ごとの目標管理で資格取得を目標に設定する人も多いのではないでしょうか。5年以上のJava実務経験がある私ですが、自己啓発の一環として今さらながらOracle Java Silverを受験して感じたことをまとめました。
実務経験だけで試験合格は難しい
結論から言うとJavaの実務経験があってもノー勉強で合格するのは難しいと思われます。理由は実務で使うJavaの知識と試験で問われる内容が異なるからです。
実務経験者であっても自信を持って答えられない問題が出題されます、Javaに触れていてもフレームワークを利用した開発が中心の場合は基礎的な部分の理解が曖昧になっていることがあるためです。
実務では開発IDEがコードを補完してくれるため細かい文法や仕様を意識する機会が少なくなりがちで、仮に間違えたとしてもコンパイルエラーやデバッグによって問題に気付くことができます。
試験ではその場で正確な知識が求められます、実務の知識がある分「こうだったはず」と思い込んで誤った回答を進んで選んでしまうこともあり運任せの正解はできなくなります。
「知っている」と「問題を解ける」は別もの
試験では文法の厳密な理解が必要で正確に答える必要があります。以下に試験に近い問題を出します、自信をもって正確に答えられますか?
問題1:変数の宣言
以下のコードがあります。コンパイル、実行した結果として正しいものは次のうちどれですか。1つ選択してください。
public class MainTest {
public static void main(String[] args) {
long $999 = 999999999L;
int count = 123_456;
String java = "java";
int[] iList = new int[]{1, 2, 3, 4, 'a'};
var var = 100;
System.out.println("Hello World");
}
}
A. long $999 = 999999999L;でコンパイルエラーが発生する
B. int count = 123_456;でコンパイルエラーが発生する
C. String java = “java”;でコンパイルエラーが発生する
D. int[] iList = new int[]{1, 2, 3, 4, ‘a’};でコンパイルエラーが発生する
E. var var = 100;でコンパイルエラーが発生する
F. 実行した結果 Hello World が出力される
正解:F
すべて正しい変数宣言です、普段使わない変数命名やリテラルで正しいのか迷いませんか?
問題2:分岐switch caseの振る舞い
以下のコードがあります。コンパイル、実行した結果として正しいものは次のうちどれですか。1つ選択してください。
public class MainTest {
public static void main(String[] args) {
int item = 4;
switch(item) {
case 3:
System.out.print("3 ");
case (4 | 5):
System.out.print("4 5 ");
case 6:
System.out.print("6 ");
break;
default:
System.out.print("default ");
}
}
}
A. 実行した結果 4 5 default が出力される
B. 実行した結果 4 5 6 が出力される
C. 実行した結果 default が出力される
D. コンパイルエラーが発生する
E. 実行時にエラーが発生する
正解:C
(4 | 5)は0100と0101のビットOR演算を行っていて0101の5になります、したがって各caseに入るものがなく”default “が出力されて終了します。
問題3:オブジェクトの生成と利用、その1
次のコードがあります。コンパイル、実行した結果として正しいものは次のうちどれですか。1つ選択してください。
public class Main {
final int constVal;
Main(){
constVal = 1;
}
private void print() {
System.out.println("constVal=" + constVal);
}
public static void main(String[] args) {
Main main = new Main();
main.print();
}
}
A. コンパイルエラーが発生する
B. 実行時にエラーが発生する
C. 実行した結果 constVal=1 が出力される
D. 実行した結果 constVal=0 が出力される
正解:C
final修飾子は「一度だけ値を代入できる」という性質で必ず宣言と初期化を同時にする必要はありません、したがって正常に実行されconstVal=1が出力され終了します。
問題4:オブジェクトの生成と利用、その2
次のコードがあります。コンパイル、実行した結果として正しいものは次のうちどれですか。1つ選択してください。
public class MainTest {
private static String str1 = "Java";
public static void main(String[] args) {
String str2 = new String("Java");
String str3 = "Java";
System.out.print(" "+(str1==str2));
System.out.print(" "+(str1==str3));
System.out.print(" "+(str2==str3));
}
}
A. 実行時に true true true が出力される
B. 実行時に false true false が出力される
C. 実行時に false false true が出力される
D. 実行時に false false false が出力される
E. 実行時にエラーが発生する
正解:B
Stringのような参照型変数で==比較を行うと、値ではなく参照(メモリアドレス)の比較になるため同じ文字列でもstr1とstr2、str2とstr3はfalseとなります。ですが、str1とstr3は”Java”という文字列リテラルを使用して初期化しています、この場合メモリ内の同じオブジェクトが再利用され参照(メモリアドレス)が同じとなりtrueとなります。
問題5:基本データ型の型変換
次のコードがあります。コンパイル、実行した結果として正しいものは次のうちどれですか。1つ選択してください。
public class Main {
public static void main(String[] args) {
float f = 1/3;
System.out.println("f="+f);
}
}
A. コンパイルエラーが発生する
B. 実行時にエラーが発生する
C. 実行した結果 f=0.0 が出力される
D. 実行した結果 f=0.33333334 が出力される
E. 実行した結果 f=1.0 が出力される
正解:C
整数同士で割り算を行うと結果も整数(int型)になります、そのため実行した結果は f=0.0 が出力されます。float f = 1f/3; に変えることでf=0.33333334の結果となります。
問題6:オーバーロードとポリモーフィズムな振る舞い
次のコードがあります。コンパイル、実行した結果として正しいものは次のうちどれですか。1つ選択してください。
class Base {
void execute(Base b) {
System.out.print("Base-Base ");
}
void execute(Derived d) {
System.out.print("Base-Derived ");
}
void execute(Object o) {
System.out.print("Base-Object ");
}
}
class Derived extends Base {
void execute(Base b) {
System.out.print("Derived-Base ");
}
void execute(Derived d) {
System.out.print("Derived-Derived ");
}
}
public class MainTest {
public static void main(String[] args) {
Base obj = new Derived();
Base arg = new Derived();
obj.execute(arg);
}
}
A. 実行した結果 Base-Base が出力される
B. 実行した結果 Base-Derived が出力される
C. 実行した結果 Base-Object が出力される
D. 実行した結果 Derived-Base が出力される
E. 実行した結果 Derived-Derived が出力される
F. 実行時にエラーが発生する
正解:D
オーバーライドは実行時の実体で見るためDerivedクラスのexecute関数が呼び出されます、オーバーロードはコンパイル時に型で判断されるためexecute(Base b)関数が呼び出されます、よって”Derived-Base “が出力されます。
Oracle Java Silverを取る意味はある?
練習問題は正解できましたか?どれも私自身が「どうだったっけな?」と悩んだ問題です。
やってみると意外と自信を持って答えられなくないですか?こういった問題はJavaを知っているだけでは解けず試験形式に慣れているかが重要になると思います。
練習問題に答えられなくても普段の実務で困ることはほとんどありません。そのため要員採用の選考でもSilver合格より実務経験や実績が重視されることになります。
しかしながら同じ実務経験年数で人物面にも大きな差がない候補者がいた場合、Java Silver試験の合格者を選びたくなりませんか?そういった意味でJava SilverがJavaの基礎力を客観的に証明する資格であることは事実だと思います。
受験料は安くありませんが一度取得すれば資格の有効期限はありません。Javaの基礎を見直す良い機会にもなるのでみなさまもチャレンジしてみてはいかがでしょうか。
おわりに
ここまで試験において実務経験は当てにならないような少しネガティブな書き方をしましたが、実務経験そのものは非常に有益です。経験者はJavaの大枠を理解できているため、先ほどの練習問題のような試験で問われるポイントを押さえるだけの短期学習でも十分に合格圏へ到達しやすいのは事実です。
ノー勉強での受験は受かる人もいれば落ちる可能性もあります、ノー勉強合格を目指すのであれば生成AIなど使って試験範囲の練習問題を解き、間違えた箇所を復習しておくだけで合格率はかなり上がると思います。
毎年春頃に不合格になっても再受験料が無料になるキャンペーンが実施されているようです。来年も開催されるかは分かりませんがこのキャンペーンを利用して「ノー勉、一発合格」に挑戦してみるのも面白いかもしれません。
ちなみに私はノー勉チャレンジをやってみましたが結果は見事に不合格でした…

その後に10時間ほどしっかり試験対策を行ってから再受験し合格することができました。
実務経験があるからこそ油断してしまいがちですが、やはりノー勉強ではなく試験対策をしておくことが確実な合格への道だと感じました。

コメント