新人エンジニアが学ぶべきWeb系Javaシステムの基礎と連携 第5回 HelloWorldの解読

fd401503 m 新人エンジニアが学ぶべきWeb系Javaシステムの基礎と連携 第5回 HelloWorldの解読

新人エンジニアが学ぶべきWeb系Javaシステムの基礎と連携 第5回です。
HelloWorldの解読になります。
簡単なようでいてきちんと全てを理解するには奥が深かったりします。

まずは全文です。

package jp.co.sdblog.Example1;

public class HelloWorldJava {

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

上記のHelloWorldは第4回のサンプルのダウンロードなどを見てダウンロードしてくると簡単です。

1行目の解読

通常のHelloWorldだとpackageは入っていない場合が多いのですが今回プロジェクトを作成して各章毎のサンプルをわかりやすくいれるためにつけました。
この1行目のpackage jp.co.sdblog.Example1;の意味はこのHelloWorldJavaクラスがある場所を表しています。
特にコマンドラインでjavacなどを使ってコンパイルする場合にはこのpackageとフォルダの関係をきちんとあわせないと動かないです。

3行目の解読

3行目は色々な情報が入っているのそれをひとつ一つ解説すると

public

これはその後で設定しているclass HelloWorldJavaがどういう範囲で見られるかということをあらわしています。
他にprotected、privateなどがあります。
簡単にこの辺の区別をすると
public   プロジェクト全体で使用できる。
protected 継承したクラスでだけフィールド、メソッドを使用できる。
private  他のクラスでは使用できない。
となっています。

class

classの指定となります。
1つのファイルに1つのclassというのが基本だと思うのですが最近は無名クラスなども使用できるようになっていますしAndroidなどのアプリ開発の場合だと1つのファイルに複数のclassを定義したほうが見やすくわかりやすくなる場合もあると思いますのでその辺はプロジェクトによってかわってくるかと思います。

HelloWorldJava

class名となります。
Javaの場合には必ずclass名の先頭は大文字にする事になっています。
※大文字にしなくても動かそうと思えば動かせるのですがEclipseなどの統合環境でwarningがでますし、Javaの流儀としてclass名の先頭は大文字にすることとなっています。

クラス名の後の「{」

ここから8行目の「}」までがこのclassの範囲ですよという範囲の始まりを表しています。
この括弧は非常に重要で、この範囲の中にあるものだけをHelloWorldJavaクラスのフィールドやメソッドにするということをあらわしています。

5行目の解読

public

これは先ほどのクラスと同様アクセスの範囲を表しています。
特にこのmain関数はpublicにする必要があります。
ためしにこのpublicをprivateなどにして確認して欲しいのですが実行できなくなります。

static

このstaticはインスタンスを生成しなくてもその関数を呼び出せるようにするためのものです。
簡単に説明すると以下のような感じになります。
static
インスタンスを生成しなくても実行可能。
呼び出した時に変数は共有されるため複数から呼び出される時には注意が必要
複数クラスで共通の値を共有したい時に便利
staticなし 
インスタンスを生成しないと実行できない。
個別にインスタンスを生成するので複数クラスで使用しても初期化される。

void

voidはmain関数の戻り値が何かをあらわしています。
ここも変更してもらうとおもしろいと思うのですがStringにするとreturnでStringを戻す必要がでてきます。
ただ、この戻り値をStringにしてもシェルなどで戻り値を判定することはできず、System.exit()などを使用して戻り値を返す必要があります。

main

このmainは他の言語でもよくあるようにまず最初に起動をする関数です。
ソースを解読する場合javaのコマンドラインアプリであればこのmain関数を探すと始まりがわかります。
※Web系のJavaアプリの場合はそのパスに対しての呼ばれるクラスが決まるのでmainを探しても意味がありません。
※Androidの場合画面に対してActivityが決まってくるためこれもmainを探しても意味がありません。

(String[] args)

この部分はmain関数の引数となっています。
このargsにはコマンドライン上で実行した際の引数が入ってきます。
例えば以下のように入力して実行した場合
java HelloWorldJava test1 test2
とした場合には
args[0] test1
args[1] test2
が入ってくるようになります。

関数名の後の「{」

この部分は7行目までの括弧に対応しており、この関数の範囲を表しています。
括弧は必ず閉じる必要があり、複数の括弧がある場合その括弧に対応するものがないといけません。
Eclipseの場合shft+ctrl+pで括弧のジャンプができるのでもし対応する括弧がわからない、わかりづらい場合にはEclipseの機能などを使って確認してみてください。

6行目の解読

System.out.println

これはJavaの関数になっています。
興味がある人はJavaのソースを一度見て欲しいと思います。
jdk内にsrc.zipというのがあってそれを解凍すると一通り見れます。
この関数はJavaの関数のSystem関数のstaticメソッドであるoutフィールドを呼び出しています。
このoutフィールドはPrintStreamクラスとなっているので最後のprintlnはPrintStreamのprintlnを返すという形になっています。
この関数はJavaのソースを見てもらうとわかるのですがprint関数とnewLine、改行関数をあわせたもので必ず改行するようになっています。

(“HelloWorld!!”)

これはprintln関数の引数となります。
Javaのソースを確認して追いかけてみてもらいたいのですが”HelloWorld!!”はString形と判断されます。
そのためjdk1.8.0_05のソースの場合だと804行目の引数がStringのPrintlnが呼ばれる事になります。
printlnは先ほどのにも書いたようにprint関数とnewLine関数の集まりでprint関数はwrite関数を呼び出す形になっています。
このwrite関数がほぼ実体で標準出力に書き出す処理になっています。
※興味がある方はソースを追いかけてみてください。あまり深く読んでいくと混乱するかもしれませんし、単純に表示するだけと覚えておけばいいのですがJavaの内部がどのようになっているのか見るのは面白いと思います。

最後の「;」

これは各命令文の最後をあらわしています。
一つの行に複数命令を入れたい場合、次のように書くことも可能です。
System.out.println(“HelloWorld1!!”);System.out.println(“HelloWorld2!!”);System.out.println(“HelloWorld3!!”);
ただし見づらいので以下のように改行して書くのが一般的だと思います。
System.out.println(“HelloWorld1!!”);
System.out.println(“HelloWorld2!!”);
System.out.println(“HelloWorld3!!”);

これでHelloWorldの一通りの解説となります。
HelloWorldに含まれている内容にはJavaを覚える上で必要な要素が含まれていますので参考書などを見ながら何がどうなっているのか理解するようにしてみてください。

ちなみに本当にJavaをはじめた当初の場合はこのプログラムを打ち込んで「HelloWorld!!が表示されます」で終わっていいと思います。