PR

System.out.printlnをあえて中級者向けに3分でわかりやすく解説

Java

Java の学習を始めると、真っ先に出会うメソッドが System.out.println("Hello, World!"); です。画面に文字を表示する代表的な方法として、初心者から熟練エンジニアまで幅広く使われます。

しかし、「なぜこんなにも当たり前のように使えるのか?」「このメソッドはいったいどんな仕組みなのか?」を、意外と曖昧にしている方も多いのではないでしょうか。

この記事では「なるほど、そうだったのか」と納得できるよう、基本的な知識は取得した中級者の方向けにSystem.out.println の正体や動作原理を整理して解説していきます。

スポンサーリンク

System クラスと println の関係

まず超前提ですがSystem.out.printlnは、Systemクラスの「outフィールド」にある printlnメソッドを呼び出す、という意味です。

要素説明
SystemJavaの標準クラス(java.langパッケージ)
outSystemクラスのpublic staticなフィールド。型は PrintStream
println()PrintStream クラスのメソッド。画面に文字を表示する。

まずは、System というクラスから。これは一体どんなクラスなの?ってのを見ていきたいと思います。

System クラス→java.langパッケージに属する

  • Systemjava.lang パッケージに属するクラス。
  • java.lang は Java 言語の最も基本的なクラス群を集めた特別なパッケージで、StringMathThread などもこの中に含まれる。
  • Systemfinal 修飾子が付与されているため、継承ができない。

out フィールド:何者なのか

  • System クラスには outerrin というフィールドがありますが、そのうちの out標準出力 を指し示すフィールドです。
  • シグニチャは次のようになっています。
public static final PrintStream out;
  • public : どのクラスからでもアクセス可能
  • static : クラスに紐づくフィールド(インスタンス化不要)
  • final : 再代入は基本できない(※運用上は System.setOut(...) で差し替えられるが、特殊用途)
  • 型 : PrintStream(後述)
Q
標準出力とは?
A

「画面(コンソール)に文字を表示すること」を指します。標準出力は「出力先」の1つで、他にも「ファイル出力」や「ネットワーク出力」などがあります。が標準出力と言ったら「コンソール」です。

println メソッド:実は PrintStream のメソッド

  • System.out.printlnprintln は、out フィールドが指す PrintStream クラスのメソッドです。
  • フルネームは java.io.PrintStream#println(...)
  • 文字列や数値など、様々な引数型にオーバーロードされており、末尾に改行を付加して出力します。改行を付けない場合は print(...) を使います。

ポイント よく使うメソッド

メソッド説明使用例出力例
print()改行なしで表示するSystem.out.print("Hello");Hello
println()表示して改行するSystem.out.println("World");World(+改行)
printf()書式付きで出力するSystem.out.printf("%d円", 100);100円
write()バイトを出力する(低レベル)System.out.write(65);A(65 = 'A'のASCII)
flush()バッファに溜まったデータを強制的に出力バッファを明示的に流す(通常は不要)-

System クラスは Java の標準ライブラリ(java.lang.System)に含まれていて、OpenJDKなどのオープンソース実装ではそのソースコードが公開されています。ただし、非常に大きく複雑なクラスであり、数千行に及ぶコードが含まれます。

ここで全文を提示するのは制限の都合上難しいですが、主要な部分(out フィールドに関連する部分*を抜粋して紹介します。

package java.lang;

import java.io.*;

public final class System {
    public static final PrintStream out;

    static {
        registerNatives();
        out = new PrintStream(new BufferedOutputStream(fdOut), true);
        // その他、errやinもここで初期化される
    }

    private static native void registerNatives();

    private static final FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
    
    // その他、多数のメソッドやフィールドがある
}

どうして画面に文字が出るの?:JVM と OS 標準出力のしくみ

Java コード上は println を呼び出すだけで文字が表示されますが、背後ではもう少し複雑な処理が行われています。

  1. Java コード → PrintStream への書き込み
    println("Hello") が呼ばれると、まずは PrintStream オブジェクトに文字列やバイトデータが渡されます。
  2. PrintStream → OS(標準出力、stdout)
    PrintStream は内部バッファを通して、必要に応じて OS が提供する「標準出力 (stdout)」に書き込みを行います。Windows なら CONOUT$、Unix 系ならファイルディスクリプタ 1 が相当。
  3. コンソールに文字が表示される
    OS が受け取った文字データをコンソールに転送し、結果として開発者は文字が画面に映ったのを確認できるわけです。

コード例:ちょっと応用してみる

実際に、簡単なコード例を見てみましょう。

public class Main {
    public static void main(String[] args) {
        System.out.println("=== プログラム開始 ===");
        
        // 数値や真偽値も出力できる
        System.out.println(123);
        System.out.println(true);

        // 改行なし出力 → print
        System.out.print("改行はなく、");
        System.out.print("ここに続く。");
        
        System.out.println(); // 改行のみ
        System.out.println("=== プログラム終了 ===");
    }
}
  • System.out.println("=== プログラム開始 ===");
    → 文字列を改行付きで表示
  • System.out.println(123);
    → 整数を文字列に変換して表示
  • System.out.print(...)
    → 改行せず、文字が連続して表示される

こうしたコードを書きながら、printlnPrintStream のメソッドなんだ」と意識しておくと、理解が深まるはずです。

Systemクラスの代表的なメソッド一覧

メソッド説明サンプルコード出力例/動作
currentTimeMillis()現在の時刻(ミリ秒)を取得System.out.println(System.currentTimeMillis());例:1711529876543
nanoTime()より高精度な時間(ナノ秒)を取得System.out.println(System.nanoTime());例:753318543210987
exit(int status)プログラムを終了させるSystem.exit(0);JVMを終了(以降の処理は行われない)
gc()ガベージコレクションを起動(お願いベース)System.gc();メモリの整理を試みる(強制ではない)
arraycopy()配列の一部をコピーするSystem.arraycopy(src, 0, dest, 0, 3);配列要素がコピーされる
getProperties()システム情報(プロパティ)を取得System.out.println(System.getProperties());JavaやOSの情報一覧
getProperty(String key)特定のシステムプロパティを取得System.out.println(System.getProperty("java.version"));例:17.0.8

使い方のサンプル

時間の測定

long start = System.currentTimeMillis();
// 処理をする
long end = System.currentTimeMillis();
System.out.println("処理時間:" + (end - start) + "ms");

② 配列コピー

int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[3];
System.arraycopy(src, 0, dest, 0, 3);
System.out.println(java.util.Arrays.toString(dest)); // [1, 2, 3]

システム情報の取得

System.out.println(System.getProperty("os.name")); // OS名を表示
System.out.println(System.getProperty("user.dir")); // カレントディレクトリ
タイトルとURLをコピーしました