【Java Silver対策】簡単なJavaプログラムの作成を学習しよう!【例題にも挑戦!】

資格学習
ハック
ハック

こんにちは、運営者のハックです。

今回はJava Silver対策編「第1章の対策」の学習記録を紹介します

第1章 簡単なJavaプログラムの作成

第1章では「パッケージ宣言」「クラスのインポート」「mainメソッド」「Javaコマンド」について出題されます。まずは各分野を自習し、その後問題を解いていきます。

引き続き解説の参考と例題の引用は【黒本】と呼ばれる「徹底攻略Java SE 11 Silver問題集」から行っていきます。

パッケージ宣言とクラスのインポート

パッケージ宣言は、そのJavaファイルが属する「グループ」や「フォルダ」を指定するものです。
これは、本の目次のようなもので、どこに何があるのかを整理するために使います。

例えば、「animals」というパッケージには、Dog.javaやCat.javaなど、動物に関するクラスが入っています。
ファイルの最初にpackage animals;と書くことで、「このファイルはanimalsというグループに入っています」と宣言しているのです。

パッケージ宣言をする上で気を付けるべき点はいくつかあります。

  • ファイルの最初に記述する: パッケージ宣言は、Javaファイルの一番最初に記述する必要があります。他のどんなコードよりも先に、パッケージ宣言を行うことがルールです。
  • 一意性を保つ: パッケージ名は、他の開発者やプロジェクトと衝突しないように一意性を保つ必要があります。これは特に、ライブラリを公開する場合に重要です。多くの開発者は、自分のドメイン名を逆にしたもの(例: com.example)をパッケージ名の基に使用します。
  • 予約語の避ける: パッケージ名にはJavaの予約語(int, classなど)を使用することはできません。予約語を含む名前をパッケージ名として使用すると、コンパイルエラーになります。
  • 無名パッケージ使用に注意:無名パッケージ(無名(デフォルト)パッケージ)とは、Javaファイルの先頭にパッケージ宣言がない状態で、そのJavaファイルが属するパッケージのことを指します。無名パッケージに属するクラスは、パッケージ宣言を全く書かないことによって作成されます。無名パッケージのクラスは、他のパッケージからアクセスできないため、再利用性が低下するので、主に簡単な実験や一時的なテストに限定して使用し、実際のアプリケーションやライブラリではパッケージ宣言を行ってクラスを適切に整理することが大切です。

また、クラスのインポートは、他のパッケージにあるクラスを自分のコードで使いたい時に行います。これは、図書館から本を借りるようなもので、使いたいツールや機能がある本(クラス)を自分の作業台(クラス)に持ってくることを意味します。

例えば、java.util.Listという「リスト」機能を使いたい場合、ファイルの最初に
import java.util.List;
と書くことで、「java.util」というパッケージからListという本を借りてきて使うことを宣言しています。

クラスをインポートする際にも注意すべき点はいくつかあります。

  • 必要なクラスのみをインポートする: 使用していないクラスを大量にインポートすると、コードの可読性が低下します。必要なクラスのみをインポートし、不要なインポート文は避けましょう。
  • ワイルドカードの使用を避ける:「 import java.util.*;」 のようにワイルドカードを使用すると、そのパッケージ内の全クラスがインポートされます。これは便利に思えますが、どのクラスを使用しているかが明確でなくなり、名前の衝突が発生する可能性もあります。特に大規模なプロジェクトでは、具体的なクラス名を明記してインポートする方が好ましいです。
  • 静的インポートの慎重な使用: 静的インポートは、Javaでクラスの静的メソッドや変数を、クラス名を書かずに直接使えるようにするための仕組みです。静的インポートを使うと、クラス名を省略して静的メソッドや静的フィールドにアクセスできます。これはコードを短くすることができますが、どのクラスのメソッドやフィールドを使用しているのかが不明瞭になる可能性があります。静的インポートは、頻繁に使用する定数や明確なコンテキストでのみ使用するとよいでしょう。
モナ
モナ

パッケージ宣言は「このクラスがどこにあるか」を示し、インポートは「使いたいクラスをどこから持ってくるか」を示しています。

次は実際にJavaSilverの例題を見てみましょう。

パッケージに関する説明として、正しいものを選びなさい。(3つ選択)

A. 名前空間を提供する。
B. パッケージ名にはドメイン名を逆にしたものを使用しなければならない。
C. アクセス制御を提供する。
D. クラスの分類を可能にする
E. パッケージに属さないクラスもある。

「徹底攻略 Java SE 11 Silver 問題集」より抜粋
ねこ奈
ねこ奈

さっきの説明で「自分のドメイン名を逆にしたものをパッケージ名の基に使用」って言ってたから、「使用しなければならない」訳ではないのでBは誤りなのにゃ!あとは何かにゃ?

モナ
モナ

クラスは何かしらのパッケージに必ず属するため、Eも誤りです。

パッケージ宣言を省略したクラスはデフォルトで無名パッケージに属するものと解釈されます。

なので、正解は選択肢A,C,Dです。

次のプログラムをコンパイル、実行したときの結果として、正しいものを選びなさい。(1つ選択)

1. public class Sample{
2.     protected int num = 10;
3.   } 
1. package ex4;
2.
3. public class SampleImpl extends Sample {
4.    public static void main(String[] args) {
5.       System.out.println(num);
6.    }
7. }

A. 0が表示される。
B. 10が表示される。
C. コンパイルエラーが発生する。
D. 実行時に例外がスローされる。

「徹底攻略 Java SE 11 Silver 問題集」より抜粋
ねこ奈
ねこ奈

ええと、上段のコードは無名パッケージだから他のパッケージからアクセスできないんだったのにゃ。でも下段のコードは「ex4」パッケージに属しているのにゃ。

モナ
モナ

そうですね。明示的にパッケージ宣言したクラスから無名パッケージに属するクラスにアクセスしようとするとコンパイルエラーになります。

なので正解は選択肢Cです。

mainメソッド

mainメソッドは、Javaでプログラムを始めるスタート地点です。
例えば、ゲームを始めるときの「スタートボタン」のようなものです。

プログラムを実行すると、Javaはこのmainメソッドを探して、見つけたらそこから命令を読み始めます。mainメソッドがないと、Javaはどこから始めていいかわからなくなってしまい、プログラムは動き出せません。つまり、mainメソッドはプログラムの「始まりの合図」をする大切な役割を持っています。

この処理を始めるためのメソッドのことを、一般的に「エントリーポイント」と言います。Javaプログラムにおいては、mainメソッドがこのエントリーポイントにあたります。

mainメソッドがエントリーポイントとなる条件として注意すべき点がいくつかあります。

  • 正確なメソッドシグネチャ: mainメソッドは正確に「public static void main(String[] args)」というシグネチャ(メソッドの宣言)でなければなりません。これが異なると、Javaランタイムはエントリーポイントとして認識しません。
  • クラスの配置: mainメソッドを含むクラスは、実行時にJavaランタイムによって見つかるように適切な場所(クラスパス上)に配置しておく必要があります。
  • パッケージ宣言: クラスがパッケージ内にある場合、そのクラスを実行する際にはパッケージ名を含めた完全なクラス名を指定する必要があります。例えば、「com.example.MainClass」のように指定します。
  • アクセス修飾子: mainメソッドはpublicである必要があります。これにより、Javaランタイムがどの環境からでもメソッドにアクセスできるようになります。また、String[] argsパラメータは、プログラム実行時にコマンドラインから渡される引数を受け取るために使用されます。これにより、実行時の挙動を動的に変更することが可能になります。
モナ
モナ

このようにmainメソッドはプログラムがスタートするきっかけを作る重要な役割を持っています。

次は実際にJavaSilverの例題を見てみましょう。

アプリケーションのエントリーポイントとなるメソッドの条件として、正しいものを選びなさい。(3つ選択)

A. publicであること。
B. staticであること。
C. 1つのソースファイルに複数記述できる。
D. 戻り値はint型であること
E. 引数はString配列型もしくはString型の可変長引数であること。
F. 戻り値として0,もしくは1を戻すこと。

「徹底攻略 Java SE 11 Silver 問題集」より抜粋
ねこ奈
ねこ奈

publicである必要があります」って言ってたからAは正しいのにゃ!あと、「「public static void main(String[] args)」というシグネチャ(メソッドの宣言)でなければなりません」って言ってたから、Bも正解っぽいのにゃ。あとは何かにゃ?

モナ
モナ

エントリーポイントに適用されるルールは以下のとおりです。

  • 公開されていること(publicであること)
  • インスタンスを生成しなくても実行できること(staticであること)
  • 戻り値は戻せないこと(voidであること)
  • メソッド名はmainであること
  • 引数はString配列型(可変長引数のString型も可)を1つ受け取ること

可変長引数のString型というのは「 String… args」と表記されるもので、コンパイル時に配列型の引数に変換されます。

なので正解は選択肢A,B,Eです。

Javaコマンド

Javaコマンドは、コンピューターでJavaプログラムを実行するためのツールです。

例えば、文字や絵を描くための絵の具セットを持っているとします。その絵の具セットで絵を描く行為が、JavaコマンドでJavaプログラムを実行することに似ています。コマンドプロンプトターミナルと呼ばれる画面でJavaコマンドを使って、「このJavaプログラムを動かしてね」とコンピューターに指示するとコンピューターはそのプログラムを動かし始め、結果を画面に表示します。

次はJavaコマンドとそのオプションについて具体的に解説します。

Javaコマンドの構文

java 完全修飾クラス名 [引数 引数 ...]

クラス名の後に続ける引数のことを「起動パラメータ」「コマンドライン引数」と言います。起動パラメータはスペースで区切って複数指定できます。また、起動パラメータはオプションなので省略可能です。起動パラメータとして指定されたデータは、JVMによってString配列型オブジェクトに格納され、mainメソッドの引数として渡されます。

ソースファイルモード

Java 11以降で導入された機能で、Javaソースファイルをコンパイルせずに直接実行することができます。これにより、小さなプログラムやテストコードを迅速に実行できるようになります。コマンドは以下のようになります。

java ソースファイル名.java

このコマンドを使用すると、Javaランタイムが自動的にソースファイルをコンパイルして実行します。

-d オプション

-dオプションは、javacコマンドにおいて、コンパイルしたクラスファイルを出力するディレクトリを指定するために使用します。例えば、以下のように使用します。

javac -d bin ソースファイル名.java

この例では、コンパイルされたクラスファイルがbinディレクトリに出力されます。

javacコマンド

javacはJavaのソースコード(.javaファイル)をコンパイルしてクラスファイル(.classファイル)を生成するコマンドです。これはJava開発キット(JDK)に含まれるコンパイラで、ソースコードをJava仮想マシン(JVM)が解釈できる形式に変換します。基本的な使用方法は以下の通りです。

javac ソースファイル名.java

これにより、同じディレクトリに.classファイルが生成されます。このクラスファイルは、javaコマンドによって実行されます。

–source オプション

–sourceオプションは、特定のJavaのバージョンに準拠してソースコードをコンパイルする際に使用します。このオプションを使うことで、古いバージョンのJavaで書かれたソースコードを、新しいJavaの環境でコンパイルすることが可能になります。例えば、以下のように使用します。

javac --source 1.8 ソースファイル名.java

このコマンドは、ソースコードをJava 8のバージョンでコンパイルします。

モナ
モナ

これらのオプションやコマンドを適切に使用することで、Javaの開発や実行環境を柔軟に管理することができます。

次は実際にJavaSilverの例題を見てみましょう。

以下に示したSampleクラスを実行したときの結果として、正しいものを選びなさい。なお、実行時のコマンドは次のとおりとする。(1つ選択)

> java Sample a \" a\" "a "b c
1. public class Sample{
2.     public static void main(String... args) {
3.         System.out.println(args.length);
4.     }
5. }

A. 4が表示される。
B. 5が表示される。
C. 6が表示される
D. 7が表示される

「徹底攻略 Java SE 11 Silver 問題集」より抜粋
ねこ奈
ねこ奈

「args.length」を表示させるってことは、「> java Sample」の起動パラメータ数を数えろってことなのにゃ。

「a \” a\” “a “b c」だから、aと、\”と…ってこの「\」は一体なんなのにゃ~?

モナ
モナ

スペースを含む文字列を起動パラメータとして渡したい場合には、「a” “b」のように「”(ダブルクォーテーション)」で括ります。

ダブルクォーテーションを文字列で扱いたい場合、「\”」のように円記号をダブルクォーテーションの前に付けます。

以上の条件を踏まえると、例題の文字列は「a」「”」「a”」「a b」「c」と5つになります。4列目はaとbの間にスペースがありますね。正解は選択肢Bです。

まとめ  基礎ルールって意外と難しい

今回はJava Silver対策編第1章「簡単なJavaプログラムの作成」の内容について学習しました。

ハック
ハック

講義で普段使っている「public static void main(String[] args)」の意味だったり、mainメソッドの役割など、Javaプログラムの基本的な構成要素を解説しろとなるとかなり難しかったです。

コードを書ける=JavaSilver試験の問題が解ける、とは限らないことはよく分かります。

しっかりと理解して試験に臨みたいですね。

以上で今回の学習記録を終えます。

ここまでご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました