午後問題の歩き方 | Java プログラミング問題の難易度(1)Java基本構文


2022-06-07 更新

error

この記事は基本情報技術者試験の旧制度( 2022 年以前)の記事です。
この記事の題材となっている「午後問題」は現在の試験制度では出題されません。 ご注意くださいませ。

実務において Java を使いこなすには、言語構文、オブジェクト指向、デザインパターン、Servlet 、JSP 、JDBC 、さらに様々な API やフレームワークなど、習得すべき知識が膨大にあります。

それでは、基本情報技術者試験の Java の問題を解くには、どのような知識があればよいのでしょう。

試験の出題範囲の細目を示したシラバスと、実際の問題をいくつか見てみましょう。

error本記事ではわかりやすいよう、問題にシンタックスハイライトを入れています

info編集部注: スマートフォンでご覧の際は、アルゴリズムや表を横スクロールすると全文をご覧になれます

シラバスに示された 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]

announcement横にスクロールできます
(以下、プログラムなども同じ)

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 つの方法は、知らない人が多いでしょう。かなり特殊なものだからです。

  1. クラス名.class で取得する
    Class<?> c = String.class
    ※ class を「 class リテラル」と呼ぶ。
  2. オブジェクト名.getClass() で取得する
    String s;
    Class<?> c = s.getClass();
  3. 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次はこちら

Java プログラミング問題の楽勝パターン(2)オブジェクト指向

 

label注目の Python の難易度を知る

「基本情報 の Python ってどんな感じ?」を解説

label 関連タグ
科目A試験は、
免除できます。
独習ゼミで科目A試験を1年間免除して、科目B試験だけに集中しましょう。
免除試験を受けた 74.9% の方が、
科目A免除資格を得ています。
科目A免除試験 最大 2 回の
受験チャンス !
info_outline
科目A免除試験 最大 2 回の
受験チャンス !
詳しく見てみるplay_circle_filled
label これまでの『午後問題の歩き方』の連載一覧 label 著者