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

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


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


toCharArray()メソッドを使った文字列処理

 次に、String型の文字列をcharの配列へ変換するtoCharArrayメソッドを使ってみましょう。Sample80と同様にして、Sample82を作成してください。出来上がったSample82を次のように編集します(リスト4)。

  リスト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型の配列へ順番に格納されているのが分かります。

  リスト4の実行結果
s.toCharArray():0 1 2 3

コラム 「日ごろからAPIリファレンスを見ておこう」

ここまでStringクラスの重要なメソッドを見てきましたが、このほかにもたくさんのメソッドがあります。文字列を処理するプログラムを作成する機会は多いので、日ごろからAPIリファレンスを見て使えそうなメソッドを探しておくとよいでしょう。

また、@ITには以下のように、クラスやコンストラクタ、メソッドの使用例が、クラス別にまとまっている表や連載もあるので、活用してみてはいかがでしょうか。

Java SE コアAPI 使用コード例一覧
Java開発者/プログラマのための、Java SEコアAPIの使用コード例の記事へのJavaDocっぽいリンク集。メソッドやコンストラクタ、例外などAPIの使い方の参考にしてください
Java Solution」フォーラム 2009/3/24
プログラマーの常識をJavaで身につける
Javaコアパッケージは応用範囲が広いため、普段使わないクラスに意外な発見があるはずです。そこから、さまざまな「常識」を学びましょう

メソッドのパラメータが参照型の場合の注意点

 参照型の変数の使い方やメソッドの使い方を理解したところで、メソッドのパラメータが参照型か基本型かでどのような違いがあるのかを確認します。

 Sample80と同様にして、Sample83を作成してください。出来上がったSample83を次のように編集します(リスト5)。ここでは、java.lang.StringBuilderクラスというものを使っていますから、ここではそれについても説明します。

  リスト5
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"となっています。

  リスト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コレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。

 

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