Deep Side of Java〜Java 言語再入門 第2回 〜 Java 文法を中心に

組み込みクラスライブラリ・パッケージ

java.lang.*






組み込みクラスライブラリ・パッケージ

java.lang.*

java.lang.* パッケージは、Java の言語仕様自体に関わるパッケージである。これは明示的に import する必要はなく、常に import なしに利用できる。おおまかにいうと、Java のプリミティブ型をクラス化した Integer, Long, Double などのクラスと、文字列を扱う String クラス、例外を扱う Exception クラス、インタプリタシステムを表わす System クラス、数値演算ライブラリをクラスメソッドとして定義する Math クラス、ルートオブジェクトである Object クラス、スレッドを定義し運用する Thread クラス、動的クラスロードを実現する Class クラスなどがあり、大変重要である。以下主要なメソッドのみ解説する。(Thread クラスは使い方が重要なので、Applet を解説するときに解説する。)

java.lang.Integer クラスなど

Java のプリミティブ型には、boolean, byte, short, int, long, char, float, double があるが、それぞれをクラスとして定義した Boolean, Byte, Short, Integer, Long, Character, Float, Double クラスがある。特に Character(char) はCとは異なり、16ビット値であり、UNICODE表記(\u34f8)によりリテラル表現がなされることに注意。だから、Character クラスにはその文字の文字種別を扱うメソッド(ctype.h のような)が大量に含まれる。

ここでは Integer クラスを例に取り、有用なメソッドを解説する。他のクラスも大体似たようなメソッドが定義されている。

static int parseInt(String)
文字列の数値を int 値に変換するクラスメソッド。前述のように NumberFormatException を投げるので、チェックが必要である。
static String toString(int)
数値を10進文字列に変換するクラスメソッド。
static String toHexString(int)
数値を16進文字列に変換するクラスメソッド。
doble doubleValue(), short shortValue() など
double 値などに変換するメソッド。

Character クラスに含まれる ctype.h 風のメソッドには次のものがある。以下に実例で示すものはすべて boolean 型を返すクラスメソッドである。なお、Java では文字はすべて国際化に対応した UNICODE であるために、大文字・小文字・数字のカテゴリーには、単なるASCII英数字以外のもの(各国語用の大文字・小文字・数字)も含まれることに注意されたい。また、具体的な表示はそのOSによっては対応するフォントがないために、表示できない場合もある。

   String s = "My Test 1234";
   for( int i = 0; i < s.length(); i++ ) {
       char c = s.charAt(i);
       if( Character.isDigit( c ) ) {
            System.out.println( i + "字目は数値です" );
       } else if( Character.isLowerCase( c ) ) {
            System.out.println( i + "字目は小文字です" );
       } else if( Character.isUpperCase( c ) ) {
            System.out.println( i + "字目は大文字です" );
       } else if( Character.isWhiteSpace( c ) ) {
            System.out.println( i + "字目は空白文字です" );
       } else {
            System.out.println( i + "字目はそれ以外です" );
       }
   }

java.lang.String クラス

さて、超重要クラスの1つである String クラスである。これは文字列を扱うクラスである。しかし、リテラル表現として "文字列" が使えたり、+ 演算子を上書きして文字列連結が行えたりとか、ちょっと特殊な文法サポートを持つクラスである。しかし、String クラスはリテラルな文字列(変更不能な文字列)のみを扱うことに注意されたい。変更可能な文字列バッファを扱うには StringBuffer クラスを使う。

char charAt(int index)
index 番目の文字を返す。
boolean equals(Object)
文字列が内容的に等しいかどうかを判定する。
int indexOf(String s)
その文字列に、部分文字列 s が含まれていれば、その開始位置を返す。含まれなければ -1 を返す。
int length()
その文字列の長さを返す。
String substring(int begin, int end)
部分文字列 s[begin]〜s[end-1] の範囲を返す。第2引数がなければ、最後まで返す。
String trim()
文字列の先頭からと末尾からと、両方から空白文字を削除したものを返す。

String クラスのメソッドが String クラスを返すときには、その本質上、すべて新しく生成されたインスタンスを返すのは当然である。また、これらのメソッドは文字列リテラルに対しても利用できる。たとえば、次の通り。

String part = "Hello, world!".substring( 7, 12 ); /* → "world" */

java.lang.StringBuffer クラス

String クラスに対して、StringBuffer クラスは可変の文字列を定義し、文字列バッファとして使われる。バッファは自動的に伸び縮みするので、オーバーフローを気にする必要はない。ほとんどの String クラスメソッドが同様に定義されているが、固有のものだけ示す。

StringBuffer append(Object)
オブジェクトを文字列化して、バッファの最後に追加する。
StringBuffer delete(int start, int end)
s[start]〜s[end-1] までの文字を削除して詰める。
StringBuffer insert(int offset, Object o)
offset 位置にオブジェクトを文字列化して挿入する。
StringBuffer reverse()
文字列を逆転する。

java.lang.System, java.lang.Runtime クラス

すでに何度も登場しているクラスである。System クラスは Java インタプリタを示す。だから、インスタンスの生成はできない。Runtime クラスもやはり Java インタプリタを示すが、そのランタイム・オブジェクトというニュアンスを持つ。実質上 System.exit(), System.gc()メソッドは、Runtime クラスのメソッドを呼び出すに過ぎない。

Sytem クラスのメソッドは次のものをよく使う。

public static InputStream in
public static PrintStream out
public static PrintStream err
これらはそれぞれ、標準入力、標準出力、標準エラー出力を定義するクラス変数である。
static void exit(int ret)
ret をリザルトコードとして、インタプリタを終了する。
static void gc()
ガベージコレクタを明示的に実行するように、スケジューラに依頼する。

Runtime クラスのメソッドとして外部プログラムを起動する exec() が実装されている。この実例をやってみよう。次のプログラムはサブプロセスとして ``ls -l'' を実行し、その結果を取得するパイプ実行風のプログラムである。

try {
        Runtime rt = Runtime.getRuntime(); /* コンストラクタを使わない */
        Process ps = rt.exec( "ls -l" );
        InputStreamReader isr = new InputStreamReader( ps.getInputStream() );
        BufferedReader br = new BufferedReader( isr );
        String line = br.readLine();
        ...............
} catch( Exception e ) {  /* 結構沢山の種類の例外を投げる */

java.lang.Math クラス

Math クラスは数値計算パッケージをクラス化したものであり、libm.a に含まれる数値演算関数がほぼすべて、クラスメソッドとして定義されている。また、E と PI の定数も、クラス変数(定数)として定義されている。たとえば、次の通り。

static double sin(double);
static final double PI;

Mathクラスに属するクラスメソッドは大量にあるが、ほぼCの math.h にあるものと同じなので、特に列挙しない。ただ、精度の問題上、java.lang.Math.random() は、java.util.Random クラスを利用した方が良い。

java.lang.Class クラス

さて、Java の面白いところは、クラス自体も Class クラスのインスタンスであることである。だから、クラス名を指定して Class クラスのインスタンスを生成し、その生成された Class クラスのインスタンス(クラス)から、インスタンスを生成するなどということが出来る。これが「動的インスタンス生成」であり、起動引数やプロパティファイルに書かれたクラス名によって、実行時に任意のクラスをロードして実行することが出来る。この技はデザインパターンの上で大変重要なので、簡単に理解しておいて欲しい。そういうクラスなので、Class クラスには public なコンストラクタは存在しない。

static Class forName(String)
引数文字列で表されるクラスを生成する。Class クラスのコンストラクタは存在しないので、これを使ってインスタンスを作るのである。ClassNotFoundException を投げる。
Object newInstance()
Class クラスのインスタンス・メソッドとして、そのインスタンスが表す「クラス」のインスタンスを生成する。戻り型は Object クラスなので、キャストする必要がある。InstantiatiionException, IllegalAccessException を投げる。

このクラスの利用の実例は「やさしいデザインパターン〜Factory Method と Abstract Factory」で見ることにする。他にもそのクラスのメソッドを取得したりする機能もあるが、これは「リフレクト」の機能であるので、ここでは解説しないが、後で実例を通じて見ることにする。



copyright by K.Sugiura, 1996-2006