java.lang.Systemクラスでわかるprint(), println()の違い

print, printlnメソッドは、コンソール出力で使用したことがある人も多いと思います。

println()は改行をいれてくれると認識している人も多いと思いますが、その実態はBufferedWriterクラスのnewLine()メソッドを呼出しています。

以下はSystemクラスとPrintStreamクラスのコードです。Systemはクラス、outはフィールド、print（println）はPrintStreamクラスのメソッドです

```Java
public final class System {
	...
	...
	
    public static final InputStream in = null;

    public static final PrintStream out = null;
    
    ...
    ...

}
```

```Java
public class PrintStream extends FilterOutputStream
    implements Appendable, Closeable
{
	...
	...
	
    private boolean trouble = false;
    private Formatter formatter;

    private BufferedWriter textOut;
    private OutputStreamWriter charOut;
    
    private void newLine() {
        try {
            synchronized (this) {
                ensureOpen();
                textOut.newLine();
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush)
                    out.flush();
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }
    }

    public void print(boolean b) {
        write(String.valueOf(b));
    }

    public void print(char c) {
        write(String.valueOf(c));
    }

    public void print(int i) {
        write(String.valueOf(i));
    }

    public void print(long l) {
        write(String.valueOf(l));
    }

    public void print(float f) {
        write(String.valueOf(f));
    }

    public void print(double d) {
        write(String.valueOf(d));
    }

    public void print(char s[]) {
        write(s);
    }

    public void print(String s) {
        write(String.valueOf(s));
    }

    public void print(Object obj) {
        write(String.valueOf(obj));
    }

    public void println() {
        newLine();
    }

    public void println(boolean x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(char x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(int x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(long x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(float x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(double x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(char x[]) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
    
    ...
    ...
}
```

### `print()` メソッド

- **機能**: 指定されたデータをコンソールに出力しますが、行の終わりに改行文字を追加しません。
- **データ型**: 異なるデータ型（boolean, char, int, long, float, double, char arrays, String, Objectなど）に対してオーバーロードされています。
- **例**: 
```Java
System.out.print("Hello");
System.out.print("world");
```
を実行すると、
```Java
Helloworld
```
と表示されます。

### `println()` メソッド

- **機能**: 指定されたデータをコンソールに出力した後、自動的に改行を行います。
- **データ型**: `print()`メソッドと同様に異なるデータ型に対してオーバーロードされており、データを文字列に変換してから出力しますが、出力の後に`newLine()`メソッドを呼び出して改行します。
- **例**:
```Java
System.out.println("Hello");
System.out.println("world");
```
を実行すると、
```Java
Hello
world
```
と表示されます。

### 実装の詳細

- **`println()`の内部動作**: `println()`メソッドは、内部的に`print()`メソッドを呼び出した後に`newLine()`メソッドを呼び出しています。`newLine()`メソッドは、バッファをフラッシュし、出力ストリームに改行を挿入します。
- **同期処理**: `print()`メソッドと`println()`メソッドは、内部的に`synchronized`ブロック内で実行されます。これは、複数のスレッドが同時にこれらのメソッドを呼び出す場合に、出力が正しく同期されるようにするためです。

### まとめ

`print()`と`println()`の主な違いは、`println()`が出力後に改行を追加することです。どちらのメソッドも、異なるデータ型をサポートし、スレッドセーフな方法でコンソールに出力を行います。