Developer

【はじめてのJava】Javaの仕組み【プログラムの作り方編】
2020.09.25
Lv1

【はじめてのJava】Javaの仕組み【プログラムの作り方編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


プログラムの作り方編

プログラムの作成と実行の記事ではソースコードを作成、保存ソースコードのコンパイルプログラムの実行を行いました。

今回はJavaの仕組みや初めて書いたソースコードの中で重要な部分を解説していきます。


Javaの仕組み

Javaの仕組みや初めて書いたソースコードの中身としてここでは以下の内容を紹介します。

目次


Javaの仕組み

Javaのプログラムが動作する背景には「JVM」というものが関わっています。そこでJVMについて見ていきましょう。

JVM

 JVM とは、Java Virtual Machineの略です。

Javaの実行環境がインストールされているコンピュータの中には、このJVMが入っています。コンピュータの中にJava専用の仮想コンピュータがもう1台入っているイメージです。JavaのプログラムはこのJVM上で実行されています。

Javaについて紹介した記事で、『(Javaは)一度作成したプログラムは異なる機種のコンピュータにそのまま移植しても動作する』と書きました。これを可能にしているのがJVMです。

上記の記事でも書いた通り、Javaが出始めた頃のプログラムは他の機種にそのまま移植しても同じ動作にならないのが当たり前でした。その理由は、通常のプログラムはそのコンピュータの環境に合わせてコンパイルされており、違うコンピュータに移植すると環境が変わってしまうためです。

それに対してJavaは、コンピュータ内にある『Java専用の仮想コンピュータ(JVM)』上で動作します。この方法であれば、仮想コンピュータ上で動かすプログラムについては、仮想コンピュータの環境さえ一致していれば同じ動作をします。この仮想コンピュータに当たるものがJVMです。

つまり、JavaのプログラムはJVMという統一された仮想環境上で動くようになっているため、他のコンピュータ上でもほぼ同じ動作※が可能になっているのです。
※「ほかのプログラミング言語と比べて動作に差異が出にくい」というニュアンスです。厳密にはOSごとの改行コードの違いなどに影響されないようにソースコードを作成する必要があります。


プチコラム:リリース当初のJava

上記のように、Javaはコンピュータ内に仮想コンピュータであるJVMを動作させ、その上でプログラムを動作させます。今やスマホでもJavaのアプリケーションが動かせる時代です。とても画期的な発想ですが、リリース当初のJavaはプログラミング言語の主流にはならないと思われていました。
その理由の一つは「コンピュータ内に仮想コンピュータを作り出すなんて、動作が重すぎてできるはずない」というものです。

例えば、当時(1990年代後半)筆者の家にあったデスクトップのパソコンは、メモリが64メガバイトでした。現在はスマホですら2ギガバイト(約2000メガバイト)程度のメモリは当たり前に積んでいますので、その差は歴然としています。そのような時代の中では、コンピュータ内で仮想マシンを動かすなんておとぎ話に聞こえたのでしょう。Javaも『発想は素晴らしいが現実的ではない』という技術の一つと認識されていたのだと思います。

その後コンピュータの性能が飛躍的に上昇し、今やJavaはプログラミング言語の代表格の1つとなっています。


ソースコードの中身

プログラムの作成編で扱ったSample.javaのソースコードの内容について、解説していきます。

Sample.javaは以下の通りです。

public class Sample{
  public static void main(String[] args){
    System.out.println("Hello World!");
  }
}

mainメソッド

メソッド
 メソッド とは一緒に実行してほしい内容のまとまりです。

詳しくは別の記事で紹介するので、今は「メソッド」という名前だけ覚えておけば大丈夫です。

mainメソッド
 mainメソッド は、メソッドの一種でJavaのプログラムで実行してほしい処理を書いておく場所です。

mainメソッド以外に書かれている内容は、mainメソッド内で言及されない限り動作しません※。
※厳密には、マルチスレッドやJSP/サーブレットなどではプログラマがmainメソッドを作成しない場合もありますが、今は気にしなくてOKです。

Javaのプログラムを実行したときに以下のようなコマンドを実行しました。

java 動かしたいクラス名

例えば、プログラムの実行方法を解説した記事ではSampleクラスを動かしたいので以下のようにしました。

このコマンドは「Sample.classの中に書かれているmainメソッドの内容を実行しろ」というコマンドになっています。


Javaのmainメソッドの書き方

Javaのmainメソッドは必ず「public static void main(String[] args){ 処理内容 }」という書き方をします。以下のような書き方です。

public static void main(String[] args){
  //ここに実行してほしい内容を書く
}

このJavaのmainメソッドを書く際には、いくつか注意点があります。注意点は以下の通りです。注意点を守っていない場合はコンパイルに失敗したり、実行しても何も起こらなかったりします。

●省略や大文字小文字の違いについて
「public」「static」「void」「main」「String」は必ず書きます。また、大文字小文字も含め、 一言一句変えてはいけません Javaの資格試験では特に頻出の内容です。

●記述する順番について
「public」と「static」については逆の順番でも大丈夫ですが、それ以外については順番を入れ替えることはできません。なお、通常は「public static」の順番にします。

●「String[] args」について
「String[] args」については「String… args」「String args[]」とすることも可能です。なお、通常は「String[] args」とします。
(「String args…」や「String[] args[]」はダメです。)

●「args」について
「args」については識別子の命名規則を守っていれば変更しても大丈夫です。なお、通常は「args」とします。

具体例は以下の通りです。試験によく出る形を抜粋して掲載しています。もう少しいろいろなパターンを知りたい方はこちらの記事にまとめてあります。

記載例 mainメソッドとして正しく動作するか 備考
public static void main(String[] args){ } 通常の形
public static void main(string[] args){ } × stringのsが小文字
public void main(String[] args){ } × staticが抜けている
public static main(String[] args){ } × voidが抜けている

Sample.javaのmainメソッド

プログラムの作成編で扱ったSample.javaのソースコードのmainメソッドは以下の部分です。

public static void main(String[] args){
  System.out.println("Hello World!");
}

このプログラムをコンパイル、実行すると画面内に「Hello World!」と表示されましたが、これはSample.javaのmainメソッドの中に『「Hello World!」を画面に出力しろ』という内容が書かれていたためです。

では、具体的にはどこに書かれていたのでしょうか。


System.out.println();

System.out.println();は「( )内のものを標準出力(通常は画面)に出力し、その後改行しろ」という命令です。例えば「System.out.println(1);」と書かれていたら1が表示されます。

文字列を表示する際には" "で囲む必要があります。Appleと表示したければ「System.out.println("Apple");」となります。

System.out.println(1); //1と表示される
System.out.println("Apple"); //Appleと表示される

mainメソッドの中には「System.out.println("Hello World!");」と書かれていましたが、これは「標準出力(通常は画面)にHello world!と表示しろ」という命令です。

そのため、Sampleを実行すると画面に「Hello world!」と表示されたのです。

System.out.println();の正体

では、このSystem.out.println();とはいったい何者なのでしょうか。実はこのSystem.out.println();はJavaがもともと準備しているメソッドの1つです。Javaの理解が進むともう少し細かく読み解けるようになりますので、今は「画面に表示を行う際に利用するメソッド」と覚えておけば十分です。


プチコラム:System.out.println()は実際のシステムでは見かけない

System.out.println()は、プログラムの勉強の際には非常によく見かける一方で、実際のシステムではあまり見かけません。
その理由は、通常のプログラムでは「標準出力(ユーザの手元の画面)」に表示をする機会があまりないからです。
例えばWebアプリケーションであれば、「レスポンス」と呼ばれる部分に出力しますし、デバッグ用のログであれば「ファイル」に出力されることがほとんどですので、標準出力に表示することはあまりありません。

一方で()の内容をすぐに画面に出してくれると視覚的に動作を確認しやすいため、Javaの学習や動作確認を行う際にはよく利用されます。


ポイント

コンパイルされたJavaのプログラムは「Java Virtual Machine(JVM)」の中で動作します。
Javaのプログラムが実行されるときは、指定されたクラスファイルの中の「mainメソッド」が実行されます。
Javaのmainメソッドは形式が決まっており、形式を守っていない場合はコンパイルや実行に失敗します。
画面に表示する際には「System.out.println()メソッド」を利用します。


プログラムの作り方編・次回の内容

これでJavaのプログラムの作成方法と実行方法が分かりました。プログラムの作り方編・次回はうまくコンパイルや実行ができない場合について、触れていきます。


はじめてのJavaシリーズの記事一覧はこちら
シリーズ全記事一覧
環境構築編
プログラムの作り方編
データ型と変数編


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら