Java First Programming Experience — Hello World! —

Java
目次

Javaプログラミングに必要なもの

Javaプログラミングを始めるにあたって必要なものを列挙してみます。

  • 好奇心
  • ゆっくり、まったり、努力するゆとりある心
  • 解らないことだらけでもそれが当たり前だと思い挫折しない鋼の魂
  • Javaが動作するコンピューター

Hello, World! でJavaの世界の扉を開けよう

それでは、Windows PCを使って最初のJavaプログラムを組みます。
これから組むプログラムは世界中で愛されているプログラムです。
標準出力に”Hello, World!”と表示されるだけの非常にシンプルなものです。
メモ帳などのテキストエディタを立ち上げて下記コードを入力します。

このプログラムの構造と意味をざっくりと見てみましょう。
1行目のpublicとはアクセス修飾子と呼ばれるものでこのクラスが他の場所からアクセス可能であることを示します。
classとは日本語では型と呼ばれたりします。Javaではすべてのコードはクラスの中に書かれます。
これは”HelloWorld”という名前のクラスを定義しています。
HelloWorldはクラスの名前です。
ファイル名もHelloWorld.javaである必要があります。
3行目のコードのpublicもアクセス修飾子で、他のクラスからも呼び出せるようにするための修飾子です。
staticは、mainメソッドがインスタンス化されなくても呼び出せることを意味します。
voidは、mainメソッドが何も値を返さないことを示します。
mainメソッドは、基本的にはプログラムを実行すると、まずこのメソッドが呼び出されます。
mainメソッドの引数のString[] argsは、コマンドライン引数を受け取るためのString型配列です。
String型配列とは文字列型配列のことでこのプログラムでは使われることはありません。
Systemは、Javaの標準クラスでjava.langパッケージに含まれています。
outクラスは、Systemクラスのpublic static final フィールドで型はPrintStreamです。
printlnメソッドは、PrintStreamクラスのメソッドで文字列や数値などを出力し、改行します。
したがって、System.out.printlnメソッドは、標準出力(コンソール)に文字列を改行を追加して表示します。
引数の文字列”Hello, World!”を標準出力に改行を追加して出力します。

メモ帳の名前を付けて保存でファイル名をHelloWorld.javaとして保存します。
ファイル名の拡張子を必ず.javaとします。

Hello World.java

今回は、”C:\JavaProjects”に保存しました。

C:\JavaProjects

Javaプログラムをコンパイルする

保存したHelloWorld.javaファイルをJava Virtual Machineで実行できるようにコンパイルという作業が必要です。
Java Virtual Machineとは、Javaプログラムをコンピュータ上で実行するためのソフトウェアです。
Javaソースコードをコンパイルして生成されるバイトコードを、各プラットフォーム固有の機械語に変換することで、
Write once, run anywhere“というJavaの理念を実現しています。

Write once, run anywhere“というJavaの理念ですが、一部のプログラマからはWrite once, debug everywhereと言われていました。
これは、“一度書いてしまっても、そこら中でデバッグしなければいけない”というジョークです。
Java言語は進化する言語でバグが存在するのは当たり前という風潮があり、「バグレポート」が「バグパレード」という名称になりました。
残念ながらOracleによるSunの買収(2010年)以降、Javaのバグ報告システムは段階的に変更され、「バグパレード」という名称は廃止されました。

それではコマンドプロンプトを立ち上げてHelloWorld.javaファイルを保存したフォルダに移動します。

コマンドプロンプト

移動したら、Javac HelloWorld.javaと入力し、実行します。

コンパイル

無事にコンパイルされたら、HelloWorld.classファイルが作成されています。

HelloWorld.class

Javaプログラムの実行

それでは作成した初めてのJavaプログラムを動かしてみましょう。
コマンドプロンプトを立ち上げて、HelloWorld.classファイルがあるところまで移動します。
java HelloWorldと入力し実行します。

HelloWorld run

実行して、問題がなければ次のようにコマンドプロンプトにHello, World!と表示されます。

HelloWorld run2

数行のプログラムですがJavaプログラマーのはじめの一歩で世界中で愛されています。
つまり、これであなたもJavaプログラマーです。
Javaプログラミングを楽しみましょう!

もう一つのHelloWorld

ここからはおまけです。
J2SE 5.0(Tiger)から可変長引数が使えるようになったのでmainメソッドでそれを利用した下記のコードを使えます。

3行目のメインメソッドの引数が可変長引数 String… args となっています。
実行結果は当然変わりません。
コンパイルされたバイトコードを確認してみます。
配列を使用した最初のプログラムのバイトコードの一部です。

バイトコード配列

flags: (0x0009) ACC_PUBLIC, ACC_STATICとなっています。
これはバイトコード情報で、特定のメソッドやフィールドにどんなアクセス修飾子が付いているかを示すものです。
0x0009は、16進数でビットフラグの合計値です。
ACC_PUBLICが0x0001でpublic、ACC_STATICが0x0008でstaticでビットフラグの合計値が0x0009となっています。
それでは可変長引数を使ったプログラムのバイトコードを見てみます。

可変長引数バイトコード

flags: (0x0089) ACC_PUBLIC, ACC_STATIC, ACC_VARARGSとなっています。
フラグACC_VARARGSが増えています。
ACC_VARARGSは0x0080で可変長引数を使用していることが解ります。
これはJava Virtual Machineでは内部的に配列として扱われますが、フラグACC_VARARGSが付いていることで
呼び出し側が配列を作らずに直接複数の引数を渡すことを可能としています。

配列と可変長引数の違い

配列と可変長引数の違いについてざっくりと見てみましょう。

配列

固定サイズ:作成時にサイズを決める必要がある
明示的に作成・初期化する必要がある
呼び出し側で配列を作って渡す

可変長引数

引数の数が可変。0個でも複数でも渡せる
呼び出し側が配列を作る必要がない(内部的には配列になる)

このような特徴があります。

配列の使用例

配列の呼び出し

可変長引数の使用例

可変長引数の呼び出し

配列 vs 可変長引数 比較表

項目配列可変長引数
サイズ固定可変(0個〜任意個)
呼び出しの手間配列を作る必要がある直接値を並べて渡せる
柔軟性低い(サイズ変更不可)高い(引数の数を気にしなくてよい)
実体同じ(配列)内部的に配列
複数引数との併用可能(順番自由)最後の引数にしか使えない


上記の表のような違いがあります。
注意点として可変長引数は1メソッドにつき1つだけ定義可能となります。
複数の可変長引数を取ることはできません。
他の引数と併用する場合は最後に渡す必要があります。

どちらを使うべき?

  • 引数の数が不定の場合 → 可変長引数が便利。
  • すでに配列としてデータを持っている場合 → 配列のほうが自然。
  • API設計で柔軟性を持たせたい場合 → 可変長引数が読みやすく、使いやすい。

どちらを使うかはプログラムを組む人のセンスによる。
しかし、可変長引数を全く使わないとJ2SE 5.0(Tiger)で追加されたことを知らないと思われるかもしれない。

コメント

コメントする

目次