第4話
どうもこんにちは、くまさんです。ハトさんだよ
くまさん「今日はJava SE Bronzeについてお話ししていくよ」
ハトさん「もしかして、この前話したJavaと関係があるものかな?」
くまさん「そうだよ。では早速話していくよ」
ハトさん「よろしくお願いします」
くまさん「Java SE Bronze。Oracle社が実施しているJava SE認定資格の1つだよ。最も難易度が低いのがBronzeで、この資格の上にSilver、Goldとあるよ」
ハトさん「なるほど、ブロンズ、シルバー、ゴールドと上がっていくたびに難易度が上がっていくんだね」
くまさん「そうだよ。ちなみにブロンズは日本でのみ受験ができて、海外では受験できないんだ」
ハトさん「そうなんだ! じゃあ、僕ブロンズを受けてみたいな。ブロンズを受けるにあたって、どんな資格本が資格対策としていいのかな?」
くまさん「それなら、Java SE Bronze問題集。いわゆる黒本をオススメするよ」
ハトさん「その理由とは?」
くまさん「黒本は売り上げNo.1で、一発合格が見込めるからなんだ。実際、主も1ヶ月黒本を何周も解いたらブロンズに合格したんだ」
ハトさん「おお! じゃあブロンズの資格対策には黒本だね!」
くまさん「じゃあその黒本を用意したから、今から問題を解いていこう。」
ハトさん「視聴者さんも一緒に考えてみてね」
くまさん「第一問。
Javaに関する説明として、正しいものを選びなさい。(2つ選択)
A.すべての変数は、型の宣言をしなければならない。B.すべての式は、肩を持たない。
C.式の型はコンパイル時に解釈される。
D.実行時にエラーを発生させることで、型の整合性を確認する。
実際の試験だと2つ選ばないミスが多発するから焦らずに問題をよく見ることが大切だよ」
ハトさん「うん、分かった! えーと.......答えはAとCかな」
くまさん「正解! では選んだ理由を聞かせてくれるかな?」
ハトさん「プログラム言語は、静的言語と動的言語の2つに分かれていて、これらの違いは変数や式情報の扱い方にあるんだ。型は、データの種類を表すための情報だよ。変数や式の結果作られるデータの種類を、コンパイル時に決定するのが「静的言語」、実行時に決定するのが「動的言語」なんだ。静的言語の場合は、変数や式が型情報を持つよ。動的言語の場合は変数や式が型情報を持たない代わりにデータ自身が型情報を持つよ。さらに、型の整合性をチェックする仕組みには、静的であるか動的であるかのほかに「強さ」という尺度があるんだ。この強さは、どの程度まで厳密に型の整合性をチェックするかという厳密性を表すよ。Javaは変数や式が型情報を持ち、コンパイラによって厳密に型の整合性をチェックするから、「強い静的型付け言語」と呼ばれるよ。つまり僕が言いたいのは、Javaは強い静的型付け言語だから、変数や式が型情報を持つから型の宣言をしなければいけないし、式の型はコンパイル時に決定されるから答えはAとCだよ」
くまさん「うんうん、よく勉強しているね」
ハトさん「えへへ、早く自分でゲームが作りたくて」
くまさん「第二問。
Javaに関する説明として、正しいものを選びなさい。(2つ選択)
A.マルチスレッドによる並行処理をサポートする。
B.マルチプロセスによる並行処理をサポートする。
C.シングルスレッドアプリケーションのみをサポートする。
D.並行処理を完全に制御できる。
E.並行処理を部分的に制御できる」
ハトさん「えーと...答えはAとE」
くまさん「正解! その理由とは?」
ハトさん「まず、並行処理とは処理を複数同時に実行することで、ソフトウェア全体の処理性能を向上させる技術のことだよ。Javaは専用の構文や標準クラスライブラリを提供していて、並行処理が容易なんだ。
一般的な並行処理の実現方法には次の2つがあるよ
・同じアプリケーションを複数実行する
・1つのアプリケーションで複数の処理を交互に切り替えて実行する
これらの実現方法のうち、前者を「マルチプロセス」、後者を「マルチスレッド」と呼ぶんだ。マルチプロセスのプロセスとは、アプリケーションが起動するときに、OSから割り当てられたメモリ空間のことを指すよ。このメモリ空間には、プログラムを実行するのに必要なコードや変数、その他すべてが展開されていることから、プロセスはアプリケーションそのものと呼ぶこともできるんだ。マルチプロセスはアプリケーションを複数同時に起動し、OSが交互にアプリケーションを切り替えながら実行することで並行処理を実現するよ。
もう一方のマルチスレッドは、プロセス内を複数に分割することで並行処理を実現するよ。マルチスレッドのスレッドとは、プロセス内で実行される一連の処理の流れのことで、マルチスレッドとは、1つのプロセス内でスレッドが並行に実行される並行処理の形態のことだよ。Javaはシングルプロセス、マルチスレッドで並行処理を実現するけど、どのスレッドを実行するかはJVMが判断するよ。つまりは、ユーザーは並行処理を部分的に制御できることになるよ。だから答えはAとEになるよ」
くまさん「うんうん、そうだね。ただ、ハトさんが説明している中で分からない単語が出てきたと思うから、視聴者さんに向けて私が補足するね」
ハトさん「よろしくお願いします」
くまさん「私がハトさんの説明の中で難しそうだと思った単語は、標準クラスライブラリ、OSだね。標準クラスライブラリとは、様々な機能のクラスが、機能ごとにパッケージというまとまりで用意されているものをいうよ。クラスは、データ(フィールド)と、そのデータを操作するメソッド(関数)をまとめたもののことだよ。フィールドは、クラスの特性を表す変数情報のことだよ。メソッドはプログラムに行わせる処理の集まりを記述したものだよ。OS、これは聞いたことあるって人がいると思う。OSは、コンピュータの入出力や同時並行処理などを管理するプログラムのことだよ。補足はこんなところかな」
ハトさん「ありがとうくまさん!」
くまさん「どういたしまして。さて、次の問題に移ろう。第三問。
Javaに関する説明として、正しいものを選びなさい。(2つ選択)
A.特定のOSに特化したプログラミング言語である。
B.ほかのプログラミング言語に比べて高速に実行できる。
C.あらかじめ機械語にコンパイルされる。
D.メモリ管理が自動化される
E.セキュリティが向上する実行方式を取り入れている」
ハトさん「答えはDとEだね」
くまさん「正解! その理由とは?」
ハトさん「前にもくまさんが話したことだけど、Javaの特徴を表す言葉に「Write Once, Run Anywhere(一度書いたら、どこまでも動く)」があるよ。この特徴を実現しているのがJVM(Java Virtual Machine)という仮想的なコンピュータだよ。
僕たちが普段の会話で使う言語のことを「自然言語」といって、自然言語に近い文法を使って記述するソースコードは、人間が読み書きするためのものなんだ。このソースコードは、コンピュータが理解できる機械語にプログラムの実行前に変換しないといけないよ。このソースコードから機械語への変換作業のことを「コンパイル」、この作業をする変換ソフトウェアのことを「コンパイラ」というんだ。ここから新しい言葉が出てくるから、よく聞いてね」
くまさん「はーい!」
ハトさん「コンパイラは、プログラムを実行するコンピュータのOSが理解できるようにするために、OSの種類に応じてソースコードをコンパイルするから、Windows用にコンパイルしたプログラムはWindows専用、macOS用にコンパイルしたプログラムはmacOS専用となり、これらに互換性はないんだ」
くまさん「ふむふむ、つまりはそのOS用にコンパイルしたプログラムはそのOS専用になるということだね」
ハトさん「やっぱりくまさんはすごいなぁ。僕よりも説明が簡潔で上手だよ。」
くまさん「ハトさん、勉学において他人と比べることはしてはいけないよ。勉学における目標とは、その分野を極めて、新しい発見をすることなんだ」
ハトさん「くまさん...! 僕、もっと頑張るよ!」
くまさん「フフッ...ほどほどにね? 応援しているよ」
ハトさん「うん、ありがとう! さて、説明の途中だった。ソースコードをあらかじめコンパイルしてから実行する方式のことを「事前コンパイル方式」というよ。この方式のメリットは、対象OS専用のコードに変換されているから高速に実行できるんだ。デメリットは、専用コードであるために対象OS以外では実行できないことがデメリットだよ。事前コンパイル方式を採用しているプログラミング言語には、CやC++などがあるよ。
他には、インタープリタ方式といって、インタープリタと呼ばれる仲介アプリケーションを使って、ソースコードを実行時にコンパイルすることが特徴だよ。インタープリタ方式では、事前にコンパイルして専用コードに変換しておく必要がないから、理論上は対象OSごとのインタープリタを用意すれば、プログラムをどんなOSでも実行できるんだ。このインタープリタ方式を採用しているプログラミング言語には、PHPや JavaScriptなどがあるよ。でも、この方式にもデメリットがあって、インタープリタ方式はソースコードを1行ずつコンパイルしながら実行するから効率が悪くて、事前コンパイル方式に比べて実行速度が落ちてしまうよ」
くまさん「事前コンパイル方式は実行速度が早くて、インタープリタ方式は実行速度が遅いということだね」
ハトさん「そういうことだよ。Javaは「Write Once, Run Anywhere」を実現するために、このインタープリタ方式を採用していて、JVMがプログラムの実行時にOS専用のコードにコンパイルしながらプログラムを実行するんだ。つまりはOSごとにJVMインタープリタを用意すれば、Javaのプログラムはどこでも実行できるんだ。ここまで来て、なんでJavaは実行速度が遅いインタープリタ方式を採用したか気になっている人もいると思います。インタープリタ方式を採用した理由は3つあるよ。
1.特定のプラットフォームやOSに依存しない
2.ガベージコレクションによってメモリ管理が自動化できる
3.セキュリティが向上する
1つめの理由は、実行環境に合わせたJVMを用意すれば、どのようなコンピュータやOSであっても実行可能だから。2つめと3つめの理由は、インタープリタ方式の場合、OSが直接実行するのではなく、Javaであれば JVM、JavaScriptであればブラウザという具合に、コンパイルしながら実行する仲介アプリケーションが存在するよ。この仲介アプリケーションがメモリ管理をしたり、問題のあるコードはないかチェックしたりしながらプログラムを実行するからだね」
くまさん「うん。確かに間に仲介アプリケーションがあることでセキュリティ面が向上するね」
ハトさん「うん。つまりは、インタープリタ方式だから特定のOSに特化していなくて、他のプログラム言語に比べて高速に実行できなくて、ソースコードを実行時にコンパイルするからあらかじめ機械語にコンパイルしないよ。さっきくまさんが説明したガベレージコレクションによってメモリ管理が自動化されるし、仲介アプリケーションによってセキュリティが向上するから答えはDとEになるよ」
くまさん「ありがとうハトさん。では第四問。
Javaプログラムの作成から実行までの流れに関する説明として、正しいものを選びなさい。(2つ選択)
A.コンパイラによって機械語に翻訳される
B.コンパイラによって中間コードにコンパイルされる
C.実行可能ファイルを作成する
D.JVMにクラスファイルを読み込ませる」
ハトさん「答えはBとDだよ」
くまさん「正解! その理由は?」
ハトさん「ソースコードは人間さんが理解しやすいように記述するもので、プログラムを効率よく動かすには不要なコードも多いんだ。そこで、ソースコードから不要なコードを排除して、パフォーマンスが向上するようにコードを変換しておくインタープリタ方式の1つが「実行時コンパイル方式」だよ。
実行時コンパイル方式では、コンパイラによって実行に最適化されたコードに変換されているため、インタープリタ方でもパフォーマンスが低下しにくいという特徴を持っているよ。Javaは、この実行時コンパイル方式を採用した「Hotspot VM」という技術をJVMに導入しているんだ。そのおかげでJavaは事前にコンパイルしておく言語と同じくらいのパフォーマンスを持っているよ。
Javaの実行時コンパイラ方式では、コンパイラによって変換されたコードを中間コードと呼ぶよ。クラスファイルは、この中間コードが記述されたファイルのことを指しているよ。実行時コンパイル方式はインタープリタ方式の一種といえるけど、高速化のために事前にバイトコードに変換されている点が異なっているよ」
くまさん「インタープリタ方式は実行時にコンパイルするけど、実行時コンパイル方式は事前にバイトコードに変換されているということだね」
ハトさん「うん。また、Javaは実行時にネイティブコードにコンパイルしてもファイルには書き出さず、CやC++のように実行可能ファイルを作ることはないよ。JVMが実行時にコンパイルしたネイティブコードは、そのまま実行されるか、頻繁に実行するコードであればメモリ上に一時的に保存されるよ。つまりは、Javaの実行時コンパイル方式では、一旦中間コード(クラスファイル)に変換してJVMが読み込みを行うからBとDが確定するよ。そして、Javaは実行時にネイティブコードにコンパイルしてもファイルには書き出さず、CやC++のように実行可能ファイルを作ることはないからCは間違いだね。Aも一旦中間コードに変換されるから間違いだよ」
くまさん「その通り! 第五問
Javaのクラスファイルに関する説明として、正しいものを選びなさい。(1つ選択)
A.プラットフォームに依存したネイティブコードが記述されている
B.プラットフォームに依存しないネイティブコードが記述されている
C.JVMだけが理解できるコードが記述されている
D.人間が理解できるコードが記述されている
今回の問題は1つ選択だよ。間違えないようにね。また、プラットフォームとは、ソフトウェアやハードウェア、サービスを動かすための基盤となる環境のことだよ」
ハトさん「はーい! えーと...答えはCだね」
くまさん「正解! その理由は?」
ハトさん「Javaは実行時コンパイル方式を採用していて、コンパイル後に生成されるクラスファイルには、中間コードと呼ばれる実行に最適化されたコードが記述されているんだ。JVMはこの中間コードを読み込んで機械語にコンパイルして実行するわけだね。機械語は特定のプロセッサ群の「固有語」だからネイティブコードと呼ぶこともあるよ。つまりは、クラスファイルに記述されているのは中間コードだから、JVMだけが理解できるコードが記述されているCが答えだよ」
くまさん「うんうん。視聴者さんも段々分かってきたかな? ハトさんの説明の中で難しい単語を補足すると、プロセッサはCPUのことで、日本語では「中央演算処理装置」と訳され、周辺機器やソフトウェアから来る指示を処理したり、メモリなどを制御したりする装置のことだよ。」
ハトさん「ありがとうくまさん!」
くまさん「どういたしまして。さて、今日は第八問までやったら終わりにしようか。後三問だから、眠りそうになっている視聴者さんも頑張ってついてきてね」
ハトさん「一緒に頑張ろう!」
くまさん「第六問。
Javaに関する説明として、正しいものを選びなさい。(2つ選択)
A.自動的にメモリを解放する
B.メモリを任意のタイミングで解放できる
C.ポインタを使ってメモリを自由に操作できる
D.メモリの効率的な利用を自動化する」
ハトさん「答えはAとDだよ」
くまさん「その理由とは?」
ハトさん「メモリは有限なリソースで、無尽蔵に使えるわけじゃないから、使わなくなったメモリ領域を解放して、プログラムの実行に必要な空きメモリを常に確保するメモリ管理が欠かせないんだ。Javaが誕生する前の言語では、プログラマーがメモリを解放するコードを明示的に記述していたんだよ。でも、常にメモリの状況を考えながらプログラミングするのは開発コストを増加させる原因になってたんだ。そこで、この問題を解決するために、Javaはガベージコレクションという自動メモリ管理機能を備えているよ。ガベージコレクションは、確保しておく必要がなくなったメモリ領域を自動的に検出し、解放する機能なんだ。この機能のおかげで、プログラマーはメモリ管理を行う必要がなくなったよ。ガベージコレクションは、「ガベージコレクタ」と呼ばれるJVMの機能が実行するよ。ガベージコレクションはガベージコレクタの処理手順に従って実行されるから、プログラマーがメモリ解放のタイミングを制御することはできないんだ。また、ガベージコレクタにはガベージコレクションによってメモリ領域に空き領域ができたとき、細切れになったメモリ領域を整理して、空き領域を確保する「コンパクション」と呼ばれる機能もあるよ。CやC++といった言語では、メモリアドレスを指し示す「ポインタ」を用いてメモリを自由に操作することができるんだ。でも、ポインタはプログラミングの自由度を上げる反面、解決が困難なバグの原因にもなってしまっていたんだ。だから、Javaではプログラムからメモリを直接操作できないようになっているよ。つまりは、ガベージコレクションはガベージコレクタの処理手順に従って実行されるから自動的で制御できないんだ。また、ガベージコレクタにはコンパクションと呼ばれるガベージコレクションによってメモリ領域に空き領域ができたとき、細切れになったメモリ領域を整理し、空き領域を確保する機能があってメモリの効率的な利用を自動化しているんだ。だから答えはAとDになるよ」
くまさん「素晴らしい! あと2問だよ。第七問。
アプリケーションのエントリーポイントとなるメソッドの条件として、正しいものを選びなさい。(3つ選択)
A.publicであること
B.staticであること
C.1つのソースファイルに複数記述できる
D.戻り値型はintであること
E.引数はString配列型もしくはString型の可変長引数であること
F.戻り値として0、もしくは1を戻すこと
今回の問題は3つ選択だよ」
ハトさん「うーん...答えはAとBとEだね」
くまさん「それはどうしてかな?」
ハトさん「クラスには複数のメソッドを定義できて、このときどのメソッドから処理を始めるのかが決まっていなくてはいけないよ。処理を始めるためのメソッドのことをエントリーポイントと呼ぶよ。JVMは、Javaコマンドで指定されたクラスを読み込み、そのクラスに定義されているエントリーポイントから処理を始めるんだ。Javaでは、エントリーポイントとなるメソッドの定義が決められていて、プログラマーが自由に決めることはできないよ。
例としてエントリーポイントとなるメソッドの定義を記述してみるよ
public static void main(String[] args) {
// any code
}
上記のコードのうち、変更できるのは引数名「args」の部分だけで、そのほかの部分は変更できないんだ。引数名の部分は単なる変数名の宣言にすぎないから、命名規則に従っていれば自由に変更可能だよ。エントリーポイントに適用されるルールは以下の5つだよ
1.公開されていること(publicであること)
2.インスタンスを生成していなくても実行できること(staticであること)
3.戻り値は戻せない(voidであること)
4.メソッド名はmainであること
5.引数はString配列型を1つ受け取ること
エントリーポイントは、そのメソッド名がmainと決められていることから、一般的に「mainメソッド」とも呼ばれるよ。同じシグニチャ...名前と引数のセットのメソッドを複数記述できないように、mainメソッドも複数記述できないよ。エントリーポイントの引数にはString配列型だけではなく、次のように可変長引数のString型を受け取ることもできるよ。これは、可変長の引数はコンパイル時に配列型の引数に変換されるためだよ
例 String型の可変長引数を受け取るmainメソッド
public static void main(String...args) {
}
」
くまさん「なるほど。だけど、この説明だと何を言っているのか分からない人もいると思うから、私から今の説明をまとめると
•mainメソッドは、Javaプログラムのスタート地点
•1つしか作れない(同じシグネチャのメソッドを複数作れないため)
•引数として String[] args か String... args を使える
•可変長引数(String... args)は、実際には配列として処理される
ということだね」
ハトさん「そういうことだよ。つまりは、エントリーポイントに適用されるルールにあるAとB。くまさんがまとめてくれた、引数としてString[] args か String... args を使えるからEが答えだよ」
くまさん「いいね! じゃあ最後の問題だよ。ハトさんも視聴者さんも頑張ってね
第八問。
Javaのソースファイルに関する説明として、正しいものを選びなさい。(2つ選択)
A.1つのソースファイルにpublicなインターフェースを複数記述できる
B.ソースファイルの名前はpublicなクラス名と一致させなくてはいけない
C.1つのソースファイルには、1つのクラスだけを記述できる
D.1つのソースファイル内に、デフォルトのアクセス修飾子で修飾したインターフェースとpublicなクラスの両方を記述できる
E.1つのソースファイルにpublicなクラスを複数記述できる
この問題は2つ選択だよ」
ハトさん「えーと...答えはBとDだね」
くまさん「正解! これで全問正解だよハトさん。本当に偉いよ」
ハトさん「えへへ...そうだ、その答えになった理由だよね。えーと、ソースファイルには、publicで修飾されたクラスやインターフェース、列挙型は1つしか記述できないよ。
ソースファイルの名称はpublicなクラスの名前、インターフェース名、列挙型名のいずれかと一致させなければならないんだ。一致しなかったらコンパイルエラーになるよ。publicなクラスやインターフェース、列挙型はソースファイルに1つしか記述できないけど、それ以外のアクセス修飾子を持つものであれば複数記述できるよ。でも、1つのファイルに複数のクラスを記述することは推奨されていないよ。なぜなら、ソフトウェアの規模が大きくなって、クラス数が増えてくると、どのファイルにどのクラスを定義したのかがわかりづらくなるからだよ。つまりは、ソースファイルの名称はpublicなクラスの名前、インターフェース名、列挙型名のいずれかと一致させなければならないからB。publicなクラスはソースファイルに1つしか記述できないけど、デフォルトのアクセス修飾子で修飾したインターフェースはアクセス修飾子を持っているからpublicなクラスと同じクラスファイルに記述できるからDになるよ」
くまさん「素晴らしい回答だよ! はい、今日はこれで終わりだよ。また次回お会いしましょう」
ハトさん「またねー! 今日は本当に長い時間付き合ってくれてありがとう」
くまさんとハトさんのないしょバナシ @09053805858
★で称える
この小説が面白かったら★をつけてください。おすすめレビューも書けます。
フォローしてこの作品の続きを読もう
ユーザー登録すれば作品や作者をフォローして、更新や新作情報を受け取れます。くまさんとハトさんのないしょバナシの最新話を見逃さないよう今すぐカクヨムにユーザー登録しましょう。
新規ユーザー登録(無料)簡単に登録できます
この小説のタグ
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます