次に、String型の文字列をcharの配列へ変換するtoCharArrayメソッドを使ってみましょう。Sample80と同様にして、Sample82を作成してください。出来上がったSample82を次のように編集します(リスト4)。
public 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型の配列へ順番に格納されているのが分かります。
s.toCharArray():0 1 2 3
ここまでStringクラスの重要なメソッドを見てきましたが、このほかにもたくさんのメソッドがあります。文字列を処理するプログラムを作成する機会は多いので、日ごろからAPIリファレンスを見て使えそうなメソッドを探しておくとよいでしょう。
また、@ITには以下のように、クラスやコンストラクタ、メソッドの使用例が、クラス別にまとまっている表や連載もあるので、活用してみてはいかがでしょうか。
参照型の変数の使い方やメソッドの使い方を理解したところで、メソッドのパラメータが参照型か基本型かでどのような違いがあるのかを確認します。
Sample80と同様にして、Sample83を作成してください。出来上がったSample83を次のように編集します(リスト5)。ここでは、java.lang.StringBuilderクラスというものを使っていますから、ここではそれについても説明します。
public 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では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"となっています。
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クラスやStringBuilderクラスの使用方法を紹介しました。また、メソッドのパラメータ変数が、基本型か参照型かを意識する必要があることについても説明しました。
今回理解した「メソッドのパラメータに基本型を使った場合の挙動」「メソッドのパラメータに参照型を使った場合の挙動」を忘れずに、プログラムを作成できるようになってもらえればと思います。
また、Javaでは文字列はchar型の配列とStringクラスのどちらでも表現できることについても簡単に説明をしました。文字列を変更するときはStringBuilderを使うことも紹介しました。char型より、Stringクラスの方がメソッドがあって便利そうだということは理解できたでしょうか。
Javaのchar型を正しく理解するには、Unicode 4.0を理解する必要があるので、この時点ではStringを使いこなせればよしとしています。ただし、将来、文字化けが発生した場合など、char型を避けて通れない場面に出会うこともあると思いますから、頭の隅に「char型もあるのだ」と覚えておいてください。
これで「参照型についての解説は終了」といいたいところですが、実はJavaには「インターフェイス」という重要な型があります。また、型名には「パッケージ」というものが深く関係しています。次回はこのインターフェイスとパッケージについて解説する予定です。
今回作ったサンプルのソースコードはこちらからダウンロードできます。
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。
著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。
Copyright © ITmedia, Inc. All Rights Reserved.