【Java・実例あり】println() と print() の違いと使い方

API・ライブラリ

Javaの System.out.println() および System.out.print() メソッドについて解説します。

記事内のコードは OpenJDK 21 にて動作確認済みです。

System.err.println() および System.err.print() は解説していません。

基本情報

System.out.println()
種類インスタンスメソッド
所属クラスjava.io.PrintStream
修飾子public
引数なし・すべての基本型・すべての参照型
戻り値なし
処理内容引数を文字列として標準出力 out に出力し、末尾に改行を付加する
APIリファレンスPrintStream (Java SE 21 & JDK 21)
System.out.print()
種類インスタンスメソッド
所属クラスjava.io.PrintStream
修飾子public
引数すべての基本型・すべての参照型
戻り値なし
処理内容引数を文字列として標準出力 out に出力する
APIリファレンスPrintStream (Java SE 21 & JDK 21)

println() と print() の違い

結論から言えば

改行するかしないか

です。

どちらも「引数に与えられた内容を表示する」という点では変わりませんが、System.out.println() は1命令ごとに改行するのに対し、System.out.print() は改行しません。

println() の簡単な例

コード
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello"); // 1
        System.out.println("World"); // 2
        System.out.println("!"); // 3
    }
}
実行結果
Hello
World
!

print() の簡単な例

コード
public class Main {
    public static void main(String[] args) {
        System.out.print("Hello"); // 1
        System.out.print("World"); // 2
        System.out.print("!"); // 3
    }
}
実行結果
HelloWorld!

次項からは、両者について詳しく解説します。

基本的な使い方:println()

基本的な構文は以下の通りです。

System.out.println(表示したい内容);

printlnprint line の略だと思われ、1命令ごとに自動で改行するという特徴を持ちます。そのため、結果は縦に積み重なる(1行ごとに表示される)ように見えます。

基本型を表示する

基本型リテラルをそのまま表示することができます。

コード
public class Main {
    public static void main(String[] args) {
        
        System.out.println(10); // int
        System.out.println(100L); // long
        
        System.out.println(10.245f); // float
        System.out.println(3.1415926535) // double

        System.out.println(true); // boolean
        System.out.println('魁'); // char
    }
}
実行結果
10
100
10.254
3.1415926535
true
魁

変数の内容を表示する

変数の内容をそのまま表示することができます。

コード
public class Main {
    public static void main(String[] args) {
        
        int a = 10;
        int b = 20;
        long c = 10000000L;
        double d = 33.333;
        
        System.out.println(a); // 変数のまま渡す
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
    }
}
実行結果
10
20
10000000
33.333

式の結果を表示する

式の結果を表示することができます。

まず、() 内の式が評価され、その結果が表示される仕組みです。

コード
public class Main {
    public static void main(String[] args) {

        int a = 100; int b = 10000;
        
        System.out.println(10 + 20);
        System.out.println(100.0 + 30);
        System.out.println(a - b); // 100 - 10000
    }
}
実行結果
30
130.0
-9900

System.out.println(10 + 20) は、まず式 10 + 20 が評価され、30 になります。その後、System.out.println(30) が実行され、30 が表示されます。

文字列を表示する

文字列を表示することができます。

コード
public class Main {
    public static void main(String[] args) {

        String message = "Hello, Jakarta!";

        System.out.println("Hello, Java!");
        System.out.println("Hello" + ", " + "Jaka!"); // 文字列結合演算子の利用
        System.out.println(message);
    }
}
実行結果
Hello, Java!
Hello, Jaka!
Hello, Jakarta!

Main.java 7行目の + 演算子は加算演算子ではなく文字列結合演算子といい、文字列同士を結合するはたらきがあります。

"Hello" + ", " + "Jaka!" は、まず "Hello" + ", " が評価されて "Hello, " になり、その後 "Hello, " + "Jaka!" が評価されて "Hello, Jaka!" になります。

なお、エスケープシーケンスが含まれた文字列を扱うこともできます。

参照型を表示する

参照型(インスタンス)の文字列表現を表示することができます。

コード
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {

        ZonedDateTime currentTime = ZonedDateTime.now(); // 現在時刻を得る

        System.out.println(currentTime);
    }
}
実行結果(環境により異なる)
2025-08-09T17:52:05.284673300+09:00[Asia/Tokyo]

内部で自動的に toString() が呼び出されるため、currentTime.toString() と書くのは冗長です。

空行を挿入する

引数を与えず、他の println() と組み合わせて使うことで、空行を挿入することができます。

コード
public class Main {
    public static void main(String[] args) {

        System.out.println("Hello, World!");
        System.out.println(); // 空行の挿入
        System.out.println("Hello, Java!");
    }
}
実行結果
Hello, World!

Hello, Java!

println() ではなく、print() printf() と組み合わせている場合は、必ずしもこのような挙動になりません。注意してください。

基本的な使い方:print()

基本的な構文は以下の通りです。

System.out.print(表示したい内容);

println() とほぼ同じですが、自動で改行しないという特徴があるため、結果は横一列に並ぶように見えます。

例えば、こちらのコードを print() で書き直すと、以下のようになります。

コード
public class Main {
    public static void main(String[] args) {
        
        int a = 10;
        int b = 20;
        long c = 10000000L;
        double d = 33.333;
        
        System.out.print(a);
        System.out.print(b);
        System.out.print(c);
        System.out.print(d);
    }
}
実行結果
10201000000033.333

改行されず、横一列に並んでいるのが確認できます。

また、引数を与えずに使うことはできません。以下のコードはコンパイルエラーとなります。

コード
public class Main {
    public static void main(String[] args) {

        System.out.print("Hello, World!");
        System.out.print(); // 問題箇所
        System.out.print("Hello, Java!");
    }
}
コンパイル結果(抜粋)
java: no suitable method found for print(no arguments)
    method java.io.PrintStream.print(boolean) is not applicable
      (actual and formal argument lists differ in length)
    method java.io.PrintStream.print(char) is not applicable
      (actual and formal argument lists differ in length)

APIリファレンスにも、引数をとらない print() は定義されていません。注意しましょう。

基本的な使い方は println() と同じであるため、説明は省略します。
引数なしでは利用できない=空行を挿入する用途には使えない点にだけ注意すればよいでしょう。

よくある間違い

引数の複数指定

println() および print() に引数を複数渡すことはできません。

以下のコードはコンパイルエラーとなります。

コード
public class Main {
    public static void main(String[] args) {

        String arg1 = "引数1";
        String arg2 = "引数2";
        String arg3 = "引数3";

        System.out.println(arg1, arg2, arg3); // 引数の複数指定
        System.out.print("引数4", "引数5", "引数6");
    }
}
コンパイル結果(抜粋)
java: no suitable method found for println(java.lang.String,java.lang.String,java.lang.String)
    method java.io.PrintStream.println() is not applicable
java: no suitable method found for print(java.lang.String,java.lang.String,java.lang.String)
    method java.io.PrintStream.print(boolean) is not applicable

可変長引数(複数の引数を渡せる機能)がサポートされていないため、このようなエラーが発生します。一度に複数の値を表示したいなら、文字列結合演算子によって要素を結合する必要があります。

コード
public class Main {
    public static void main(String[] args) {

        String arg1 = "引数1";
        String arg2 = "引数2";
        String arg3 = "引数3";

        System.out.println(arg1 + ", " + arg2 + ", " + arg3);
        System.out.print("引数4" + ", " + "引数5" + ", " + "引数6");
    }
}
実行結果
引数1, 引数2, 引数3
引数4, 引数5, 引数6

文字列結合演算子によって、"引数4" + ", " + "引数5" + ", " + "引数6""引数4, 引数5, 引数6" というひとつの文字列になるため、エラーになりません。

printf() は可変長引数をサポートしているため、条件を満たせば引数をいくつでも渡すことができます。

改行の重複

println() は自動で改行するため、誤って手動で改行すると予期せぬ結果になります。

コード
public class Main {
    public static void main(String[] args) {

        System.out.println("Hello, Java!");
        System.out.printf("%n"); // 手動で改行する命令
        System.out.println("Hello, me!");
    }
}
実行結果
Hello, Java!

Hello, me!

print() は自動で改行しないため手動での改行が必要ですが、println() では不要です。

両者を混同しないように注意しましょう。

printf() も自動で改行しません。

勘の鋭い人は、上記のコードとこちらのコードが非常に似ていると感じたかもしれません。
実はその通りで、空行は改行の重複によって実現しています。

null時の挙動

この項の理解には、オブジェクト指向プログラミング(OOP)に関する基本的な知識と習熟が必要です。

println() および print()null である変数を渡しても NullPointerException 例外は発生せず、代わりに null という文字列が表示されます。

コード
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {

        ZonedDateTime currentTime = null;
        String yourName = null;

        System.out.println(currentTime);
        System.out.print(yourName);
    }
}
実行結果
null
null

ここで重要なのは、このような挙動になるのは型が確定した null を渡した時のみということです。直に null を渡すとコンパイルエラーとなります。

コード
public class Main {
    public static void main(String[] args) {

        System.out.println(null);
        System.out.print(null);
    }
}
コンパイル結果(抜粋)
java: reference to println is ambiguous
  both method println(char[]) in java.io.PrintStream and method println(java.lang.String) in java.io.PrintStream match
java: reference to print is ambiguous
  both method print(char[]) in java.io.PrintStream and method print(java.lang.String) in java.io.PrintStream match

これはオーバーロード解決の失敗によって発生します。

APIリファレンスを見ると、println() および print() には char[] 型の引数をとるものと String 型の引数をとるものがオーバーロード定義されています。

null任意の参照型に代入可能なため、char[]String のどちらにも適合します。その結果、どちらの型を引数にとるメソッドを使うべきなのかが曖昧になり、エラーが発生します。これをオーバーロード解決の失敗といいます。

このエラーを解決するためには、null の型を確定させる必要があります。変数は必ず型を持つため、先ほどの例のように変数に null を代入することで解決できます。または、null を明示的にキャストすることでも解決できます。

コード
public class Main {
    public static void main(String[] args) {

        // 明示的なキャスト
        // 型の曖昧さを解消する
        System.out.println((String) null);
        System.out.print((Object) null);
    }
}
実行結果
null
null

この複雑な挙動は null が持つ特殊な性質によって発生します。頭の片隅に入れておくとよいでしょう。

null は何者か

Java言語仕様によれば、null は「null 型」という型の唯一のリテラルとされています。

しかし、開発者が「null 型」を直接扱うことはできず、Null x = null; のような構文も存在しません。さらに、すべての参照型変数に代入可能でもあります。

したがって、nullオブジェクト指向の理から逸脱した、特別な存在だと言えるでしょう。

自作クラスの文字列表現

この項の理解には、オブジェクト指向プログラミング(OOP)に関する基本的な知識と習熟が必要です。

println() および print() で自作クラスのインスタンスの文字列表現を正しく表示するためには、toString() のオーバーライドが必要です。

オーバーライドしていない状態では Object クラスの実装がそのまま使われるため、クラス名@ハッシュコード という形式になります。

コード
class Hero {
    String name;
    int hp;
    int mp;

    Hero(String name) {
        this.name = name;
        hp = 100;
        mp = 50;
    }
}


public class Main {
    public static void main(String[] args) {

        Hero h = new Hero("池田");
        System.out.println(h);
        System.out.print(new Hero("田中"));
    }
}
実行結果(環境により異なる)
Hero@4e50df2e
Hero@1d81eb93

toString() を適切にオーバーライドすることで、意図する文字列表現を表示することができます。

コード
class Hero {
    String name;
    int hp;
    int mp;

    Hero(String name) {
        this.name = name;
        hp = 100;
        mp = 50;
    }

    // toString() のオーバーライド
    @Override
    public String toString() {
        return "name: " + name + ", hp: " + hp + ", mp: " + mp;
    }
}


public class Main {
    public static void main(String[] args) {

        Hero h = new Hero("池田");
        System.out.println(h);
        System.out.print(new Hero("田中"));
    }
}
実行結果
name: 池田, hp: 100, mp: 50
name: 田中, hp: 100, mp: 50

まとめ

今回はJavaの System.out.println() および System.out.print() メソッドについて解説しました。

本格的な出力には適しませんが、開発では非常によく使うメソッドです。初学者が最初に触れるメソッドでありながら、案外奥深いところもあります。是非使いこなせるようになりましょう!

本記事は今後、より内容を充実させる予定です。

Q&A

System.out.printf() との違いは何ですか?

書式指定文字列を利用できるかどうかです。

書式指定文字列は %X という特殊な記法(書式指定子)を含む文字列で、高度な文字列の整形ができます。System.out.printf() のほうが柔軟性は高いと言えるでしょう。
一方、単に文字列を表示したいだけなら System.out.println() または System.out.print() で十分です。

System.err.println(), System.err.print() との違いは何ですか?

出力先(表示先)が異なります。

System.out 系は標準出力 out に文字列を出力し、System.err 系は標準エラー出力 err に文字列を出力します。
ただし、多くの場合で両者は同じ出力先(同一のコンソールなど)を指します。どちらを使っても結果に変化はないことが多いです。
※ 一部の環境では、両者を区別するために表示順や文字色が変化することがあります。

System.out.println()System.out.print() のどちらを使えばいいですか?

基本は System.out.println() をおすすめします。

改行がある方が出力が圧倒的に見やすくなるためです。また、自動で改行されるため、特別な操作が不要なのも利点です。
もちろん、System.out.print() が活躍する場面も多くあります。基本は println() で統一し、必要なときだけ print() を使うとバランスがよいでしょう。

System.out.println()System.out.print() は併用できますか?

できます。

ただし、改行位置が分かりにくくなります。

System.out.print() で改行するにはどうすればいいですか?

\n (改行命令)を使用します。

System.out.print() は自動で改行しないため、改行命令を手動で文字列に挿入する必要があります。
\n について、詳しくはこちらをご覧ください。

System.out.println()System.out.print() の処理速度に違いはありますか?

ほぼありません。

System.out.println() は改行を付加する分だけわずかに遅いですが、その差は実用上無視できるレベルです。
もし差が生まれるとすれば、それは両者の性能差ではなく、実行環境に起因する可能性が高いでしょう。

System.out.println() の改行コードを任意で指定することはできますか?

できません。

System.out.println() はつねに環境依存の改行コードを使用します。Windows ならCRLF、Linux / macOS ならLFです。

System.out.println()System.out.print() の出力先を変えることはできますか?

できます。

System.out は静的変数であり、System.setOut() セッターによって変更可能です。
PrintStream クラスのインスタンスを渡すことができ、この方法で変数 out の内容を変更すれば、出力先を変えることができます。
ただし、変数 out を使うすべての処理に影響するため、注意が必要です。

コメント

PAGE TOP
タイトルとURLをコピーしました