객체를 문자열(String)로 변환하는 방법. 그 사소한 차이
아무렇게나 하면 안되는 문자열 캐스팅
여는글
안녕하세요. 연속해서 JAVA관련 포스팅입니다. 오늘은 객체를 문자열로 캐스팅하기 위해 사용할 수 있는 방법에 대해 소개 해드릴텐데요. 객체를 문자열로 캐스팅하기 위한 방법은 하나가 아닌만큼 각 상황에 맞게 사용하는 것이 중요합니다. 종종 “변환만 되면 되지” 하고 아무렇게 사용하시거나 인텔리제이에서 하라는대로만 하면 ClassCastException
이나 NullPointerException
발생의 위험이 분명이 생길것이니 말입니다.
아래 예시에서는 파라미터를 받아오고 변환하는 과정을 가정해서 설명하겠습니다.
첫번째 방법 : (String)
[올바른 예]
// 전달될 파라미터
{
name : "jimoou"
}
public void printName(Map<String,Object> param) {
String str = (String) param.get("name");
System.out.println(str);
}
// 출력
jimoou
[잘못된 예]
// 전달될 파라미터
{
name : 0
}
public void printName(Map<String,Object> param) {
String str = (String) param.get("name");
System.out.println(str);
}
// 출력
ClassCastException
첫 번째 방법은 (String)
을 객체 앞에 적어줌으로 직접 캐스팅 하는 방법인데요. 이 방법은 객체가 String
클래스의 인스턴스인 경우에만 사용할 수 있습니다.
객체가 String
이 아닌 경우, 런타임에 ClassCastException
이 발생합니다. 이 때는 캐스팅을 수행하지 않고, 개체를 String
으로 취급하려고 시도하기 때문입니다.
따라서, 객체가 이미 String
이라는 것을 확실히 알고 있을 때 사용합니다.
두번째 방법 : String.valueOf();
Object obj = null;
String str = String.valueOf(obj);
두 번째 방법은 정적메소드를 사용하여 어떤 객체든 String으로 변환하는 방법입니다.
null
을 포함한 모든 객체를 안전하게 문자열로 변환하기 때문에, 코드 예시와 같은경우엔 str
이 "null"
이라는 문자열을 반환할 것입니다. 따라서 예외가 발생하지 않는 방법입니다.
그렇기 때문에 null
을 처리하고 싶다거나 예외를 피하고 싶을 때 사용하면 됩니다.
세번째 방법 : toString()
[옳은 예]
Object obj = new Object();
String str = obj.toString();
// 출력
java.lang.Object@1a2b3c
[나쁜 예]
int val = 0;
String str = iter.toString(); //사용 ㅂ
String str = (String) iter; // 사
세 번째 방법은 객체의 메소드를 호출하여 문자열로 변환하는 방법입니다.
이 방법을 사용하기 위해서는 객체에 toString()
이 정의되어 있어야 합니다. 그렇지 않으면, 기본적으로 Object
클래스의 toString()
을 사용하는데, 특별히 toString()
이 재정의 되지 않았다면 클래스 이름과 해시코드가 포함된 문자열이 반환됩니다. 그리고 객체가 null
인 경우에, toString()
을 호출하면 NullPointerException이 발생합니다.
다만 헷갈리실 수 있는게 어떤 객체를 파라미터 형태로 받아 올 때 해당 객체가 정수로 전달이되었다고 해도 다음과 같은 상황에서는 toString()
메소드를 사용할 수 있습니다.
//전달 되는 값
{
name : 0
}
public void printName(Map<String,Object> param) {
String str = param.get("number").toString();
System.out.println(str);
}
// 출력 값
"0"
하지만, 이 상황에서도 null
이 아닌지는 반드시 체크를 해야합니다.
결론
(String)
캐스팅은 객체가 이미String
임을 확실히 알 때만 사용하는 것이 안전합니다. 그렇지 않으면 런타임에서ClassCastException
이 발생할 수 있습니다.String.valueOf()
는 모든 객체를 안전하게 문자열로 변환할 수 있는 방법입니다. 특히,null
일 경우"null"
이라는 문자열을 반환해 예외 없이 처리가 가능합니다.null
을 처리해야 할 때 가장 안전한 선택입니다.toString()
은 객체의toString()
메서드를 호출해 문자열을 반환하지만, 객체가 null이면NullPointerException
을 유발할 수 있습니다.toString()
은 주로 객체가null
이 아닐 때 사용하며, 객체의toString()
구현이 유효한 문자열을 반환하는 경우에 사용됩니다.