【改訂版】Eclipseではじめるプログラミング
連載インデックスへ
【改訂版】Eclipseではじめるプログラミング(8)

Javaの参照型を文字列操作で理解して文法を総復習


株式会社ガリレオ
小山博史
2009/6/16

これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4Java 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります

【総復習】Javaの変数は大きく2つに分かれる


今回の主な内容

【総復習】Javaの変数は大きく2つに分かれる
イメージで何とか理解したい「参照型」とは
Javaにおける文字コードと文字、リテラル
コラム 「Java SE 5とUnicode 4.0の補助文字」
Stringクラスの文字列比較で参照型を理解する
Stringクラスでメソッドを使いこなす練習をしよう
コラム 「日ごろからAPIリファレンスを見ておこう」
メソッドのパラメータが参照型の場合の注意点
参照型と基本型の違いや
  Stringは理解できましたか?

 これまでの連載で、Javaには基本型(プリミティブ型)のほかに配列やクラスといった型があることを解説しました。実は、Javaの変数の型は「基本型」「参照型」の2つに大きく分けることができ、配列やクラスは参照型に含まれる型になります。

 今回は、この参照型について解説します。また、参照型の中でもよく使うStringクラスについても解説します。さらに、これまで解説してきた基本型、クラスとインスタンスメソッドについても総復習する良い機会にもなるはずです。EclipseでJavaプログラミングを始める準備がまだの方は、連載第1回の「Eclipse 3.4で超簡単Javaプログラミング基礎入門」で準備しておいてください。

イメージで何とか理解したい「参照型」とは

 これまでの連載でも説明しましたが、基本型の変数では、変数宣言をすれば、そのまま値を代入できます。つまり、変数宣言と同時に入れ物の確保がされていて、そのまま使用できます。

new演算子を使って確保された入れ物を参照する

 一方、配列やクラスの場合は、変数宣言と入れ物(インスタンス)の確保は別で、new演算子を使って入れ物の確保をする必要があります。入れ物の確保をすると同時に、入れ物を参照するための値(以降、「参照値」とします)を宣言されている変数へ代入することにより、これを参照できるようになります。

 このことから分かるように、new演算子を使って確保された入れ物を参照するので、配列やクラスの型は参照型といわれるのです。

参照型の変数へは入れ物の参照値が設定されている

 Javaプログラマは変数が参照している入れ物は使えますが、参照型の変数に具体的にどんな参照値が入っているかを知る必要はありませんし、参照値を変更することもできません。この値はJavaの仮想マシン(JVM)が管理するものなので、プログラマが勝手に変更できてしまうと困るからです。

 しかし、まったく意識をしなくてもよいかというと、そういうわけにもいきません。「参照型の変数へは入れ物の参照値が設定されている」ということだけは意識してプログラムを作成する必要があります。

入れ物と参照値をイメージしてみよう

 イメージをつかんでもらうため、もう少し詳しく説明します。リスト1のようなプログラムが実行されるときの入れ物確保のイメージは、図1のようになります。

  リスト1
int a; // [1]
a = 1; // [2]
Point p; // [3]
p = new Point( ); // [4]

図1 変数の入れ物確保のイメージ
図1 変数の入れ物確保のイメージ

 水色の縦長の長方形は“入れ物を確保できる場所全体”とします。そして、黄緑色の長方形は“確保された入れ物”を表すことにします。

 基本型に含まれる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における文字コードと文字、リテラル

 参照型の理解を深めるために、文字列を表現するときによく利用されるjava.lang.Stringクラスの使い方を見てみましょう。

JavaにおけるUnicodeコードポイントとUnicodeコード単位

 ところで、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型変数の初期化をするに当たって、リテラルはよく使うので覚えておきましょう。

Javaでの文字列操作の基本はStringクラスとchar型

 Stringには、文字列を操作するメソッドがありますから、文字列操作をする場合には便利なことが多いということになります。char型の配列は、各要素の値に対して添え字を使ったアクセスが簡単にできるので、文字列操作をするメソッドを実装したい場合などに利用します。

 場面により、どちらを使うかは変わってくるため、Stringからcharの配列へ変換するメソッドや逆の変換をするメソッドもあります。ここでは、「基本的に文字列を表現するためにはStringを使う」と覚えておけば十分ですが、「charという型も文字を表現するときに使用できる」ことを知っておくと、将来役に立つはずです。

 次ページでは、参照型を理解するために、Stringクラスで文字列比較をしてみましょう。

コラム 「Java SE 5とUnicode 4.0の補助文字」

ここでは、大ざっぱな説明だけしておきます。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が策定される前に書かれた記事もあります。文字エンコードについての参考記事ということで、ご了承ください。


文字化けに関するトラブルに強くなる【実践編】
――UnicodeとJIS X 0213・サロゲートペア
 Vistaの登場で対応が必須となったJIS X 0213はOracleで扱う場合にも注意が必要。稼働中のシステムでも問題がないか確認を
Database Expert」フォーラム 2009/3/4
‘愛’で学ぶ文字コードと文字化けの常識
プログラマーの常識をJavaで身につける(6) 
OSや携帯電話の機種の違い、メール、Webブラウザ、DB入出力、国の違いなどさまざま原因で起きる文字化けを徹底解説!
Java Solution」フォーラム 2007/6/21
Eclipseで文字符号化の理解を深める
EclipseでJavaに強くなる(6) コンピュータの内部では文字を数値化(文字符号化)して扱っている。その理屈をEclipseでプログラムを実行しながら理解してみよう
Java Solution」フォーラム 2006/7/22
Javaの文字化け対策FAQ
JSP/サーブレット・プログラミングで誰もが一度は遭遇するトラブルが文字化けだ。4回の連載で文字化け解消のポイントを解説する
文字化け“???”の法則とその防止策
[連載]事例に学ぶWebシステム開発のワンポイント(8) アプリケーションサーバ上での開発で誰もが悩むのが日本語の文字化けだ。文字化けのしくみとその対策を解説
Java Solution」フォーラム 2003/1/28

1-2-3

 Index
第8回 Javaの参照型を文字列操作で理解して文法を総復習
Page1
【総復習】Javaの変数は大きく2つに分かれる
イメージで何とか理解したい「参照型」とは
Javaにおける文字コードと文字、リテラル
コラム 「Java SE 5とUnicode 4.0の補助文字」
  Page2
Stringクラスの文字列比較で参照型を理解する
Stringクラスでメソッドを使いこなす練習をしよう
  Page3
コラム 「日ごろからAPIリファレンスを見ておこう」
メソッドのパラメータが参照型の場合の注意点
参照型と基本型の違いやStringは理解できましたか?


【改訂版】Eclipseではじめるプログラミング バックナンバー 連載インデックスへ»




Java Solution全記事一覧



TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH