자바의 실제 JDK 소스 코드(내부 구현체)를 비교해 보면, 다른 함수들과 char[] 함수 사이에 중요한 차이가 딱 하나 있습니다.
바로 String.valueOf()의 유무입니다.
요약
- 다른 객체나 배열들은 String.valueOf()->toString()이 호출되며 주소값으로 변환함.
- char[ ]은 전용 메서드를 통해 그 함정을 우회하여 I/O 스트림에 배열 자체로 전달되어 문자열처럼 변환되어 출력될 수 있음.
다른 배열(예: int[ ], double[ ])이 들어올 때
println(int[]) 전용 메서드는 없기 때문에 가장 포괄적인 println(Object x)를 호출함.
public void println(Object x) {
String s = String.valueOf(x);
if (getClass() == PrintStream.class) {
writeln(String.valueOf(s));
} else {
synchronized (this) {
print(s);
newLine();
}
}
}
작동 원리:
String.valueOf(x)는 객체가 들어오면 내부적으로 그 객체의 toString() 메서드를 호출함.
배열 객체의 기본 toString()은 [I@15db9742 같은 '메모리 주소값(해시코드)'을 반환함.
char[ ]이 들어올 때
따로 Overloading된 println(char[] x)를 호출함.
public void println(char[] x) {
if (getClass() == PrintStream.class) {
writeln(x);
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
작동원리:
여기서는 String.valueOf(x)로 변환하는 과정을 건너뛰고, x (char 배열 자체)를 그대로 writeln()이나 print() 내부로 전달함.
이렇게 던져진 char[]은 자바의 I/O(입출력) 시스템 가장 밑단으로 내려가게 되는데,
자바의 출력 스트림들은 char[ ] 데이터를 받으면 주소값을 출력하는 게 아니라
텍스트 데이터라고 인식해서 배열 안의 문자들을 하나씩 스트림에 밀어 넣어 순회 출력하도록 설계되어 있음!
'Java' 카테고리의 다른 글
| [Java] JVM 메모리 구조로 보는 자바의 본질 / 객체지향의 특성별 예시 (0) | 2026.04.06 |
|---|---|
| [Java] 배열 / 2차원 배열 / 가변 배열 (0) | 2026.03.20 |
| [Java] 자바의 원칙 vs 편의성: 철학을 깬 복합 대입 연산자, char 배열 출력과 철학을 지킨 for-each문 (0) | 2026.03.19 |
| [Java] while문 / 분기 처리-break, continue (0) | 2026.03.18 |
| [Java] 제어문-if, switch / 반복문-for, while / 랜덤 함수 사용법 / final (4) | 2026.03.17 |