Java Silver を受験した時の話




正式名称『Oracle Certified Java Programmer, Silver SE11』というやつ。
2022年11月にOracle Java Silverに合格したのでその受験までの勉強期間と、難しかった知識についてまとめていく。

![スクリーンショット 2022-12-31 17.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077345/f7d8a823-b5b8-a4b9-8eb5-b7f79b6aecb4.png)

受験前はもうSE 17が出るんじゃないかと思っていたが2023/1/10現在まだリリースされていない。



# 目次
受験までの期間について
受験した感想
難しかったことベスト3


# 受験までの期間について
- **受験時の肩書き**
    - 新卒1年目
    - 開発未経験
- **なぜ受験したか**
    - 就活時はエンジニア志望でJavaという言語が日本で広く普及していることをしり、資格試験をベンチマークにしようと思ったから。
    - 福利厚生の一環で会社が受験料を8割負担（30,180円を6,036円で受験できた）してくれるので入社後に受験しようと思い、ようやく取得した。
- **使用した教材**
    - [黒本](https://www.amazon.co.jp/徹底攻略Java-SE-11-Silver問題集-1Z0-815/dp/4295007625)（ほとんどこれ）
        - 1~11章が単元ごとの問題
        - 12・13章が模試
    - Oracle公式のセミナー
    - Progate
        - 会社が課金していたのでJavaを1周
- **どのように勉強したか**
   - Java Silverの合格体験記は先駆者方がたくさん書いているが、それらによると大体2~3ヶ月くらいで合格しているようである。
   - 自分の場合は1〜11章と12〜13章に分けて4ヶ月くらいで黒本を周回し続けていた。これがほとんどだった。
     - 1〜3周目（1〜11章）くらいは何もわからない状態のまま取り組んだので答えを見ながら解いているに近しい状態だった。
     - 4周目以降はだんだん自分でも調べられるようになり、ほとんど理解できたところで12~13章の模試に挑戦した。
     - その模試も最初は全く歯が立たず、特に13章は半分も取れなかったと記憶している。
     - だからと言って特別なことをしてはおらず、間違えたところをひたすら解き直して本番を迎えた。
       

- **勉強していて感じたこと**
  - 前の章で出てきたわからない単語が後の章で解説されていることも多いので、あまり立ち止まらず先に進んでしまった方がいい。
  - やっていくと答えを覚えてしまうけども、どうしてその答えになるのか考えながら解いていた。また、わからない場合は実際に書いて動かした方がいい。
  - 他の記事で「9割できたら受験」と書かれているものを見たが自分もそうした。試験日は自由なので絶対に受かる気持ちが整ってから受けるので良いと思う。実際、確かにわからない問題は数問出題されたものの、試験時間は20分くらい余った。







# 難しかったことベスト３
黒本を進めていて難しかったこと・戸惑ったことを紹介したい。

## 第3位 staticメソッド
次のコードはコンパイルエラーになる。

```java:コンパイルエラー
public class Main {
    private String val;
    private int num;
    public Main(int num){
        this.num = num;
    }
    
    public Main(){
        this.val = "test";
        this.num = 100;
    }
    
    public static void main(String[] args){
        Main m = new Main(200);
        System.out.println(val + ", " + m.num);   //コンパイルエラー
    }
}

```

これは`main`がstaticメソッドであるがために非static領域にアクセスできないことで発生する。`val`を`m.val`にすることで解消。Javaを習い始めた時自分を含め誰しも`public static void main(String[] args){}`を呪文のように唱えていたかもしれないが、ここで初めてstaticの意味を学ぶことになった。


## 第2位 継承
次のような継承関係を考える。
```java: A.java
public class A {
    public void name(){
        System.out.println("A");
    }
}
```

```java: B.java
public class B extends A{
    public void name(){
        System.out.println("B");
    }
    
    public void nameB(){
        System.out.println("nameB");
    }
}
```

```java: Main.java
public class Main {
	public static void main(String[] args) {
	    A a = new A();
	    A b = new B();
	    a.name();
	    b.name();
	    b.nameB();
	}
}
```
これはA型変数`b`にBのインスタンスを代入しているが、Aクラスに`nameB`メソッドは存在しないためコンパイルエラーとなる。今となっては当たり前の知識になったが、当時はjava silver特有の意地悪な問題の1つだと思った。





## 第1位 初期化されていないクラス変数
staticメソッドから非static領域にはアクセスできないが、同じstatic領域にはアクセスできる。そこで以下のようなコードを書いてみる。
```java:NullPointerException
public class Main {
    static String m;
    public static void main(String[] args) {
        String b = m.concat("xxx");
    }
}

```
これは初期化されていないクラス変数を参照したために例外java.lang.NullPointerExceptionが発生する。
一方で以下のコードも確認する。

```java:null
public class Main {
    static String m;
    public static void main(String[] args) {
        System.out.println(m);
    }
}
```
こちらは`null`が出力される。初期化されていなくても参照するメソッドが異なると挙動も異なるらしい。

<!-- 詳細がわかれば追記or別記事で書く -->







# 受験した感想
業務でJavaを使う機会は今のところないが、受験してよかったと思う。それはJavaの理解を深めたことで他言語へのアナロジーが効くようになったからだ。各種言語は全く異なる文法で書かれているわけではなく、同じ構文だったり使い方をすることが多い。また、Javaは使っていないがKotlinは使っているので、あらかじめJavaの勉強内容に助けられた場面も多かった。