Java の toString() メソッドをオーバーライドしてオブジェクトの情報を表示
新人
「先輩、Javaのプログラムでオブジェクトの情報を文字で表示する方法ってありますか?」
先輩
「あるよ。toString()というメソッドを使えば、オブジェクトの中身を文字として表示できるんだ。」
新人
「そのメソッドって、毎回自分で書かないといけないんですか?」
先輩
「Javaでは自動的に用意されているけど、自分でわかりやすく書き直すこともできるよ。詳しく説明するね。」
1. Java のオブジェクトとは?(簡単な説明)
Javaのオブジェクトとは、現実のものや考え方をプログラムで表したものです。たとえば、「人」「本」「商品」など、身のまわりにあるものをJavaのコードで表すときに使います。オブジェクトは、データ(情報)と処理(動き)を1つにまとめた「まとまり」です。
Javaでオブジェクトを作るには、まず「クラス」を作ります。クラスは「設計図」のようなもので、その設計図からオブジェクトを作り出すのが「new」というキーワードです。
たとえば、「本」を表すクラスを作り、それを使って実際の「本のオブジェクト」を作るイメージです。
以下は簡単な例です。
public class Book {
String title;
String author;
}
このクラスを使って、次のようにオブジェクトを作ります。
Book book = new Book();
book.title = "Java入門";
book.author = "山田太郎";
このようにして、Javaではクラスとオブジェクトを使って現実の物を表します。
2. toString() メソッドとは何か?(デフォルトの表示内容)
JavaのオブジェクトをそのままSystem.out.println()で表示しようとすると、「意味がわかりにくい英数字」が表示されることがあります。
これはJavaが自動でオブジェクトの情報を文字にしてくれるtoString()メソッドを内部で使っているからです。
でもこのままだと、「どんなデータが入っているのか」がわからないので、自分でわかりやすい表示に書き直すことができます。これを「オーバーライド」といいます。
まずは、toString()メソッドをオーバーライドしていない状態の出力を見てみましょう。
public class Book {
String title;
String author;
}
public class Main {
public static void main(String[] args) {
Book book = new Book();
book.title = "Java入門";
book.author = "山田太郎";
System.out.println(book); // ここでtoString()が自動的に呼ばれる
}
}
このコードをPleiadesで実行すると、次のような出力になります。
Book@6d06d69c
これは、「Bookクラスのメモリ上の情報」を表しています。ですが、初心者にとっては内容がわかりません。そこで、toString()を自分で書き換えると、もっとわかりやすい表示になります。
次の記事では、実際にtoString()メソッドをオーバーライドして、読みやすい出力にする方法を解説していきます。
3. オーバーライドとは?(やさしく説明)
Javaには「オーバーライド」というしくみがあります。これは「もともとあるメソッドの内容を、自分の好きなように書き直すこと」です。
Javaのクラスには、すでに決まったメソッドがいくつか用意されています。toString()もその中のひとつで、すべてのクラスがもとになっている「Objectクラス」というクラスに最初から入っています。
このtoString()は、オブジェクトを文字に変えるときに自動的に使われます。でも、標準の内容はあまりわかりやすくありません。
そこで、自分でこのtoString()メソッドの中身を作り直せば、「オブジェクトの中にどんなデータがあるか」がすぐにわかるようになります。これが「オーバーライド」です。
オーバーライドを使うときは、次のように@Overrideという特別な印をつけて書くのがルールです。これによって、Javaが「これはオーバーライドですよ」と判断してくれます。
4. toString() メソッドのオーバーライド方法(コード付き)
それでは実際に、JavaでtoString()メソッドをオーバーライドしてみましょう。下のようにBookクラスの中に自分でtoString()メソッドを追加します。
public class Book {
String title;
String author;
@Override
public String toString() {
return "タイトル:" + title + "、著者:" + author;
}
}
このようにすると、System.out.println(book)としたときに、「タイトル:Java入門、著者:山田太郎」のようにわかりやすく表示されます。
@Overrideをつけることで、Javaが「これはもともとあるメソッドを上書きしています」と理解してくれるため、書き間違いにもすぐ気づくことができます。
このオーバーライドを行うだけで、プログラムの中でオブジェクトを表示したときに、内容がとても見やすくなります。
5. オーバーライド前と後の表示の違いを比べる
それでは、実際にオーバーライドする前と後で、出力結果がどのように変わるかを比べてみましょう。
まずは、toString()メソッドをオーバーライドしていない場合です。
public class Book {
String title;
String author;
}
public class Main {
public static void main(String[] args) {
Book book = new Book();
book.title = "Java入門";
book.author = "山田太郎";
System.out.println(book);
}
}
このコードをPleiadesで実行すると、次のように表示されます。
Book@6d06d69c
この表示では、オブジェクトの実際の内容がわかりません。次に、toString()メソッドをオーバーライドしたバージョンを見てみましょう。
public class Book {
String title;
String author;
@Override
public String toString() {
return "タイトル:" + title + "、著者:" + author;
}
}
public class Main {
public static void main(String[] args) {
Book book = new Book();
book.title = "Java入門";
book.author = "山田太郎";
System.out.println(book);
}
}
このプログラムをPleiadesで実行すると、次のような表示になります。
タイトル:Java入門、著者:山田太郎
このように、toString()メソッドをオーバーライドすると、オブジェクトの内容がとても見やすくなります。プログラムを作っているときに、途中でデータを確認したい場面がよくあります。そんなときに、toString()を自分でわかりやすく書いておけば、内容を一目で確認できてとても便利です。
特に、クラスに複数のフィールド(データ)がある場合は、オーバーライドをして見やすくしておくと、あとでプログラムのチェックがしやすくなります。
初心者のうちは、最初から全部を理解するのはむずかしいかもしれませんが、toString()をオーバーライドすることで、プログラムがもっと見やすくなるということだけでも覚えておくとよいでしょう。
6. 複数のフィールドを表示するカスタム toString() の例
Javaのクラスでは、複数の情報(フィールド)を持つことがよくあります。たとえば、本のタイトルだけでなく、著者、出版社、価格、出版年などの情報をまとめて表すことができます。
こうした複数の情報を、toString()メソッドを使ってひと目でわかるように表示すると、とても便利です。では、フィールドが4つあるBookクラスを作って、toString()メソッドをオーバーライドしてみましょう。
public class Book {
String title;
String author;
String publisher;
int price;
@Override
public String toString() {
return "タイトル:" + title +
"、著者:" + author +
"、出版社:" + publisher +
"、価格:" + price + "円";
}
}
このようにtoString()メソッドの中で、すべてのフィールドを結合して1つの文字列として返すことで、System.out.println(book)のように表示するだけで、すべての情報を確認できます。
実際にこのクラスを使った表示例は以下のようになります。
public class Main {
public static void main(String[] args) {
Book book = new Book();
book.title = "やさしいJava";
book.author = "佐藤花子";
book.publisher = "技術出版社";
book.price = 1980;
System.out.println(book);
}
}
このプログラムをPleiadesで実行すると、次のような出力になります。
タイトル:やさしいJava、著者:佐藤花子、出版社:技術出版社、価格:1980円
このように複数の情報が見やすく整っていると、プログラムの動作確認やデバッグもスムーズに進められます。
7. toString() を使う場面(System.out.printlnで使われるなど)
toString()メソッドは、自分で明示的に呼び出すこともできますが、System.out.println()などでオブジェクトを表示するときには、自動的に使われます。
たとえば、下のようなコードを書いたときには、Javaが内部でtoString()を勝手に呼び出してくれます。
System.out.println(book); // book.toString() と同じ意味になる
このため、自分でtoString()を呼ばなくても、自然にオブジェクトの内容が文字で表示されます。
また、開発中によく使われるのが、デバッグ中の表示や、エラーメッセージの出力です。何か問題が起きたときに、オブジェクトの中身を表示して確認したいことはよくあります。
たとえば、以下のようにエラー処理の中でオブジェクトの情報を表示すれば、どのようなデータが原因なのかすぐにわかります。
catch (Exception e) {
System.out.println("エラーが発生しました:" + book);
}
このようにtoString()メソッドをしっかり作っておくことで、開発作業がとてもやりやすくなります。
8. まとめ(オーバーライドの大切さ、初心者にもおすすめな理由)
JavaのtoString()メソッドは、オブジェクトの中身を文字でわかりやすく表示するためのとても便利な機能です。
最初の状態ではtoString()は自動で使われていますが、そのままでは意味がわかりにくい情報しか表示されません。そこで、「オーバーライド」を使って、自分で表示内容をわかりやすく書き直すことが大切です。
特に初心者の方は、プログラムを作るときに「この変数にはどんな情報が入っているのか?」「正しく設定できているのか?」といったことを確認したくなる場面が多いと思います。
そんなときに、オブジェクトの情報がそのまま文字で見えると、とても安心ですし、バグも見つけやすくなります。
また、System.out.println()で表示するだけで中身が見えるので、特別なツールや複雑なコードを使う必要もありません。Pleiadesのような開発環境で、簡単に実行して結果を見ることができます。
まとめると、toString()メソッドのオーバーライドは、次のようなメリットがあります。
- オブジェクトの内容をわかりやすく表示できる
- プログラムの動作確認やエラーの発見がしやすくなる
- 特別な操作をしなくても、
System.out.println()で簡単に使える - 複数の情報を1つにまとめて表示できる
これからJavaを学んでいく上で、toString()メソッドの使い方とオーバーライドはとても役立つ技術です。ぜひ一度、自分のクラスにtoString()を加えて、どのように表示が変わるのか試してみてください。