🔰初めての基本情報処理試験💦 午後試験対策 Java編 平成３０年度春期 解説👓

## 対象読者
- 基本情報処理試験の受験者
- プログラム初学者
- Java初学者
- 午後試験のソフトウェア開発設問でJavaを受けようと考えている

## 本記事の概要
本記事では「午後試験のソフトウェア開発設問でJavaを受けようと考えている」方を対象に基本情報処理試験での下記の実際に出題された設問の解説を行います。

> 「出典：平成30年度 春期 FE試験区分 午後 問11 設問1~4」

[試験問題の使用に関する注意（IPAより）](https://www.jitec.ipa.go.jp/1_09faq/_index_faq.html)


<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43321845905/in/dateposted-public/" title="キャプチャ"><img src="https://farm2.staticflickr.com/1869/43321845905_41faaf6e30_z.jpg" width="601" height="397" alt="キャプチャ"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

## ご挨拶
こんにちわ :smiley: 
社内の若手育成で情報処理試験対策を行っていますが、午後試験のソフトウェア開発の問題は解答を見るだけでは理解が不十分だと感じ執筆することにしました。
私が基本情報処理試験(当時：情報２種)を受験したのは２０年前になります。業務でJavaを利用していますが、細かい言語仕様を十分に理解している自信は正直ありません:anguished: 私なりにできるだけ、わかりやすい解説を執筆したく考えています。勉強しなおす部分も多いので、ご指摘あれば書き込んでいただけると助かります。

## 1. 過去問題をダウンロード
IPAの下記サイトからダウンロードください。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30.html#30haru

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/44181302462/in/dateposted-public/" title="2"><img src="https://farm2.staticflickr.com/1850/44181302462_dd06c63f8c_z.jpg" width="640" height="386" alt="2"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

## 2. 過去問題を解く
がんばってください。いろいろテクニックあると思いますが、私はいきなり設問と解答群見ました。説明文は必要に応じて読むようにしてみました。

## 3. 解答をダウンロード
IPAの下記サイトからダウンロードください。
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30.html#30haru

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/44230214091/in/dateposted-public/" title="34キャプチャ"><img src="https://farm2.staticflickr.com/1898/44230214091_f1a4251998_z.jpg" width="640" height="398" alt="34キャプチャ"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

## 4. 解説

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/42422418880/in/dateposted-public/" title="5"><img src="https://farm2.staticflickr.com/1851/42422418880_e5857afc38_z.jpg" width="453" height="640" alt="5"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

> 「出典：平成30年度 春期 FE試験区分 午後 問11 設問1」

### 平成30年度 春期 FE試験区分 午後 問11 設問1
#### a
解答：ア
解説：
クラスのimportに関する問題ですね。
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43513034274/in/dateposted-public/" title="10"><img src="https://farm2.staticflickr.com/1820/43513034274_805cd2cbd9.jpg" width="273" height="148" alt="10"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

static インポート機能を利用する場合はstatic変数やメソッドを利用する際に省略する場合だそうです。
コメントをいただいたので修正：
>static importをしなくても、クラス名をちゃんと明記すればstaticな変数やメソッドを利用することはできます。
static importをすると、クラス名を省略できる。

私自身あまりなじみがないのですが下記サイトが参考になります。↓
http://www.techscore.com/tech/Java/JavaSE/JavaLanguage/5/
今回importしているクラスは前のページに乗っています。
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/44181560312/in/dateposted-public/" title="6"><img src="https://farm2.staticflickr.com/1850/44181560312_4a6603db4f_z.jpg" width="453" height="640" alt="6"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
利用するパッケージは、「package com.example.expr」です。
よって、「イ」、「エ」は消去されます。
利用するクラス内にstaticな変数、メソッドがないので「ウ」は消去されます。
解答：ア

#### b,c,d
解答：カ,ア,イ
解説：
プログラムの出力結果から、導き出す問題ですね。
最終的に`(2+5)=7`が出力されることを念頭に置きます。

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/44181851262/in/dateposted-public/" title="9"><img src="https://farm2.staticflickr.com/1877/44181851262_993a336077.jpg" width="393" height="53" alt="9"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

bの解答群を選ぶにあたって `new Addtion( [b] )`となっていることから、コンストラクタ（new される際に呼ばれる初期化処理など）が呼び出されていることがわかります。以下のプログラムを見るとコンストラクタのオーバーロード(同名のメソッドで引数が違うもの)がないため、`Expression型`が２つ必要なことがわかります。
解答群の「ア」、「イ」はプリミティブ型であるため消去されます。
解答群の「ウ」、「オ」はExpression型ですが、１つしかないため消去されます。
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43324536335/in/dateposted-public/" title="7"><img src="https://farm2.staticflickr.com/1863/43324536335_2d72a12105.jpg" width="439" height="263" alt="7"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

最終的に`(2+5)=7`が出力されることを考えて、「エ」、「カ」から選択します。
下記メソッドを見ると、left（第一パラメータ） + right(第二パラメータ)が画面表示されることがわります。
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43324620025/in/dateposted-public/" title="8"><img src="https://farm2.staticflickr.com/1871/43324620025_d236156720.jpg" width="390" height="82" alt="8"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

最終的に`(2+5)=7`が出力されるためには、「カ」two ,five である必要があります。「ア」は入力する型が違うのエラーになります。
解答：b→カ

続いて、c,dの解答群を選ぶ際の注意点として、`toString()`メソッドに関する理解が必要です。↓が参考になります。
http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000058.html
https://www.milk-island.net/document/java/kihon/k3/

`System.out.println()`では内部のオブジェクトの`toString()`が暗黙的に呼ばれることがミソですね。
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/44181851262/in/dateposted-public/" title="9"><img src="https://farm2.staticflickr.com/1877/44181851262_993a336077.jpg" width="393" height="53" alt="9"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

`(2+5)=7`が出力されるためには、

式そのもの
add.toString() =>`(2+5)`

式の評価された結果値
add.evalute().toString() =>`7`

上記を `=`でつなぐ必要があるのでJavaでは文字列の結合は `+` を利用するので

`(2+5)=7`の結果を得るには、
`System.out.println(add.toString() + "=" + add.evalute().toString());`

となります。toString()は省略可能なため、

`System.out.println(add + "=" + add.evalute());`

解答：c→ア　、　d→イ

### 平成30年度 春期 FE試験区分 午後 問11 設問2

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/29295453127/in/dateposted-public/" title="11"><img src="https://farm2.staticflickr.com/1881/29295453127_fa4907b7d0.jpg" width="365" height="500" alt="11"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/30363435178/in/dateposted-public/" title="13"><img src="https://farm2.staticflickr.com/1866/30363435178_9c721dd428.jpg" width="336" height="500" alt="13"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

解答：ア
解説：
アクセス修飾子に関する問題ですね。
解答群は以下アクセス修飾子の説明になっています。
「ア」は、protecred
「イ」は、private
「ウ」は、public
「エ」は、修飾子なし(パッケージプライベート)
ご参考↓
http://java-code.jp/134

青ペン部分を読んで「ウ」を解答してしまう方もいるかもしれません。
アクセス修飾子のスコープ（どの範囲から利用できるか）をよく読んで、ひっかからないようにしましょう。

### 平成30年度 春期 FE試験区分 午後 問11 設問3

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/29295644457/in/dateposted-public/" title="14"><img src="https://farm2.staticflickr.com/1874/29295644457_3ac32593f1.jpg" width="343" height="500" alt="14"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/29295645537/in/dateposted-public/" title="15"><img src="https://farm2.staticflickr.com/1881/29295645537_5ac1c98657.jpg" width="500" height="116" alt="15"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

解答：ア
解説：
出力結果を机上トレースして解答する問題ですね。
引き算クラスの継承元クラスのtoSting()がミソです。
<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43513487224/in/dateposted-public/" title="16"><img src="https://farm2.staticflickr.com/1900/43513487224_98f01036e9.jpg" width="449" height="500" alt="16"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

これが実行内容です。
`System.out.println( new Substraciton(add,new Substraction(two,five)));`

まず、簡単なところから
`System.out.println( new Substraction(two,five) );`
を実行すると
`(2-5)`が得られます。 
two と five　はExpression型を実装する定数クラスのオブジェクトであるため、
上図「プログラム５のtoString()メソッド内」の赤ペン式に入ってきます。
この結果を仮にsubに代入したとすると
`sub = new Substraction(two,five) ;`

`System.out.println( new Substraciton(add,new Substraction(two,five)));`

は

`System.out.println( new Substraciton(add,sub));`

と同等と考えらえます。
この場合
add と sub　はExpression型を実装する足し算クラス、引き算クラスのオブジェクトであるため、

上図「プログラム５のtoString()メソッド内」の赤ペン式に入ってきます。

getLeft()　は　getRight()　は　それぞれ

addオブジェクト、subオブジェクトの `toString()` を呼びますので

`(2+5)`  `(2-5) ` を返します。

これは引き算メソッドの左辺、右辺なので結果は
 `(` `(2+5)` `-`  `(2-5) ` `)`を返します。

解答：ア


### 平成30年度 春期 FE試験区分 午後 問11 設問4

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/136717862@N04/43513619364/in/dateposted-public/" title="17"><img src="https://farm2.staticflickr.com/1873/43513619364_db619b5cc4.jpg" width="492" height="331" alt="17"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

解答：イ
解説：
同一性チェック、同値性チェックに関する問題ですね。
　==  と　.eauals()　の理解がミソです。

以下参考↓
https://qiita.com/hys-rabbit/items/1251e86d9d22507d309a
https://www.milk-island.net/document/java/kihon/k3/

`a == b`      はaとbのオブジェクトが同一であるかの比較演算子。
`a.equals(b)` はaとbのオブジェクトの値が等しいかを返すメソッド。

上記がわかっているとインスタンスの値が等しいかと書いているので
「ア」、「ウ」は消去されます。
また、「エ」は.evalute()が返すのはプリミティブ型のため、`.equals(...)`でエラーになると考えます。自信がないです。。。

オブジェクトクラスに実装されている`equals`メソッドは
デフォルトでは、equalsメソッドの挙動は ==演算子の挙動と同じなため、「イ」はfalseになってしまいます。設問の説明とも合致します。

解答：イ

以上です。


## まとめ

- static importはstatic変数、メソッドを使うとき。
- コンストラクタの型に気を付ける。
- toString()は省略されることがある。
- abstract 抽象クラスは必ず継承してい使う。
- protected は下位クラスを実装するクラスだけで使える。
- `a == b`      はaとbのオブジェクトが同一であるかの比較演算子。
- `a.equals(b)` はaとbのオブジェクトの値が等しいかを返すメソッド。
- デフォルトでは、equalsメソッドの挙動は ==演算子の挙動と同じ。


## 関連記事

[Qiita - 🔰初めての基本情報処理試験💦 午後試験対策 Java編 平成３０年度春期 解説👓]
(https://qiita.com/HideakiSaito/items/87b64077c40edcee6e86)

[Qiita - 🔰初めての基本情報処理試験💦 午後試験対策 Java編 平成２９年度秋期 解説👓](https://qiita.com/HideakiSaito/items/071c21af430a6dd59ec5)