これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります
これまでの連載で、Javaには基本型(プリミティブ型)のほかに配列やクラスといった型があることを解説しました。実は、Javaの変数の型は「基本型」「参照型」の2つに大きく分けることができ、配列やクラスは参照型に含まれる型になります。
今回は、この参照型について解説します。また、参照型の中でもよく使うStringクラスについても解説します。さらに、これまで解説してきた基本型、クラスとインスタンス、メソッドについても総復習する良い機会にもなるはずです。EclipseでJavaプログラミングを始める準備がまだの方は、連載第1回の「Eclipse 3.4で超簡単Javaプログラミング基礎入門」で準備しておいてください。
これまでの連載でも説明しましたが、基本型の変数では、変数宣言をすれば、そのまま値を代入できます。つまり、変数宣言と同時に入れ物の確保がされていて、そのまま使用できます。
一方、配列やクラスの場合は、変数宣言と入れ物(インスタンス)の確保は別で、new演算子を使って入れ物の確保をする必要があります。入れ物の確保をすると同時に、入れ物を参照するための値(以降、「参照値」とします)を宣言されている変数へ代入することにより、これを参照できるようになります。
このことから分かるように、new演算子を使って確保された入れ物を参照するので、配列やクラスの型は参照型といわれるのです。
Javaプログラマは変数が参照している入れ物は使えますが、参照型の変数に具体的にどんな参照値が入っているかを知る必要はありませんし、参照値を変更することもできません。この値はJavaの仮想マシン(JVM)が管理するものなので、プログラマが勝手に変更できてしまうと困るからです。
しかし、まったく意識をしなくてもよいかというと、そういうわけにもいきません。「参照型の変数へは入れ物の参照値が設定されている」ということだけは意識してプログラムを作成する必要があります。
イメージをつかんでもらうため、もう少し詳しく説明します。リスト1のようなプログラムが実行されるときの入れ物確保のイメージは、図1のようになります。
int a; // [1] a = 1; // [2] Point p; // [3] p = new Point( ); // [4]
水色の縦長の長方形は“入れ物を確保できる場所全体”とします。そして、黄緑色の長方形は“確保された入れ物”を表すことにします。
基本型に含まれるint型の変数aを宣言した時点(リスト1の[1])では、「int型の値」に必要な入れ物が図1の[1]のように確保されます(どこに入れ物が確保されるかは、Javaの仮想マシンが管理しているので、どの場所が使われるかをプログラマは意識する必要はありません)。
aへ値1を代入する(リスト1の[2])と、図1の[2]のように確保された入れ物に1の値が入ります。参照型に含まれるPoint型の変数pを宣言した時点(リスト1の[3])では、Javaの仮想マシンが管理する「参照値」の保持に必要な入れ物が図1の[3]のように確保されます。
new演算子でPoint型の入れ物を確保してpへその参照値を代入する(リスト1の[4])と、Point型の値に必要な入れ物が確保されて、それの参照値(図1では、425)がpに代入されます(図1の[4])。この値(425)は、プログラマからは見えませんが、図1の[4]の矢印が表すような参照関係によって、プログラマはpを使って「Point型の値に必要な入れ物」を参照できます。
参照型の理解を深めるために、文字列を表現するときによく利用されるjava.lang.Stringクラスの使い方を見てみましょう。
ところで、Javaで採用している文字コード「Unicode 4.0」では、「Unicodeコードポイント(Unicode Code Point、Unicode符号位置)」と呼ばれる値と文字を対応させています。
これを使うことによって、Javaのプログラムで文字を扱えるようになっています。Javaのプログラムで文字を扱う場合、Stringクラスをよく使いますが、プログラムが対象とする分野によっては低レベルな操作ができるように、基本型の「char」という型を使うこともあります。
char型は「Unicodeコード単位(Unicode Code Unit、Unicode符号単位)」の値を表現していて、char型の配列を使うことで、文字列を表現できます。
ここで、char型とStringクラスを使う前に、これらに対応するリテラルについて説明をしておきます。連載第2回で基本型の解説をしたときに、プログラムの中で値を表現する文字列のことを「リテラル」と呼ぶことは説明しました。例えば、324は整数値を表すリテラルでint型になります。
同じように、char型へ代入できる文字を表すリテラルもあります。それは、「文字リテラル」といわれ、'0'のようにシングルクオーテーションマークで文字を囲んで記述し、char型となります。また、文字列を表すリテラルもあります。こちらは「文字列リテラル」といわれ、"0123"のようにダブルクオーテーションマークで文字列を囲んで記述し、String型となります。
char型変数やString型変数の初期化をするに当たって、リテラルはよく使うので覚えておきましょう。
Stringには、文字列を操作するメソッドがありますから、文字列操作をする場合には便利なことが多いということになります。char型の配列は、各要素の値に対して添え字を使ったアクセスが簡単にできるので、文字列操作をするメソッドを実装したい場合などに利用します。
場面により、どちらを使うかは変わってくるため、Stringからcharの配列へ変換するメソッドや逆の変換をするメソッドもあります。ここでは、「基本的に文字列を表現するためにはStringを使う」と覚えておけば十分ですが、「charという型も文字を表現するときに使用できる」ことを知っておくと、将来役に立つはずです。
次ページでは、参照型を理解するために、Stringクラスで文字列比較をしてみましょう。
ここでは、大ざっぱな説明だけしておきます。Javaでは、Unicodeコードポイントの値を扱う場合、int型を使います。文字とUnicodeコードポイントは対応しているので、あるUnicodeコードポイント(対応する文字)をプログラム内で処理するときは、int型の変数へその値を代入すればいいということです。
あるUnicodeコードポイントは、1つまたは2つのUnicodeコード単位の値から構成されます。Unicodeコード単位の値をJavaで扱う場合は、char型を使います。つまり、あるUnicodeコードポイントを1つまたは2つのchar型の値を使って表すこともできるわけです。
Javaにおける文字の扱いは若干複雑なのですが、これはJava SEのバージョン5.0からUnicodeの補助文字(Unicode 4.0に含まれる)をサポートするようになったからです。Unicodeの補助文字に関する詳細は、「JSR 204:Unicode Supplementary Character Support」を参照してください。
Unicodeに関する理解、文字コードや文字エンコーディングといった事項に関して理解が必要なため、本稿では詳細を説明しません。
興味のある読者は、以下の記事を参考にしてみてください。なお、Unicode 4.0が策定される前に書かれた記事もあります。文字エンコードについての参考記事ということで、ご了承ください。
Copyright © ITmedia, Inc. All Rights Reserved.