
Javaの参照型を文字列操作で理解して文法を総復習
株式会社ガリレオ
小山博史
2009/6/16
■ toCharArray()メソッドを使った文字列処理
次に、String型の文字列をcharの配列へ変換するtoCharArrayメソッドを使ってみましょう。Sample80と同様にして、Sample82を作成してください。出来上がったSample82を次のように編集します(リスト4)。
リスト4public class Sample82{
String s = "0123";
public void test() {
char[] c0123 = s.toCharArray();
System.out.print("s.toCharArray():");
for (int i=0 ; i < c0123.length ; i++) {
System.out.print(c0123[i] + " ");
}
System.out.println("");
}
public static void main(String[] args) {
Sample82 sample82 = new Sample82();
sample82.test();
}
}
このプログラムは、toCharArrayメソッドによって変換されたcharの配列について、要素の値を1つずつ画面へ出力しています。実行結果は下記のようになり、文字列"0123"の各文字に対応するUnicodeコード単位の値がchar型の配列へ順番に格納されているのが分かります。
リスト4の実行結果s.toCharArray():0 1 2 3
コラム 「日ごろからAPIリファレンスを見ておこう」 |
||||
| ここまでStringクラスの重要なメソッドを見てきましたが、このほかにもたくさんのメソッドがあります。文字列を処理するプログラムを作成する機会は多いので、日ごろからAPIリファレンスを見て使えそうなメソッドを探しておくとよいでしょう。 また、@ITには以下のように、クラスやコンストラクタ、メソッドの使用例が、クラス別にまとまっている表や連載もあるので、活用してみてはいかがでしょうか。
|
メソッドのパラメータが参照型の場合の注意点
参照型の変数の使い方やメソッドの使い方を理解したところで、メソッドのパラメータが参照型か基本型かでどのような違いがあるのかを確認します。
Sample80と同様にして、Sample83を作成してください。出来上がったSample83を次のように編集します(リスト5)。ここでは、java.lang.StringBuilderクラスというものを使っていますから、ここではそれについても説明します。
リスト5public class Sample83{
String s = "0123";
public void test() {
StringBuilder sb = new StringBuilder(s);
char c = 'a';
// 各値の表示
System.out.println("s :" + s);
System.out.println("sb :" + sb);
System.out.println("c :" + c);
// s, c の値は変更されない。sb の値は変更される
test1(s, sb, c);
// test1の結果、各値がどうなったか表示
System.out.println("s :" + s);
System.out.println("sb :" + sb);
System.out.println("c :" + c);
}
public void test1(String ps, StringBuilder psb, char pc) {
System.out.println("---------- test1 start");
System.out.println("ps :" + ps);
System.out.println("psb :" + psb);
System.out.println("pc :" + pc);
// 仮引数のpsが参照する値を変更
ps = "5678";
// 仮引数psbが参照するインスタンスの中の値を変更
psb.append("4567");
// 仮引数pcの値を変更
pc = 'b';
System.out.println("ps :"+ps);
System.out.println("psb :"+psb);
System.out.println("pc :"+pc);
System.out.println("---------- test1 end");
}
public static void main(String[] args) {
Sample83 sample83 = new Sample83();
sample83.test();
}
}
■ String型の文字列データを編集するには、java.lang.StringBuilderクラス
メソッドへ渡ってきたパラメータの型が参照型か基本型かによって、どんな違いがあるかを確認するために、文字列を編集したいのですが、実は一度作成したString型の文字列データは編集ができません。
この文字列データを編集するために、JavaではStringBuilderクラスが用意されています。そこで、StringBuilder型の変数sbを用意し、String型の変数sの文字列を使ってインスタンスを作成しています。
■ 参照型パラメータを試す方法
testメソッドの最初では、String型やStringBuilder型、char型の変数の各値を出力しています。sとsbはインスタンスが別ですが同じ文字列を表現しています。char型の変数cは'a'という文字リテラルで初期化しています。
test1メソッドのパラメータには、s、sb、cを渡しています。メソッドの最初に、パラメータとして渡ってきた変数の値を表示しています。実行してみると、testでのs、sb、cとtest1でのps、psb、pcが対応しているのが分かるはずです。test1メソッドでは、psには"5678"を代入し、psbに対しては"4567"の文字列をappendメソッドで追加し、pcには'b'という文字リテラルを代入しています。
プログラムの処理内容を大体理解したところで、プログラムを実行してみましょう。実行結果は下記のようになります。これらの処理をした後に値を表示すると、期待どおりの値になっています。test1メソッド内では、psは"5678"、psbは"01234567"、pcは"b"となっています。
リスト5の実行結果s :0123
sb :0123
c :a
---------- test1 start
ps :0123
psb :0123
pc :a
ps :5678
psb :01234567
pc :b
---------- test1 end
s :0123
sb :01234567
c :a
■ 参照型パラメータはメソッドを呼び出した方にも影響が
test1メソッドが終了してからtestメソッド内の変数の値を確認すると、sやcは値が変わっていません。しかし、sbはtest1メソッド内での変更が反映されています。このことから、メソッドのパラメータが基本型か参照型かを意識する必要があることが分かるはずです。
パラメータ変数のうち、基本型の変数(pc)の値や、参照型の変数(ps)の値(参照値)はtest1メソッド内で変更しても、メソッドを呼び出した方(test)には影響がありませんでした。ところが、参照型の変数(psb)のメソッドを呼び出して値を変更した場合は、test1メソッドを呼び出した方(test)にも反映されて影響が出てきます。
もちろん、メソッド内で参照型変数のフィールド値を変更しても同様に影響が出てきます。参照型について理解できていれば、これらのことは当たり前だと感じるはずです。しかし、こういった違いを忘れてプログラムを作成してしまうと、思ったとおりには動作しないプログラムが出来上がってしまいますから、よく覚えておいてください。
参照型と基本型の違いやStringは理解できましたか?
今回は参照型について、基本型との違いを含めて解説しました。参照型の使用例として、StringクラスやStringBuilderクラスの使用方法を紹介しました。また、メソッドのパラメータ変数が、基本型か参照型かを意識する必要があることについても説明しました。
今回理解した「メソッドのパラメータに基本型を使った場合の挙動」「メソッドのパラメータに参照型を使った場合の挙動」を忘れずに、プログラムを作成できるようになってもらえればと思います。
また、Javaでは文字列はchar型の配列とStringクラスのどちらでも表現できることについても簡単に説明をしました。文字列を変更するときはStringBuilderを使うことも紹介しました。char型より、Stringクラスの方がメソッドがあって便利そうだということは理解できたでしょうか。
Javaのchar型を正しく理解するには、Unicode 4.0を理解する必要があるので、この時点ではStringを使いこなせればよしとしています。ただし、将来、文字化けが発生した場合など、char型を避けて通れない場面に出会うこともあると思いますから、頭の隅に「char型もあるのだ」と覚えておいてください。
これで「参照型についての解説は終了」といいたいところですが、実はJavaには「インターフェイス」という重要な型があります。また、型名には「パッケージ」というものが深く関係しています。次回はこのインターフェイスとパッケージについて解説する予定です。
今回作ったサンプルのソースコードはこちらからダウンロードできます。
■ @IT関連記事
| クラスを簡単に理解しよう [連載]いまから始めるJava(3) クラスはJavaの学習で最初に難しいと感じるテーマ。ところが変数の使い方の観点から見ていくと、いとも簡単に理解できてしまいます 「Java
Solution」フォーラム 2003/1/30 |
||
| Javaのクラスの理解を深める いまから始めるJava(11) 今回はString型クラスのソースを読みながら、まだ紹介していないクラスに関するJavaの仕様について説明します 「Java
Solution」フォーラム 2003/11/26 |
||
![]() |
参照型の型変換を習得する ソースコードで学ぶ SJC-P 5.0 ドリル(8) 参照型データであるオブジェクトの型変換を学習しましょう。基本データ型との違い、キャスト演算子を使用した型変換に着目 |
|
| 変数のデータ型や文字列の扱いを理解しよう Cocoaの素、Objective-Cを知ろう(4) Objective-Cで利用可能なデータ型を整理してみよう。また、文字列を扱う専用クラスがどれだけ便利で強力なのかを見てみよう 「Coding Edge」フォーラム 2008/12/15 |
||
| 第5章 C#のデータ型 連載:改訂版 C#入門 C#のデータ型は実によくできている。基本的なデータ型は構造体の別名であり、値型と参照型やボックス化により、軽量ですっきりしたコードが書ける 「Insider.NET」フォーラム 2002/9/18
|
| 第6章 C#の変数と値型・参照型 連載:改訂版 C#入門 データを変数に格納するときには、値型と参照型の違いが挙動の違いとして大きく現れる。今回は、この違いを実例を通して確認してみよう 「Insider.NET」フォーラム 2002/9/25
|
| エピソード2 クローンの攻撃 - C#の参照型と値型 - 連載:One Point .NET(2) 本質を理解していなければ、思わぬ落とし穴に陥ることがある。参照型と値型の違いもその1つだ。暗黒面はプログラマーのすぐ身近に存在する 「Insider.NET」フォーラム 2002/9/20
|
| 値型と参照型と大福研究会 連載:放課後VB教室(1) 分かっているようで分からない落とし穴的ポイントをじっくり解説。ひょんなことからVisual Basicを学ぶことになったラスクちゃんとサブローだが…… 「Insider.NET」フォーラム 2008/6/6
|
| 筆者プロフィール |
| 小山博史(こやま ひろし) 情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。 著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。 |
| 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 -


