午後問題の歩き方 | Java プログラミング問題の難易度(1)Java基本構文
error
この記事は基本情報技術者試験の旧制度( 2022 年以前)の記事です。
この記事の題材となっている「午後問題」は現在の試験制度では出題されません。 ご注意くださいませ。
実務において Java を使いこなすには、言語構文、オブジェクト指向、デザインパターン、Servlet 、JSP 、JDBC 、さらに様々な API やフレームワークなど、習得すべき知識が膨大にあります。
それでは、基本情報技術者試験の Java の問題を解くには、どのような知識があればよいのでしょう。
試験の出題範囲の細目を示したシラバスと、実際の問題をいくつか見てみましょう。
シラバスに示された Java の知識と技術
シラバスの内容を見ると、Java の問題を解くには 「基本構文」「オブジェクト指向」「 API 」の知識があればよい ことがわかります。
以下は、IPA が試験の シラバス に示した「 Java の知識と技術」です。修得項目に示された言葉の中に、知らないことがないかどうかチェックしてください。
もしも、 半分以上知らないことがあったなら、Java を選ばない方が無難です。試験当日まで、あまり時間がないのですから。
-
(1)Java の基本的なプログラム
Java の基本的なプログラムを作成する。
修得項目クラス、メソッド、main メソッド、標準出力、注釈、javadoc コメント、など -
(2)数値の計算
四則演算を行うプログラムを作成する。
修得項目データ型、型変換(キャスト)、変数、配列、四則演算子、式、代入演算子、比較演算子、増分演算子、減分演算子、シフト演算子、など -
(3)選択型のプログラム
条件式を使って条件分岐するプログラムを作成する。
修得項目if 文、switch 文、など -
(4)反復型のプログラム
反復型の制御文を使ったプログラムを作成する。
修得項目while 文、do 文、for 文、拡張 for 文、など -
(5)クラスとインスタンス
クラスを定義し、インスタンス化して使用するプログラムを作成する。
修得項目 インスタンス変数、インスタンスメソッド、アクセス修飾子、参照型変数、隠蔽(いんぺい)、コンストラクタ、オーバロード、this 、クラス変数、クラスメソッド、文字列クラス、パッケージ、完全限定名、super 、単純名、import 宣言、クラス修飾子、など -
(6)差分プログラミング
既存のクラスの機能を拡張するプログラム、インタフェースを利用して機能を追加するプログラムを作成する。
修得項目継承、final 、extends 、スーパクラス、サブクラス、Object 、implements 、キャスト、アップキャスト、ダウンキャスト、instanceof 、オーバライド、ダイナミックバインド、クラスライブラリ、抽象クラス、抽象メソッド、基底クラス、派生クラス、など -
(7)例外処理
例外処理を行うプログラムを作成する。
修得項目try 文、throw 文、など -
(8)並列処理
並列処理を行うプログラムを作成する。
修得項目スレッド、synchronized 修飾子、wait( ) 、notify( ) 、など -
(9)コレクションと総称
コレクションを使ったプログラムを作成する。
修得項目add( ) 、remove( ) 、List 、Set 、Map 、Stack 、型引数、など -
(10)入れ子クラス
入れ子クラスを使ったプログラムを作成する。
修得項目メンバクラス、メンバインタフェース、局所クラス、匿名クラス、など -
(11)列挙
列挙型を使ったプログラムを作成する。
修得項目列挙定数、final 変数、など
シラバスにある項目は出題される
こういうことを言うと、シラバスや試験問題の作成者にたいへん失礼かもしれませんが、あえて言わせていただきます。
Java の問題には、Java 固有の知識をふんだんに使ったプログラムが出題されることがあります。
午後問題の問 7 ~ 問 11 は、「ソフトウェア開発」という共通した出題分野の選択問題です。C 言語、Java 、Python 、アセンブラ、表計算のどれを選んでも、ソフトウェア開発がテーマであるべきです。
Java 固有の知識をふんだんに使ったプログラムを出題したら、不公平であり、おかしいでしょう。Java 自体が出題分野ではない のですから。
文句を言っても仕方ありません。シラバスにあることは、堂々と出題されるのです。
例として、平成 27 年度 秋期 午後 問 11「ブロックのデータのキャッシュ管理」のプログラムの一部を見てみましょう。
[プログラム 4]
import java.util.ArrayList;
import java.util.List;
abstract class ListBasedCache extends Cache {
final List<Entry> entries = new ArrayList<Entry>();
private static final int CACHE_SIZE = 20;
byte[] getCachedBlockData(int index) {
for (Entry entry : entries) {
if (entry.getIndex() '[ 空欄 c ]' index) {
hit(entry);
return entry.getBlockData();
}
}
return null;
}
void cacheBlockData(int index, byte[] blockData) {
if ( '[ 空欄 d ]' ) {
entries.remove( '[ 空欄 e ]' );
}
entries.add(0, new Entry(index, blockData));
}
abstract void hit(Entry entry);
// 入れ子クラス
private static class Entry {
private final int index;
private final byte[] blockData;
private Entry(int index, byte[] blockData) {
this.index = index;
this.blockData = blockData;
}
int get Index() { return index; }
byte[] getBlockData() { return blockData; }
}
// 入れ子クラス
static class Fifo extends '[ 空欄 f ]' {
void hit (Entry entry) { }
}
// 入れ子クラス
static class Lru extends '[ 空欄 f ]' {
void hit(Entry entry) {
entries.remove( '[ 空欄 g ]' );
entries.add(0, entry);
}
}
}
このプログラムでは、「入れ子クラス」が使われています。入れ子クラスは、Java 固有の機能であり、簡単に説明すると(以下は適当にお読みください)...
入れ子クラスとは、クラスやメソッドの中で定義されたクラスのことである。入れ子クラスの private なメンバであっても、入れ子の外側のクラスからアクセスできる。static を指定した入れ子クラスは、外側のクラスのインスタンスがなくても常時存在しているが、外側のクラスのインスタンスメンバにはアクセスできない。static を指定しない入れ子クラスは、外側のクラスのインスタンスがないと存在できないが、外側のクラスのインスタンスメンバにアクセスできる。
...(以上)
という、かなり特殊なものです。入れ子クラスなんて使わなくても、ソフトウェア開発の問題を作れるはずです。
しかし、出題されたのです。シラバスの( 10 )に「入れ子クラス」があるからでしょう。
( 10 )入れ子クラス
入れ子クラスを使ったプログラムを作成する。修得項目メンバクラス、メンバインタフェース、局所クラス、匿名クラス、など
このように、シラバスにある項目は、堂々と出題されるのです。したがって、もしもシラバスの中に半分以上知らない項目があるなら、Java を選ばない方が無難です。
PR
コレクション関連の API がよく出題される
Java には、膨大な数の API( Application Programming Interface 、クラスライブラリとも呼ばれる)が用意されています。試験問題の末尾に、「 Java プログラムで使用する API の説明」があるので、事前に API の種類と機能を丸暗記しておく必要はありません。
ただし、よく出題されるコレクション関連の API の使い方には、事前に慣れていた方がよいでしょう。
なぜ、コレクション関連の API がよく出題されるのでしょうか。それは、シラバスの(9)に示されているからです。
(9)コレクションと総称
コレクションを使ったプログラムを作成する。修得項目add( ) 、remove( ) 、List 、Set 、Map 、Stack 、型引数、など
以下は、近年 3 年( 6 回)の試験で、Java の問題に使われた API の種類です。
赤色で示した java.util.List<E>, java.util.ArrayList<E>, java.util.Map<K, V>, java.util.HashMap<K, V>, java.util.Stack<E> が、コレクション関連の API です。
もしも、これらの使い方を知らないなら、Java を選ばない方が無難です。見ての通り、とってもよく出題されているからです。
試験の年度 | Java の問題で使われた API の種類 |
---|---|
平成27年度秋期 | java.util.List<E> java.util.ArrayList<E> java.lang.System |
平成28年度春期 | java.util.List<E> java.util.ArrayList<E> java.lang.String java.util.UUID |
平成28年度秋期 | java.util.Map<K, V> java.util.HashMap<K, V> java.util.Stack<E> |
平成29年度春期 | (なし) |
平成29年度秋期 | java.lang.String java.lang.Integer java.util.Arrays java.util.Comparator<T> java.util.Map<K, V> java.util.HashMap<K, V> |
平成30年度春期 | (なし) |
平成 29 年度 春期 と平成 30 年度 春期の Java の問題では、API が使われていません。
これは、アルゴリズムやオブジェクト指向がテーマだからです。こういう問題は、実にいいですね。
これなら、「 Java 」の問題ではなく、「ソフトウェア開発」の問題です。
シラバスを超えた知識が出題される場合もある
シラバスに示されているとはいえ、Java 固有の知識をふんだんに使ったプログラムが出題されるのは、困ったことです。
さらに、困ったことに、シラバスを拡大解釈したような構文や API に関する設問が出題されることもあります。
おそらく出題者は「このシラバスのレベルなら、このぐらいのことを出題しても大丈夫だろう」と思ったのでしょう。例として、平成 26 年度 秋期 午後 問 11「可変オブジェクトとその問題点」 の設問 1 の一部を見てみましょう。プログラムの空欄 d と空欄 e の解答群に注目してください。
[プログラム 2 ] より抜粋
public static void main(String[] args) {
testException(null, new Date(0L), '[ 空欄 d ]' );
testException(new Date(0L), null, '[ 空欄 d ]' );
testException(new Date(-1L), new Date(0L), '[ 空欄 e ]' );
testException(new Date(0L), new Date(-1L), '[ 空欄 e ]' );
d, e に関する解答群
ア IllegalArgumentException
イ IllegalArgumentException.class
ウ IllegalArgumentException.getClass()
エ new IllegalArgumentException()
オ new NullPointerException()
カ NullPointerException
キ NullPointerException.class
ク NullPointerException.getClass()
選択肢に示された「 class 」や「 getClass() 」の機能をご存知でしょうか。
Java には、クラスを取得するために、以下に示した 3 つの方法があります。3 つ目の方法は、データベースをアクセスするプログラムを作るときに使ったことがあるかもしれませんが、他の 2 つの方法は、知らない人が多いでしょう。かなり特殊なものだからです。
- クラス名.class で取得する
Class<?> c = String.class
※ class を「 class リテラル」と呼ぶ。 - オブジェクト名.getClass() で取得する
String s;
Class<?> c = s.getClass(); - Class.forName( “クラス名” ) で取得する
Class<?> c = Class.forName( "java.lang.String" );
正解は、空欄 d がキで、空欄 e がイです。どちらも、class リテラルが使われています。 class リテラルは、シラバスに示されていません。それでも、出題されました。
このように、シラバスを超えた知識が出題される場合もあるのです。
なお、選択肢のウとキで使われている getClass() は、java.lang.Object クラスのメソッドですが、試験問題の末尾に API の説明がありませんでした。「正解の選択肢じゃないから説明いらないよね!」ということなのでしょう(たぶん)。
C 言語にオブジェクト指向のための構文が追加されて C++ が作られ、C++ をベースとして Java が作られました。したがって、C 言語と Java の構文は、よく似ています。
そのため「 C 言語と Java のどちらかを選択する予定だ」という人もいることでしょう。
この記事が、選択の判断材料になったなら幸いです。試験当日の問題次第ですが、 生半可に Java ができるというレベルでは、Java を選ばない方が無難かもしれませんね。
それでは、またお会いしましょう!
label次はこちら
label注目の Python の難易度を知る
免除試験を受けた 74.9% の方が、 科目A免除資格を得ています。
基本情報 プログラミング 言語の選択と学習方法|午後問題の歩き方
update基本情報のサンプル問題で Python の基礎知識をチェック | 午後問題の歩き方
update「基本情報 の Python ってどんな感じ?」を解説|午後問題の歩き方
update矢沢久雄さんが執筆! 午後 プログラミング 問題対策の参考書「速習言語」を刊行しました!!
updateこうすりゃ解ける! 2019年度秋期 (令和元年度) 基本情報技術者試験の午後問題を徹底解説
updateこうすりゃ解ける! 2019年度春期 (平成31年度) 基本情報技術者試験の午後問題を徹底解説
updateこうすりゃ解ける! 2018年度秋期 (平成30年) 基本情報技術者試験の午後問題を徹底解説
update午後問題の歩き方 | 試験1週間前にやるべき午後問題の知識チェック (チェックシート付き)
update午後問題の歩き方 | Java プログラミング問題の楽勝パターン(2)オブジェクト指向
update午後問題の歩き方 | Java プログラミング問題の難易度(1)Java基本構文
update『プログラムはなぜ動くのか』(日経BP)が大ベストセラー
IT技術を楽しく・分かりやすく教える“自称ソフトウェア芸人”
大手電気メーカーでPCの製造、ソフトハウスでプログラマを経験。独立後、現在はアプリケーションの開発と販売に従事。その傍ら、書籍・雑誌の執筆、またセミナー講師として活躍。軽快な口調で、知識0ベースのITエンジニアや一般書店フェアなどの一般的なPCユーザの講習ではダントツの評価。
お客様の満足を何よりも大切にし、わかりやすい、のせるのが上手い自称ソフトウェア芸人。
主な著作物
- 「プログラムはなぜ動くのか」(日経BP)
- 「コンピュータはなぜ動くのか」(日経BP)
- 「出るとこだけ! 基本情報技術者」 (翔泳社)
- 「ベテランが丁寧に教えてくれる ハードウェアの知識と実務」(翔泳社)
- 「ifとelseの思考術」(ソフトバンククリエイティブ) など多数