Javaの参照型を文字列操作で理解して文法を総復習:【改訂版】Eclipseではじめるプログラミング(8)(3/3 ページ)
これからプログラミングを学習したい方、Javaは難しそうでとっつきづらいという方のためのJavaプログラミング超入門連載です。最新のEclipse 3.4とJava 6を使い大幅に情報量を増やした、連載「Eclipseではじめるプログラミング」の改訂版となります
toCharArray()メソッドを使った文字列処理
次に、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
コラム 「日ごろからAPIリファレンスを見ておこう」
ここまで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.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"となっています。
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には「インターフェイス」という重要な型があります。また、型名には「パッケージ」というものが深く関係しています。次回はこのインターフェイスとパッケージについて解説する予定です。
今回作ったサンプルのソースコードはこちらからダウンロードできます。
筆者紹介
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。
著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。
- Javaの例外処理で知らないと損する7つのテクニック
- プログラマの宿命! 例外とエラー処理を理解する
- いまさら聞けない「Javadoc」と「アノテーション」入門
- 7ステップで理解するJavaでの列挙型/enum使用法
- 拡張for文の真の実力を知り、反復処理を使いこなせ
- キュー構造をJavaで実装してジェネリック型を理解する
- 強く型付けされているJavaの理解に必修の“型変換”
- あなたの知らない、4つのマニアックなJava文法
- “ネスト”した型で始める軽量Javaプログラミング!?
- Javaは「抽象クラス」で実装を上手に再利用できる
- 再利用性の高いクラス作成に重要な“アクセス制御”
- “コンストラクタ”と初期化、本当に理解できてる?
- 継承やオーバーライドで簡単にクラスを“拡張”しよう
- 「static」でクラス共有の変数・メソッドを使いこなせ!
- Javaの実案件に必須のパッケージとインポートを知る
- プログラムを「変更」しやすくする“インターフェイス”
- Javaの参照型を文字列操作で理解して文法を総復習
- クラスの振る舞いを表すJavaの“メソッド”とは?
- 複雑なデータを表現できるクラスやフィールドって?
- データ集合を扱うのに便利なJavaの配列と拡張for文
- プログラミングの真骨頂! Javaで“反復処理”を覚える
- プログラミングの醍醐味! Javaで“条件式”を理解する
- Javaで一から理解するプログラムの変数と演算子
- Eclipse 3.4で超簡単Javaプログラミング基礎入門
Copyright © ITmedia, Inc. All Rights Reserved.