Java String, toString, String.valueOf 차이점
1. String, toString
이것은 객체를 String 유형 값으로 변환하는 표준 유형 변환이다. 이 방법을 사용할 때 유형이 String 유형으로 변환 가능해야 한다는 점에 유의해야 한다.
따라서 instanceof를 사용하여 변환할 수 있는지 여부를 확인하는 형식 검사를 수행하는 것이 가장 좋다. 그렇지 않으면 CalssCastException이 발생하기 쉽다.
또한 Object 유형으로 정의된 객체가 String으로 변환될 때 구문 검사에서 오류를 보고하지 않아 잠재적인 오류가 발생할 수 있으므로 특히 주의해야 한다.
1
2
Object obj = new Integer(100);
String strVal = (String)obj;
Integer type에서 String type으로 캐스트 할 수 없으므로 런타임에 오류가 발생합니다. java.lang.Object 클래스에 이미 .toString()이라는 public 메소드가 있기 때문이다. 따라서 이 메소드는 엄격한 의미에서 모든 Java 객체에서 호출될 수 있다.
그러나 사용할 때는 개체가 null 값이 아닌지 확인해야 합니다. 그렇지 않으면 NullPointerException이 발생한다. 이 메서드를 사용할 때 일반적으로 파생 클래스는 Object의 toString() 메서드를 재정의한다.
2. String.valueOf
메소드는 정적 메서드이며 String을 통해 직접 호출할 수 있다. 그것은 완벽하다고 할 수 있다.
다만 이런 식으로 쓰는 것이 익숙하지 않을 뿐입니다. 이 구현은 이전 두 가지의 단점과 단점을 피한다.
1
2
3
public static String valueOf(Object obj){
return (obj==null) ? "null" : obj.toString()
}
내부적으로는 null로 판단되어 null 포인터 예외가 보고되지 않는다. 위의 소스 코드에서 null 값에 대해 걱정할 필요가 없는 이유를 명확하게 알 수 있다.
그러나 이것은 또한 우리에게 숨겨진 위험을 제공한다. object가 null일 때 String.valueOf(object)의 값은 null이 아니라 “null” 문자열이라는 점에 유의해야 한다!. 사용 중 주의해야 한다.
1
2
3
if(String.valueOf(object)==null){
System.out.println("The value passed in is null!");
}
그러한 진술에 어떤 문제가 발생할 수 있다. 콘솔에 출력할 때 시각적으로 다음 명령문의 실행 결과의 차이점은 무엇인가?
1
2
System.out.println(String.valueOf(null));
System.out.println(null);
우리가 보는 출력은 정확히 같은 것이 될 것이다. null, 그러나 그것들이 같은 것을 의미하지는 않는다.
요약: 이 세 가지를 사용하려면
String.valueOf()
를 사용해야 한다고 생각한다. 이러한 사용은 안전하고 신뢰할 수 있으며 이상을 일으키지 않는다.
3. Exception 참고
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int intNum = 1;
Object objNull = null;
Object objnum = new Integer(1);
// toString
String str1 = intNum.toString(intNum); // 컴파일 에러
String str2 = objNull.toString(); // NullPointerException
String str3 = objnum.toString();
// (String)
String str4 = (String) intNum; // 컴파일 에러
String str5 = (String) objNull;
String str6 = (String) objnum; // ClassCastException
// String.valueOf()
String str7 = String.valueOf(intNum);
String str8 = String.valueOf(objNull);
String str9 = String.valueOf(objnum);