valueOf 메소드는 boolean, char, int 같은 다양한 타입의 값을 문자열로 변환해주는 메소드입니다.
valueOf
String클래스 내부에 선언된 valueOf 코드는 총 9개입니다.
Object, char[](offset, count), boolean, char, int, long, float, double
해당 타입 파라미터의 값을 문자열로 변환해줍니다.
int i = 10;
char[] data = {'a', 'b', 'c', 'd', 'e'};
boolean b = true;
long l = 100000000000000l;
float f = 0.000000000001f;
double d = 0.11111111111;
System.out.println("int : " + String.valueOf(i) + ", class : " + String.valueOf(i).getClass());
System.out.println("char[] : " + String.valueOf(data) + ", class : " + String.valueOf(data).getClass());
System.out.println("char[] + offset + count : " + String.valueOf(data, 1, 3) + ", class : " + String.valueOf(data, 1, 3).getClass());
System.out.println("boolean : " + String.valueOf(b) + ", class : " + String.valueOf(b).getClass());
System.out.println("long : " + String.valueOf(l) + ", class : " + String.valueOf(l).getClass());
System.out.println("float : " + String.valueOf(f) + ", class : " + String.valueOf(f).getClass());
System.out.println("double : " + String.valueOf(d) + ", class : " + String.valueOf(d).getClass());
valueOf의 결과를 getClass해보면 모두 java.lang.String으로 나오는 것을 확인할 수 있습니다.
이 valueOf들의 내부 코드를 보면 Object와 char를 제외하고 모두 해당 클래스의 toString메소드를 사용합니다.
valueOf null을 그대로 사용하면 NullPointerException이 발생합니다.
String s = String.valueOf(null); // NullPointerException 발생
System.out.println(s);
String s = String.valueOf((Object) null); // "null" 문자열로 변환됨
System.out.println((s));
형변환을 하지 않으면 valueOf(char[] data) 메소드를 사용하고 형변환을 하면 valueOf(Object obj) 메소드를 사용합니다.
전자는 null을 사용할 수 없고, 후자는 null을 사용할 수 있습니다.
toString
이 메소드도 valueOf와 마찬가지로 문자열로 변환해주는 메소드입니다.
Object에 선언된 메소드로 모든 클래스는 toString을 가질 수 있습니다.
마찬가지로 String클래스에도 toString이 있고, Integer, Long, Float, Double에도 toString이 있습니다.
그래서 valueOf의 내부 구현 로직에는 해당 클래스의 toString을 사용합니다.
public static String valueOf(int i) {
return Integer.toString(i);
}
이런식으로 구현되어있습니다.
copyValueOf
파라미터로 char배열(+offset, count)을 받습니다.
문자열로 만들어준다는 로직은 같습니다.
char[] data = {'a', 'b', 'c', 'd', 'e'};
System.out.println(String.copyValueOf(data, 1, 3));
System.out.println(String.copyValueOf(data));
char배열을 변수로 사용하는 경우엔 valueOf나 copyValueOf는 로직이 같습니다.