Java の学習を始めると、真っ先に出会うメソッドが System.out.println("Hello, World!");
です。画面に文字を表示する代表的な方法として、初心者から熟練エンジニアまで幅広く使われます。しかし、「なぜこんなにも当たり前のように使えるのか?」「このメソッドはいったいどんな仕組みなのか?」を、意外と曖昧にしている方も多いのではないでしょうか。
この記事では「なるほど、そうだったのか」と納得できるよう、基本的な知識は取得した中級者の方向けにSystem.out.println
の正体や動作原理を整理して解説していきます。
System クラスと println の関係
まず超前提ですが、System
はクラスです。一体これはどんなクラスなの?ってのを見ていきたいと思います。
System クラス→java.langパッケージに属する
System
はjava.lang
パッケージに属します。java.lang
は Java 言語の最も基本的なクラス群を集めた特別なパッケージで、String
やMath
、Thread
などもこの中に含まれます。System
はfinal
修飾子が付与されているため、継承ができません。
out フィールド:何者なのか
System
クラスにはout
、err
、in
というフィールドがありますが、そのうちのout
は 標準出力 を指し示すフィールドです。- シグニチャは次のようになっています。
public static final PrintStream out;
public
: どのクラスからでもアクセス可能static
: クラスに紐づくフィールド(インスタンス化不要)final
: 再代入は基本できない(※運用上はSystem.setOut(...)
で差し替えられるが、特殊用途)- 型 :
PrintStream
(後述)
println メソッド:実は PrintStream のメソッド
System.out.println
のprintln
は、out
フィールドが指すPrintStream
クラスのメソッドです。- フルネームは
java.io.PrintStream#println(...)
。 - 文字列や数値など、様々な引数型にオーバーロードされており、末尾に改行を付加して出力します。改行を付けない場合は
print(...)
を使います。
どうして画面に文字が出るの?:JVM と OS 標準出力のしくみ
Java コード上は println
を呼び出すだけで文字が表示されますが、背後ではもう少し複雑な処理が行われています。
- Java コード →
PrintStream
への書き込みprintln("Hello")
が呼ばれると、まずはPrintStream
オブジェクトに文字列やバイトデータが渡されます。 PrintStream
→ OS(標準出力、stdout)PrintStream
は内部バッファを通して、必要に応じて OS が提供する「標準出力 (stdout)」に書き込みを行います。Windows ならCONOUT$
、Unix 系ならファイルディスクリプタ1
が相当。- コンソールに文字が表示される
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(...)
→ 改行せず、文字が連続して表示される
こうしたコードを書きながら、「println
は PrintStream
のメソッドなんだ」と意識しておくと、理解が深まるはずです。