複数行の出力

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • エスケープシーケンス \n は改行 1 文字、\t はタブ 1 文字を表します
  • "こんにちは!\nJava\n今日もがんばろう!" のように 1 本の String に複数行を詰めます
  • 最小例は return "こんにちは!\nJava を学んでいます。\n今日もがんばろう!";

複数行の出力 とは

エスケープシーケンス \n を使って 1 つの文字列で複数行を表現する方法を学びます。本レッスンでは、複数行の出力 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

1 つの文字列で複数行を返す

前回のレッスンでは Solution.helloWorld() を作って、"Hello, Java" という 1 行の文字列を返しました。今回はそれを一歩進めて、1 つの文字列に複数行を詰め込むことに挑戦します。完成イメージは次の 3 行を順番に表示することです。

Java

こんにちは! Java を学んでいます。 今日もがんばろう!

見た目は 3 行ですが、メソッドが返すのは 1 本の String です。return を 3 回書くわけではありません。鍵になるのが エスケープシーケンス と呼ばれる特別な書き方です。

エスケープシーケンスは、バックスラッシュ \ と次の 1 文字を組み合わせて「ふつうの文字では表現しづらいもの」を表す仕組みです。Java だけでなく Python でも JavaScript でも、ほぼ同じ記号が使われます。

エスケープシーケンスとは

文字列リテラル "..." の中に、改行やタブをそのまま打ち込みたい場面は山ほどあります。しかし、コードの中で Enter キーを押して改行すると Java は文法エラーにしてしまいます。そこで「改行を表す合言葉」として \n という 2 文字を書く、というルールが用意されています。

代表的なエスケープシーケンスは次のとおりです。

記法意味用途
\n改行 (line feed)行を分ける
\tタブ (水平タブ)列を揃える
\"ダブルクォート 1 文字文字列内に " を入れる
\\バックスラッシュ 1 文字パス C:\\Users など
\rキャリッジリターンWindows 改行の併用 (\r\n)
\'シングルクォート 1 文字char リテラル内

図にすると、コンパイラがそれぞれの 2 文字を「特別な 1 文字」へ読み替えていることがよく分かります。

diagram (will load when visible)

見た目は 2 文字でも、実行時にはそれぞれ 1 文字分 の特殊な文字として扱われます。\n のコードは Java の内部では で、純粋な改行文字 1 つです。

ふだんあまり意識しませんが、println が行を区切ってくれるのも、内部で \n 系の文字を末尾に足してくれているからです。今回は逆に、自分で \n を埋め込んで return する側にまわります。

\n を入れた Before / After

まずは改行なしで 3 つの文を + で繋いだ場合 (Before) を見てみます。

Java

public class Solution { public static String printGreeting() { return "こんにちは!" + "Java を学んでいます。" + "今日もがんばろう!"; } }

この戻り値を表示するとこうなります。

プレーンテキスト

こんにちは!Java を学んでいます。今日もがんばろう!

3 つの文がべったり横に並んでしまいました。読みづらいですね。ここで \n を挟むと、見違えるように整います (After)。

Java

public class Solution { public static String printGreeting() { return "こんにちは!\nJava を学んでいます。\n今日もがんばろう!"; } }

実行結果は次のとおりです。

プレーンテキスト

こんにちは! Java を学んでいます。 今日もがんばろう!

\n を挟んだだけで、String の見た目が「3 行」になりました。ソースコード上は 1 行ですが、文字列の中身としては改行を含んだ 3 行ぶんになっている、というのが大事なポイントです。

\t でインデントを揃える

\n の仲間で覚えておくと便利なのが \t です。これを使うと、表のように列を揃えた出力を作れます。

Java

return "名前\t年齢\n太郎\t20\n花子\t22";

表示するとこうなります。

プレーンテキスト

名前 年齢 太郎 20 花子 22

半角スペースを並べて揃えるよりも、\t を 1 つ書くほうがずっと短く済みます。

\"\\ で記号そのものを書く

String リテラルはダブルクォートで囲むので、文字列の途中にダブルクォートをそのまま書くと文字列の終わりだと誤解されてしまいます。そこで \" と書くと、エスケープされて「ダブルクォート 1 文字」になります。

Java

return "彼は \"Hello\" と言った。";

これは 彼は "Hello" と言った。 という 1 つの文字列です。同じ発想で、バックスラッシュ自体を文字として書きたいときは \\ と 2 つ重ねます。Windows のパス C:\\Users\\TaroJavaString に書くときによく使います。

1 つだけ書きたい記号を 2 つ書くというのは最初は違和感がありますが、「\ は次の文字とセットで意味を持つ合図なので、ただの記号として置きたい時にはもう一度書いて打ち消す」と覚えると腑に落ちます。

+ を使った別解

どうしても 1 行が長くなりすぎて読みにくい時は、文字列連結演算子 + を使って 1 行ずつ書く書き方もあります。これも printGreeting の解として正しいです。

Java

public class Solution { public static String printGreeting() { return "こんにちは!\n" + "Java を学んでいます。\n" + "今日もがんばろう!"; } }

こちらは 3 行に分けて書いたほうがレビュー時の差分が見やすい、というメリットがあります。ただし、それぞれの文字列の末尾に \n を付け忘れると改行されないので注意してください。最後の文だけは末尾に改行を入れなくて良いです (テストもそうなっています)。

よくある間違い

初心者がよく踏むワナを 3 つ紹介します。

  • \n/n と書いてしまう。スラッシュの向きが逆だと、ただの 2 文字 /n として表示されます。\ (バックスラッシュ) が正しい向きです。
  • 行末の \n を忘れる。"こんにちは!" + "Java" のように \n を入れずに繋ぐと 1 行にくっついてしまいます。
  • 文字列の途中で改行コードを直接書く。エディタで Enter キーを押して改行を入れると Java はコンパイルエラーにします。文字列の改行は必ず \n で表現します。

もう 1 つ、+ で連結するときに余計な空白を入れてしまうと、結合された文字列の途中に半角スペースが紛れ込みます。テストは「期待される文字列と完全一致」で判定するので、空白 1 つの差で fail になります。

この章のポイント

ここまでの要点 \n は改行 1 文字、\t はタブ 1 文字、\" \\ はそれぞれ記号を 1 文字。1 本の String に複数行を詰めるときは \n を挟む、末尾の改行は付けない。

やってみよう

次の手順で printGreeting を完成させてください。

  1. Solution クラスに引数なしの printGreeting メソッドを書く (戻り値の型は String)
  2. return で 1 本の文字列を返す。3 つの文の間に \n を 2 つ挟む
  3. 最後の 今日もがんばろう! の後ろには \n を付けない
  4. 書けたら実行ボタンで動かして、テストが緑になることを確認する

もし + で連結する書き方のほうが見やすければそちらでも構いません。大事なのは「String 1 本に改行入りで 3 行ぶんの内容が入っていること」です。完成したら、次の章でいよいよ変数の登場です。

よくある質問

Q. Java と他言語の文法はどう違いますか?

A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。

Q. コードが動かないときに最初に見るべき場所は?

A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。

Q. Java の習得後に学ぶべき技術は何ですか?

A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。

次のレッスン

次は 変数を使った自己紹介 で、エスケープシーケンス \n を使って 1 つの文字列で複数行を表現する方法を学びます を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 複数行出力 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 複数行出力 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は printGreeting にする
  2. 戻り値の型は String、引数は無し
  3. 改行は \n を使って 1 本の文字列に 3 行ぶんを詰める

入出力例

test-cases.txt

printGreeting() → "こんにちは! Java を学んでいます。 今日もがんばろう!"

ヒント

main.java
main.java
学習モード

メモ

複数行の出力

⌘S で保存