Language/Java

[주말 스터디]toString과 valueOf 차이

JUNGKEUNG 2021. 11. 6. 16:30
반응형

두 메소드 모두 Object의 값을 String으로 변환하지만 변경하고자 하는Object가 null인 경우 다르다.

toString()과 같은 경우 Null PointerException(NPE)을 발생시키지만 valueOf는 "null"이라는 문자열로 처리한다.

즉 비교해서 정리하자면

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

toString

메서드는 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드

indexOf

indexOf() 는 특정 문자나 문자열이 앞에서부터 처음 발견되는 인덱스를 반환하며

만약 찾지 못했을 경우 "-1"을 반환합니다.

 

 

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"

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

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

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

public class StringCasting {
public static void main(String[] args) {
	// TODO Auto-generated method stub
	int value = 100;
	String strValue = String.valueOf(value); // int 를 String으로 변환한다.

	int value2 = 100;
	String strValue2 = value2 + ""; // int를 String으로 변환하는 또 다른방법

	System.out.println(strValue);
	System.out.println(strValue2);
}
}

예제)

public class OCR {

	public static void main(String[] args) {
		//String KOR_NUMBER = "159마6183";
		String KOR_NUMBER = "59마6183";
		String ENG_NUMBER = "159A6183";
		//-------------------
		int kor_number_point = 0;
		kor_number_point = KOR_NUMBER.indexOf("마");  //마가 어디에있는지
		String a = KOR_NUMBER.substring(0,kor_number_point);
		String HOD_NUMBER = KOR_NUMBER.substring(kor_number_point, kor_number_point +1);
		String HOD2_NUMBER = KOR_NUMBER.substring(kor_number_point+1,KOR_NUMBER.length());
		//-------------------------------
		
		kor_number_point = KOR_NUMBER.lastIndexOf("마"); //마지막에 마가 어디있는지
		substring은 앞자리부터 뒷자리 앞까지 짤라서 나온다.
	    String HOD_NUMBER = KOR_NUMBER.substring(0,2); //15가 나온다
		
		String HOD_NUMBER = KOR_NUMBER.substring(0,3); //159가 나온다
		String HOD2_NUMBER = KOR_NUMBER.substring(3,4); //마가 나온다
		String end_number = KOR_NUMBER.substring(4); // 4번쨰 부터 마지막까지 나온다.
		String a = KOR_NUMBER.substring(KOR_NUMBER.length()-4); // 뒤에서 4자리만 가져오게 한다.
	
		String a = "";
		String end_number = "";
		String HOD_NUMBER = "";
		String HOD2_NUMBER = "";
		
		if(KOR_NUMBER.length() == 7) {
			HOD_NUMBER = KOR_NUMBER.substring(0,2); //159가 나온다
			HOD2_NUMBER = KOR_NUMBER.substring(2,3); //마가 나온다
			end_number = KOR_NUMBER.substring(3); // 4번쨰 부터 마지막까지 나온다.
		} else if(KOR_NUMBER.length() == 8) {
			HOD_NUMBER = KOR_NUMBER.substring(0,3); //159가 나온다
			HOD2_NUMBER = KOR_NUMBER.substring(3,4); //마가 나온다
			end_number = KOR_NUMBER.substring(4); // 4번쨰 부터 마지막까지 나온다.
		}
		
		
		
		//-----------------------------------------------------------------------------
		System.out.println("kor_number_point: "+ kor_number_point);
		
		System.out.println("a: "+ a);
		System.out.println("HOD_NUMBER: "+ HOD_NUMBER);
		System.out.println("HOD2_NUMBER: "+ HOD2_NUMBER);
		
		System.out.println("a: "+ a);
		System.err.println();
		System.out.println("KOR_NUMBER.length: "+ KOR_NUMBER.length());
		System.out.println("substring: "+ HOD_NUMBER);
		System.out.println("substring2: "+ HOD2_NUMBER);
		System.out.println("end_number: "+ end_number);
		System.out.println("한국어번호판: "+KOR_NUMBER);
		System.out.println("영문번호판: "+ ENG_NUMBER);
		

	}

}

'Language > Java' 카테고리의 다른 글

생성자  (0) 2021.11.27
Java String Pool  (0) 2021.11.20
직렬화 역직렬화  (0) 2021.11.01
List, Set, Map  (0) 2021.10.10
StringBuffer클래스  (0) 2021.10.03