[索引]
パッケージ |
インポート文 |
ソースファイルの構成 |
コンパイルと実行 |
パッケージの例 |
コメント |
ガベージコレクション |
Java用語集 |
コラム
本章では少し趣向を変えてJavaプログラムのソースファイル全体の構造、コンパイルと実行のプロセス、およびよく使われるJava用語について説明します。
Javaプログラムの構成単位はクラスですが、クラス名だけで管理していると、すぐに名前の衝突が発生します。 パッケージはこれを防ぐために用意された仕組みです。 すなわち関連したクラスをまとめて小包(パッケージ)として管理します。 外部に公開するクラスのみをpublicとして宣言し、内部だけで使うクラスは外から隠蔽します。 外部に公開したクラスを呼び出すには、次のようにパッケージ名の後にピリオド( . )を付けて、その後にクラス名を記述します。
パッケージ名.クラス名
パッケージ名自身も名前が衝突しないように、階層化が可能になっています。 例えば
java.util.Calendar
はjavaパッケージの中のutilパッケージの中のCalendarクラスを示しています。 これをクラスの完全限定名と言います。 これは次のようにしてに使います。
java.util.Calendar cal = java.util.Calendar.getInstance(); // ☆
上の例はJava言語が標準的に提供しているパッケージでしたが、開発者が独自にパッケージを作ることもできます。 それには、Javaソースの先頭に、次のように書きます。
package mypackage;
packageは独自のパッケージを宣言する旨のキーワードです。 次のmypackageは独自に付けたパッケージ名です。 パッケージ名も命名規約にしたがう必要があります。 これによってこのソースファイルに含まれるすべてのクラスがmypackageというパッケージに収納されることになります。
前述のように外部に公開するクラスにはpublic属性を付けます。 publicが付けられるクラスは、1つのJavaソースファイルで1つに限られます。 public属性はクラスのメソッドにも付けることができます。 これについてはクラスの章で説明します。
パッケージ名を階層的に作れたとしても、全世界の人が作るJavaのパッケージ名の一意性の保証は困難です。 そこでJavaの言語仕様は、作成したプログラムを広い範囲に公開する場合はインターネットのドメイン名を使って一意性のあるパッケージ名を付けるように主張しています。 あなたが abc.co.jp というドメイン名を持つ組織に所属していれば以下のようなパッケージ名を付けることになります。
jp.co.abc.組織内の一意名
上の例(☆)で示したように、いつも完全限定名を使っていては大変です。 そこでインポートという仕組みが用意されました。 まずソースファイルに 01: のように書いておきます。 すると、☆は 02: のように、java.util の部分を省略できます。
01: import java.util.Calendar; 02: Calendar cal = Calendar.getInstance();
また、03: のように * を使うと、java.util 内のすべてのクラスを使うことができます。
ただし、これは java.util の直下にしか有効ではありません。
例えば java.util.jarパッケージ内のクラスも使おうとすると、04: のような記述も必要です。
03: import java.util.*; 04: import java.util.jar.*;
ソースファイルの例を示します。 以下は A.java と言うファイル名の内容です。
--A.java---------------------------------
package mypackage; // package文
import java.util.*; // import文
import java.io.*; // import文
public class A { // クラス定義
…
}
class B { // クラス定義
…
}
-----------------------------------------
Javaのソースファイルは以下の条件を守らねばなりません。
Javaのコンパイルはjavacコマンドを使い次のように行います。
javac A.java
コンパイルが正常に終了すると、Java独自の中間言語(バイトコード)で書かれた、クラスファイルができます。 クラスファイルはソースファイルのクラスの数だけできます。 A.java には2つのクラスがあったので次のようなファイルができます。
A.class
B.class
コンパイルの結果できたクラスファイルは次のようにして起動します。 mainメソッドをもたないクラスは起動できません。 このとき、java A.class と指定するのではなく、拡張子 .class は不要ですので注意してください。
java A
Javaが標準的に提供しているパッケージの内、代表的なものを示します。 java.lang は最も基本的なパッケージであり、暗黙的にimportされているので、明にimportしなくても使うことができます。
java.lang Javaプログラム言語の基本的なクラスを提供
java.io システム入出力の機能を提供
java.util 基本的なユーティリティを提供
java.sql データベースにアクセスして処理するための機能を提供
java.net ネットワークアプリケーションのためのクラスを提供
Javaのコメント文には次の3種類があります。 01: はこれまでも使ってきました。 02: は行内の一部や、逆に長い行に渡ったコメントを記述するのに有効です。 03: は 02: の一部ですが、この形式でコメントを書いておくと、javadoc(ジャバドック)というツールを使ってドキュメントを作成することができます。
01: // 行末までのコメント 02: /* … */ 範囲指定型(複数行可;ネストは不可) 03: /** … */ ドキュメント自動作成用のコメント
Javaでは使われなくなった領域(誰からもポイントされなくなった領域)を探して、共用のメモリ領域(ヒープメモリ)に自動的に返却する処理を行っています。 この仕組みをガベージコレクション(ゴミ集め)と言います。 このためC++では大きな問題となっていたメモリリーク(メモリの開放し忘れ)がJavaでは発生しにくくなりました。
ただし、ある領域が未使用となったからといって、必ずしもガベージコレクションが実行されるとは限りません。 ガベージコレクションは、処理の合間をぬって実行されます。 ある特定の未使用領域に対してガベージコレクションが実行されるかどうか、またいつ行われるかは、ガベージコレクションを行うプログラムに任されています。
※ メモリリーク問題はJavaでは大きく改善されましたが、まだ次の問題があります。
(1) ガベージコレクションが不定期に実行されるので、突然性能が悪化することがある。
(2) プログラマーが使い終わったメモリの解除そのものを忘れると、やはり返却されない領域が少しづつたまりメモリ枯渇を起こすことがある。
クラスパスは、Javaが使用するクラスライブラリーなどの場所を検索する際の、場所を示すリストです。 クラスパスで指定した範囲で使用するクラスが検索できないと、コンパイルまたは実行時にエラーが表示されます。 クラスパスを変更するには、コマンドの -classpath オプションを使用するか、またはOSのCLASSPATH環境変数を使用します。
jar(ジャーと読む)はJava ARchiveの略で、Javaで標準的に使用されている圧縮ファイルです。 クラスファイルなどがZIP形式圧縮されて格納されています。 jarファイルになっていれば、Javaが自動的に展開して実行してくれます。
javadocとはJavaのソースファイルからJavaのリファレンスマニュアルを生成してくれるコマンドです。 ソースファイルに決まった形式でコメントを書いておくと簡単にリファレンスマニュアルができます。 ソースを修正したが、ドキュメントは古いままということがおこりにくくなります。
JVMはJava Virtual Machine(Java仮想マシン)の略です。 JVMはコンパイルの結果できたクラスファイルを、各マシンに固有の形式に変換しながら実行します。 JVMは各プラットホームごとに提供されます。 Javaの基本方針であるWrite Once Run Anywhere(一度書くとどこでも動く)を実現するため、このような仕組みになっています。
JDK(Java Developer's Kit)にはJavaプログラムの開発に必要なセット一式が含まれています。 SUNマイクロシステムズ社のWebサイトから無料でダウンロードできます。 一方、JRE(Java Runtime Environment)はJavaの実行に必要なプログラムのセットです。 JDKはJREを含んでいます。 2005年4月現在のJDKの最新版は5.0です。
J2SEはJava 2 Platform Standard Editionの略で、Javaの標準機能セットです。 2は版数です。 Javaにはこの他にサーバ用のソフトウェア群を含んだJ2EE(- Enterprise Edition)と携帯電話などの小型デバイス向けのJ2ME(- Micro Edition)とがあります。 J2EE > J2SE > J2ME の関係になっています。 サーブレットやJSPはJ2EEに含まれています。