SJC-P(310-055)の主な出題範囲は下記のように分類されています。
宣言、初期化、スコープ
フロー制御
APIコンテンツ
並行性
オブジェクト指向コンセプト
コレクション/ジェネリックス
Java言語の基礎
プログラミングの経験がある方は、上記の分類を一見すると「簡単そうだ」と思われるかもしれません。
しかし、中には難しい問題もいくつか含まれており、油断していると足をすくわれます。
Javaプログラミングの経験が長く自信がある方でも、試験前に参考書や問題集にはひととおり目を通しておくことをおすすめします。
下記にサン・マイクロシステムズのJava認定試験公式サイトに書かれている出題範囲を引用していますので、ご参考ください。
SJC-P(310-055)の主な出題範囲
※2009年6月時点の内容を引用
クラス(抽象クラス、およびあらゆる形式のネストクラスを含む)、インタフェース、列挙型を宣言し、パッケージおよびインポート文(staticインポートを含む)を正しく使用しているコードを書く。
インタフェースを宣言するコードを書く。1つまたは複数のインタフェースを実装または拡張するコードを書く。抽象クラスを拡張するコードを書く。
プリミティブ型、配列型、列挙型、オブジェクトをstatic、インスタンス変数、ローカル変数として宣言、初期化、使用するコードを書く。変数名に正しい識別子を使用する。
{staticメソッドとstaticでないメソッドの両方を宣言するコードを書く。この場合、JavaBeansの命名規則に準拠したメソッド名を使用する。可変長引数リストを宣言、使用するコードを作成する。
与えられたコード例で、あるメソッドが別のメソッドを正しくオーバーライドまたはオーバーロードしているかを確認し、そのメソッドに対する正しい戻り値(共変戻り値を含む)を識別する。
与えられたクラスおよびスーパークラスに対し、1つまたは複数のクラスに対するコンストラクタを作成する。
与えられたクラスに対し、デフォルトコンストラクタが作成されるかどうかを判断し、作成される場合はそのコンストラクタのふるまいを特定する。
与えられたネストまたはネストされていないクラスに対し、そのクラスをインスタンス化するコードを書く。
if文またはswitch文を実装するコードを書いて、それらの文に対して正しい式を識別する。
for、拡張forループ(for-each)、do、while、ラベル、break、continueなど、あらゆる型のループや反復子を実装するコードを書き、ループ実行中と実行後のループカウンタ変数の値を説明する。
アサーションを使用するコードを書いて、アサーションの適切な使用方法と不適切な使用方法を識別する。
例外と例外処理句(try、catch、finally)を使用し、例外をスローするメソッドおよびそのメソッドをオーバーライドするメソッドを宣言するコードを書く。
コード内の特定の行で例外が発生する影響を認識している。
例外には、実行時例外、チェックされる例外、エラーが含まれる。
次のいずれかがスローされる結果になる状況を認識できる。
ArrayIndexOutOfBoundsException、ClassCastException、IllegalArgumentException、IllegalStateException、NullPointerException、NumberFormatException、AssertionError、ExceptionInInitializerError、StackOverflowError、NoClassDefFoundError
これらのうちのどれが仮想マシンでスローされるかを知っており、その他については、プログラムでスローすべき状況を認識できる。
プリミティブラッパークラス(Boolean型、Character型、Double型、Integer型など)、autoboxing/unboxingを使用するコードを書く。String、StringBuilder、StringBufferクラス間の違いを説明する。
ファイルシステムのナビゲーション、ファイルの読み込み、ファイルの書き込みを含むシナリオが与えられたとき、java.ioパッケージのクラスのうち、BufferedReader、BufferedWriter、File、FileReader、FileWriter、PrintWriterを使用して(組み合わせを含む)正しいソリューションを作成する。
java.ioパッケージのAPIのうち、DataInputStream、DataOutputStream、FileInputStream、FileOutputStream、ObjectInputStream、ObjectOutputStream、Serializableを使用してオブジェクトをシリアライズまたはデシリアライズするコードを書く。さらに、transient変数およびprivate指定されたreadObjectメソッドとwriteObjectメソッドを宣言して使用するSerializableクラスを作成する。シナリオやコード例が与えられたとき、デシリアライズ中、オブジェクトの継承チェーンでコンストラクタが呼び出されるか、呼び出されるとするといつどのコンストラクタが呼び出されるかを知っている。
java.textパッケージの標準J2SE APIを使用して、特定のロケール用の日付、数値、通貨の値の正しい書式化または解析を行う。与えられたシナリオで、デフォルトロケールまたは特定のロケールを使用する場合に適切なメソッドを特定する。java.util.Localeクラスの目的と用途を説明する。
java.utilパッケージおよびjava.util.regexパッケージの標準J2SE APIを使用して文字列またはストリームを書式化または解析するコードを書く。
文字列に対しては、PatternクラスとMatcherクラスおよびString.splitメソッドを使用したコードを書く。
マッチングの正規表現パターン(.(ドット)、*(アスタリスク)、+(プラス)、?、\d、\s、\w、[]、()に限定)を認識、使用できる。
*、+、?は最長マッチの修飾子に限られ、括弧演算子はグルーピングメカニズムにのみ使用し、マッチング中の内容の捕捉には使用しない。ストリームに対して、FormatterクラスとScannerクラスおよびPrintWriter.format/printfメソッドを使用したコードを書く。
書式文字列で書式化パターン(%b、%c、%d、%f、%sに限定)を認識、使用できる。
java.lang.Threadとjava.lang.Runnableの両方を使用して新しいスレッドを定義、インスタンス化、開始するコードを書く。
存在し得るスレッドの状態を認識し、スレッドの状態がどのように変化できるかを識別する。
与えられたシナリオで、static変数やインスタンス変数が同時にアクセスされないように保護するオブジェクトロックを正しく使用するコードを書く。
シナリオが与えられたとき、waitメソッド、notifyメソッド、notifyAllメソッドを正しく使用するコードを書く。
密なカプセル化、弱い結合度、高い凝集度を実装するコードを書いて、利点を説明する。
与えられたシナリオで、ポリモフィズムを使用するコードを書く。
さらに、キャストが必要な場合を識別し、オブジェクト参照のキャストに関するコンパイラエラーとランタイムエラーを識別する。
コンストラクタ、インスタンス変数またはstatic変数、インスタンスメソッドまたはstaticメソッドに関する継承の修飾子の効果を説明する。
与えられたシナリオで、オーバーライドまたはオーバーロードされたメソッドを宣言/呼び出すコード、およびオーバーライドまたはオーバーロードされたスーパークラスのコンストラクタを宣言/呼び出すコードを書く。
"is-a"または"has-a"関係を実装するコードを書く。
与えられた設計シナリオで、その設計を正しく実装するにはどのコレクションクラス/インタフェースを使用するかを判断する。(Comparableインタフェースの使用を含む)
対応するhashCodeメソッドとequalsメソッドの正しいオーバーライドと正しくないオーバーライドを識別し、==とequalsメソッドの違いを説明する。
Collections APIのうち、特に、Set<E>、List<E>、Queue<E>、Map<K,V>("<",">"は半角)インタフェースとその実装クラスのジェネリックスを使用するコードを書く。ジェネリックスを使用しないCollections APIの制限事項、およびジェネリックスを使用するためにコードをリファクタリングする方法を知っている。
クラス/インタフェース宣言、インスタンス変数、メソッド引数、戻り値の型に型パラメータを正しく使用するコードを書き、ジェネリックスを使用したメソッドまたはワイルドカードの型を使用するメソッドを書いて、これらの2つのアプローチ間の類似点と相違点を説明する。
java.utilパッケージの機能を使用して、リストのソート、バイナリ検索、リストから配列への変換など、リストの操作を行うコードを書く。リストと配列のソートにはjava.util.Comparatorとjava.lang.Comparableインタフェースを使用する。さらに、ソートに対するプリミティブラッパークラスとjava.lang.Stringの「自然順(natural ordering)」の効果を識別する。
与えられたコード例とシナリオで、正しいアクセス修飾子、パッケージ宣言、インポート文を使用して例のコードと相互作用する(アクセスを行う、または継承関係を持つ)コードを書く。
与えられたクラスとコマンドラインの例で、期待される実行時のふるまいを特定する。
オブジェクト参照やプリミティブ型の値が、代入やその他のパラメータの変更処理を行うメソッドに渡されたときに受ける影響を特定する。
与えられたコード例で、オブジェクトがガーベッジコレクションの対象になる時点を認識し、ガーベッジコレクションシステムによって何が保証されており、何が保証されていないかを識別する。System.gcとfinalizationのふるまいを識別する。
JARファイルの内外にあるクラスの完全修飾名が与えられたとき、そのクラスの正しいディレクトリ構造を構成する。コード例とクラスパスが与えられたとき、そのクラスパスがコードのコンパイルに支障を来たすかどうかを判断する。
代入演算子(=、+=、-=に限定)、算術演算子(+、-、*、/、%、++、--に限定)、関係演算子(<、<=、>、>=、==、!=に限定)、instanceof演算子、論理演算子(&、|、^、!、&&、||に限定)、条件演算子(? :)などの演算子を使用して希望する結果を得るためのコードを書く。
2つのオブジェクトまたは2つのプリミティブが等しいかどうかを判定するコードを書く。