
Javaの参照型を文字列操作で理解して文法を総復習
株式会社ガリレオ
小山博史
2009/6/16
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります
【総復習】Javaの変数は大きく2つに分かれる
これまでの連載で、Javaには基本型(プリミティブ型)のほかに配列やクラスといった型があることを解説しました。実は、Javaの変数の型は「基本型」「参照型」の2つに大きく分けることができ、配列やクラスは参照型に含まれる型になります。
- 基本型(プリミティブ型)(参照:連載第2回「Javaで一から理解するプログラムの変数と演算子」)
- boolean
- int
- double
- char
- そのほか
- 参照型
- 配列(参照:連載第5回「データ集合を扱うのに便利なJavaの配列と拡張for文」)
- クラス(参照:連載第6回「複雑なデータを表現できるクラスやフィールドって?」)
今回は、この参照型について解説します。また、参照型の中でもよく使うStringクラスについても解説します。さらに、これまで解説してきた基本型、クラスとインスタンス、メソッドについても総復習する良い機会にもなるはずです。EclipseでJavaプログラミングを始める準備がまだの方は、連載第1回の「Eclipse 3.4で超簡単Javaプログラミング基礎入門」で準備しておいてください。
イメージで何とか理解したい「参照型」とは
これまでの連載でも説明しましたが、基本型の変数では、変数宣言をすれば、そのまま値を代入できます。つまり、変数宣言と同時に入れ物の確保がされていて、そのまま使用できます。
■ new演算子を使って確保された入れ物を参照する
一方、配列やクラスの場合は、変数宣言と入れ物(インスタンス)の確保は別で、new演算子を使って入れ物の確保をする必要があります。入れ物の確保をすると同時に、入れ物を参照するための値(以降、「参照値」とします)を宣言されている変数へ代入することにより、これを参照できるようになります。
このことから分かるように、new演算子を使って確保された入れ物を参照するので、配列やクラスの型は参照型といわれるのです。
■ 参照型の変数へは入れ物の参照値が設定されている
Javaプログラマは変数が参照している入れ物は使えますが、参照型の変数に具体的にどんな参照値が入っているかを知る必要はありませんし、参照値を変更することもできません。この値はJavaの仮想マシン(JVM)が管理するものなので、プログラマが勝手に変更できてしまうと困るからです。
しかし、まったく意識をしなくてもよいかというと、そういうわけにもいきません。「参照型の変数へは入れ物の参照値が設定されている」ということだけは意識してプログラムを作成する必要があります。
■ 入れ物と参照値をイメージしてみよう
イメージをつかんでもらうため、もう少し詳しく説明します。リスト1のようなプログラムが実行されるときの入れ物確保のイメージは、図1のようになります。
リスト1int a; // [1]
a = 1; // [2]
Point p; // [3]
p = new Point( ); // [4]
![]() |
| 図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」を参照してください。 ![]() The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 204 via kwout
|
||||||||||||
| Index | ||||||||
|
||||||||
【改訂版】Eclipseではじめるプログラミング バックナンバー 連載インデックスへ»
- 第1回 Eclipse 3.4で超簡単Javaプログラミング基礎入門
- 第2回 Javaで一から理解するプログラムの変数と演算子
- 第3回 プログラミングの醍醐味! Javaで“条件式”を理解する
- 第4回 プログラミングの真骨頂! Javaで“反復処理”を覚える
- 第5回 データ集合を扱うのに便利なJavaの配列と拡張for文
- 第6回 複雑なデータを表現できるクラスやフィールドって?
- 第7回 クラスの振る舞いを表すJavaの“メソッド”とは?
- 第8回 Javaの参照型を文字列操作で理解して文法を総復習
- 第9回 プログラムを「変更」しやすくする“インターフェイス”
- 第10回 Javaの実案件に必須のパッケージとインポートを知る
- 第11回 「static」でクラス共有の変数・メソッドを使いこなせ!
- 第12回 継承やオーバーライドで簡単にクラスを“拡張”しよう
- 第13回 “コンストラクタ”と初期化、本当に理解できてる?
- 第14回 再利用性の高いクラス作成に重要な“アクセス制御”
- 第15回 Javaは「抽象クラス」で実装を上手に再利用できる
- 第16回 “ネスト”した型で始める軽量Javaプログラミング!?
- 第17回 あなたの知らない、4つのマニアックなJava文法
- 第18回 強く型付けされているJavaの理解に必修の“型変換”
- 第19回 キュー構造をJavaで実装してジェネリック型を理解する
- 第20回 拡張for文の真の実力を知り、反復処理を使いこなせ
- 第21回 7ステップで理解するJavaでの列挙型/enum使用法
- 第22回 いまさら聞けない「Javadoc」と「アノテーション」入門
- 第23回 プログラマの宿命! 例外とエラー処理を理解する
- 第24回 Javaの例外処理で知らないと損する7つのテクニック
| Java Solution全記事一覧 |
TechTargetジャパン
- Scalaのパッケージ、アクセス修飾子、オブジェクト継承 (2012/5/22)
インポート、パッケージオブジェクト、抽象クラス/抽象メソッド、オーバーライド、final、シールドクラスなども - 基幹系システムでCloud SQLは使えるか試してみた (2012/5/17)
サンプルとしてMRPシステムを作成して動かし、「再帰呼び出し」などのパフォーマンスを測定して検証してみます - アジャイル管理ツール9選+Pivotal Tracker入門 (2012/5/14)
群雄割拠のアジャイルプロジェクト管理ツールを9つ紹介し、特に注目を集めているPivotal Trackerの基本的な使い方を解説します - サーバサイドJSやJavaでWebアプリが作れるXPages (2012/5/11)
Notes/Dominoの資産をサーバサイドJavaScriptやJavaで操作し、HTMLやJavaScript、CSSをUIにできる技術を紹介
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


