目次
toStringメソッドとは
Javaでは、すべてのクラスに、toString()メソッドが用意されています。
toStringメソッドは、数値型などを文字列に変換するときなどに使用します。それ以外にも、オブジェクトの中身を文字列表現として取得でき、デバッグで確認するときなども活用します。
この記事では、toStringメソッドの使い方や、toStringメソッドをオーバライドして、独自の処理を組み込む方法などを紹介します。
数値を文字列に変換する
toStringメソッドで数値を文字列に変換する方法を解説します。
単純にintやlongなどの数値を文字列に変換する場合は、Integer.toString()もしくはLong.toString()メソッドを使用して、数値を文字列に変換できます。
int intValue = 1000; String s = Integer.toString(intValue);
書式を指定して数値を文字列に変換する
toStringメソッドは、カンマ区切りや、パーセント表記などの書式指定ができません。書式を指定する場合は、NumberFormatクラスを使用します。
import java.text.NumberFormat;
public class Main {
    public static void main(String[] args) {
        //カンマ区切のNumberFormatインスタンスを生成
        NumberFormat nf1 = NumberFormat.getNumberInstance();
        //パーセント表記のNumberFormatインスタンスを生成
        NumberFormat nf2 = NumberFormat.getPercentInstance();
        //NumberFormatクラスを使用して、数値をフォーマットする
        System.out.println(nf1.format(10000.999));
        System.out.println(nf2.format(0.90));
    }
}
▪️ 実行結果
10,000.999 90%
文字列を数値に変換する
上の例とは逆に、文字列を数値に変換するには、各数値型のvalueOfメソッドを使用します。
次のサンプルコードでは、文字列をInteger型に変換しています。
int i = Integer.valueOf("1099");
System.out.println(i);
便利なtoStringメソッドの使い方
数値から文字列への変換以外にも、toStringメソッドを使用して、クラスのインスタンスを、文字列表現で取得できます。
Eclipse(統合開発環境)などのデバッグ環境が使えない場合に有用な方法です。
Mapの中身を確認する
MapのtoStringメソッドを使って、Mapに格納されている要素の文字列情報を取得することができます。
import java.util.HashMap;
import java.util.Map;
public class SampleClass {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        System.out.println(map.toString());
    }
}
▪️ 実行結果
{key1=value1, key2=value2}
System.out.printlnは、文字列以外のオブジェクトを渡すと、暗黙的にtoStringメソッドが呼び出されるため、以下のように書くこともできます。
System.out.println(map);
Listの中身を確認する
Mapクラスと同様に、ListもtoStringメソッドで、要素の文字列情報を取得できます。
import java.util.ArrayList;
import java.util.List;
public class SampleClass {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("value1");
        list.add("value2");
        System.out.println(list.toString());
    }
}
▪️ 実行結果
[value1, value2]
自作クラスでtoStringメソッドを使う
独自に作成した自作クラスでtoStringメソッドを実装する方法を解説します。
まず、次のサンプルコードのような、名前(name)と年齢(age)のプロパティを持つ独自クラスを作成しましょう。
public class User {
   private String nama;
   private int age;
   public String getNama() {
       return nama;
   }
   public void setNama(String nama) {
       this.nama = nama;
   }
   public int getAge() {
       return age;
   }
   public void setAge(int age) {
       this.age = age;
   }
}
上記で作成した独自クラスのインスタンスを作成して、toStringメソッドを呼び出してみましょう。
User user = new User();
user.setNama("Yamada Tarou");
user.setAge(30);
System.out.println(user.toString());
▪️ 実行結果
User@2a139a55
実行結果を見てもわかる通り、toStringメソッドを呼び出すと、謎の文字列が表示されるだけで、クラスのプロパティに何が入っているのか確認できません。
独自クラスでtoStringメソッドが呼びされたとき、プロパティの設定内容など、クラスのインスタンス表現を文字列で返したい場合は、toStringメソッドをオーバーライドします。
次のサンプルコードは、上で作成して独自クラスにtoStringメソッドをオーバーライドした例です。
プロパティの内容を文字列連結して返しています。
@Override
public String toString() {
    return "[" + this.getNama() + ":" + this.getAge() + "]";
}
では早速、toStringメソッドをオーバーライドしたクラスで、もう一度、toStringメソッドを呼んでみましょう。
User user = new User();
user.setNama("Yamada Tarou");
user.setAge(30);
System.out.println(user.toString());
▪️ 実行結果
[Yamada Tarou:30]
先程オーバーライドしたtoStringメソッドが呼び出され、プロパティの設定内容がコンソールに出力されていると思います。
このように、自作クラスにtoStringメソッドをオーバーライドしておくと、デバッグできない環境であっても、容易にオブジェクトの内容が確認でます。
「@Override」は必須ではないけど付けよう
前述したサンプルコードの、toStringメソッドに「@Override」アノテーションが付いているのに気付いた人もいると思います。
「@Override」は、メソッドがオーバーライドされている事を示すアノテーションですが、実は必須ではなく、付けなくても問題なくオーバーライドされます。
ただし、「@Override」アノテーションは、一般的には付けた方が良いと言われています。
その理由は、「@Override」を付けると、オーバーライドするメソッド名や、引数の数や型が一致しない時、コンパイルの時点でエラーになってくれる為です。
@Override
public String toStr() {
// toStringをオーバーライドするつもりが、toStrにしてしまった場合
}
■ コンパイル結果
toStr() はスーパータイプ・メソッドをオーバーライドまたは実装する必要があります
「@Override」が無いと、オーバーライドするメソッドの綴りを間違えもコンパイルエラーは発生しない為、気付かずリリースしてしまうと、実行時に意図しない動きになる恐れがあります。
toStringを活用しよう
JavaのtoStringメソッドで数値を文字列に変換する方法や、オーバーライドの話にも触れて、toStringメソッドを解説してきました。
クラスの継承や、メソッドのオーバーライドについてもっと知りたい方は、以下の記事も参考にしてみてください。
 
               
     
     
     
     
   
       
     
   
      
上の実行結果で「User@2a139a55」と表示された謎の数字は、インスタンスのアドレスを示す数値です。アドレスはnewする度に、毎回新しく発番され、各インスタンスのメモリ上の位置を管理しています。