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する度に、毎回新しく発番され、各インスタンスのメモリ上の位置を管理しています。