반응형

두 메소드 모두 Object의 값을 String으로 변환하지만 변경하고자 하는Object가 null인 경우 다르다.
toString()과 같은 경우 Null PointerException(NPE)을 발생시키지만 valueOf는 "null"이라는 문자열로 처리한다.

즉 비교해서 정리하자면
  • String.valueOf() - 파라미터가 null이면 문자열 "null"을 만들어서 반환한다.
  • toString() - 대상 값이 null이면 NPE를 발생시키고 Object에 담긴 값이 String이 아니여도 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
destItemMap.get("LOWER_VAL") 이 null 일 경우
String lowerCoatingVal1 = String.valueOf(destItemMap.get("LOWER_VAL"));
String lowerCoatingVal2 = destItemMap.get("LOWER_VAL").toString();
 
lowerCoatingVal1 = "null"
lowerCoatingVal2 = NullPointerException 발생
 
String.valueOf()의 null 체크
String lowerCoatingVal1 = String.valueOf(destItemMap.get("LOWER_VAL"));
if("null".equals(lowerCoatingVal1)) {
    // To do Somting....
}
 
// equals함수를 사용할때 왼쪽에 있는 것을 기준으로 비교하기 때문에 변수보다는 문자열을 왼쪽에 두는 것을 추천한다.
// 즉 strTestVal이 null인 경우 ret = "1"인 if문은 NPE를 발생시킨다.
String strTestVal = null;
String ret = "";
 
/* Exception 발생 */
if!(strTestVal .equals("")) ) ret = "1";
 
/* 정상 */
if!("".equals(strTestVal)) ) ret = "2";
 
cs

다시 말해 두가지 메서드의 차이점은 null값에 따른 NPE의 발생 유무이다.

이런 차이점 때문에 valueOf의 null체크 방법은 "null".equals(string) 형태로 체크를 해야한다.

null로 인해 발생된 에러는 시간이 지나고, 타인의 소스인경우 디버깅하기 어렵고 어떤의미를 내포하고 있는지 판단하기 어렵다. 때문에 NPE를 방지하기 위해 toString보다는 valueOf를 사용하는 것을 추천한다.


반응형
  1. 김경모 2019.12.20 10:19

    예외처리가 없는 메소드 위주로 코딩하는 것이 좋은건가요? 그리고 맞다면 이유가 뭔지 궁금합니다.

    • 승우승 2019.12.24 08:45 신고

      안녕하세요 예외처리가 없는 메소드 위주로 코딩한다는게 어떤 뜻인지 잘 모르겠네요 ㅠㅠ
      NPE와 같은 경우 Unchecked Exception의 한종류 입니다. 또한 개발자 부주의로 발생하는 예외이므로 catch, throw를 이용해서 처리하지 않아도 되며 NPE를 예방하기 위한 한가지 방법이 valueOf()를 사용하는 것입니다.
      개인적으로 try, catch는 빈번하게 사용하는 것은 좋지 않다고 생각합니다. 이러한 구문이 많아 질수록 분석하기 어렵고 예외가 또 다른 예외를 발생시킬 수 있기 때문입니다.

  2. park 2020.02.15 12:00

    androidstudio 를 이용해서 app을 만들려고 하고 있는 초보자 인데요.

    StringBuffer를 String으로 형변환을 하려고 toString() 으로 했었는데, 이 때는 String으로 변환한 변수를 다른 메소드에서 접근하여 사용할 수가 없었습니다.

    하지만 String.valueOf() 로 변환하니까, 다른 메소드에서 이 변수로 접근이 되더라구요.

    그 이유를 혹시 아시나 해서 질문 드립니다.

    • 승우승 2020.02.20 09:00 신고

      안녕하세요 Stringbuffer는 toString을 상속받아서 String 객체에 담는다면 같을텐데...
      저는 따로 해보니까 인자로 잘 받아서요

      소스를 확인해보면 더 정확하게 말씀드릴수 있을거 같네요 ㅠㅠ

      도움이 못되드려 죄송합니다

+ Recent posts