String.valueOf() 를 사용해야하는 이유

hanana·2023년 9월 8일
4
post-thumbnail

String.valueOf() 를 사용해야하는 이유


요약

어떤 값을 String으로 형 변환 할때 String.valueOf() 메소드를 사용해야 하는 이유는 다음과 같다.

1 null값에 대한 처리가 가능하다.

빈 값이 들어왔을때 예외를 던지는것이 아니라 "null"이라는 글자를 리턴해줌으로써 예상치 못한 NullPointer 에러를 사전에 예방할 수 있다.

2 숫자값에 대한 형변환이 자유롭다.

1이라는 값을 "1"로 만들고 싶을경우 (String) num 으로 형변환을 시도하면 ClassCastException을 던지는 반면, String.valueOf() 메소드는 의도대로 "1"을 반환해준다.

3 기본객체에 대한 형변환이 가능하다.

Wrapper 클래스인 Integer, Boolean과 같은 클래스 외에
기본객체인 int, double, boolean, char, 등을 모두 문자열로 변환이 가능하다.


자바에서 String으로 TypeCasting을 하는 방법은 여러가지가 있다.

그중에서 흔히 사용하는 (String), toString(), String.valueOf() 에 대해서 정리해보려고 한다.

일단 지금까지
(String)obj 은 사실상 써본적이 거의 없다.
obj.toStirng()도 객체의 필드값을 확인하거나, StringBuilder를 String으로 변환할때
외에는 사실상 거의 사용해본적이 없으며

강의에서도 String.valueOf(obj) 이라는 코드로 작성하고, 그냥 이게 best practice인가보다.. 하고 무의식중에 사용하고 있었는데
정확한 이유를 알고 사용하기 위해서

몇가지 테스트코드를 작성해보았다.


첫째로 가장 기본적인 테스트
예상대로 아무런 문제없이 출력된다.
벌써부터 인텔리제이가 노란줄로 바꾸라고 알려준다...()


두번째 테스트.
결과가 좀 재미있다.
기본타입인 int 의 경우 toStirng()이 컴파일에러를 발생시키는 반면
박싱된 타입인 Integer의 경우 toString()이 의도대로 동작한다.

해당부분이 궁금해서 찾아보니
Integer타입은 int 타입을 Wraping한 클래스로 클래스로서 toStirng()메소드를 호출 할 수 있다고 한다.

* 실제 Integer 클래스에는 toString 메소드가 정의되어 있다.


세번째 테스트.
본격적으로 이상한(?) 값을 넣기 시작해보려고 한다.


네번째, 다섯번째 테스트.
obj객체를 null로 초기화 시켜보고,
obj객체에 값을 할당하지 않아보았다.

* Object 클래스의 toString()은 null값이 들어왔을때 null이라는 문자값을 return 하는게 아니라, NullPointerException을 발생시키는 모양이다.

이쯤에서 궁금해진다.
String.valuef0f(obj) 코드는 어떻게 null을 처리하는걸까?
업로드중..
String.valueOf(Object obj)의 실제구현은 삼항연산자를 통해
인자가 null이면 "null"을 리턴해주고
obj.toString() 메소드를 호출해주는 모습이 보인다.

즉,

String.valueOf() 메소드가 특별해서 null 처리도 다 해주고, 다른타입의 값도 다 바꿔주는 그런 마법적인 메소드가 아니라

단순히 toString()메소드를 실행하기 전에 null값 체크만 해주는 아이였다는 사실을 깨닫는다.



마지막 테스트.

위쪽의 toString()과 String.valueOf() 메소드를 뜯어보니까 너무 자연스럽게 이해가 된다.

단순히 (String) obj와 같은 코드는 (아마...) 내부적으로 특별한 동작을 하는것이 없기때문에 리터럴값을 변환하는데 있어서 에러가 발생한 것으로 보인다.

obj.toString()메소드가 정상적으로 실행이 된다면 String.valueOf(obj)메소드가 실행이 안 될 이유가 없다.

profile
성숙해지려고 노력하지 않으면 성숙하기까지 매우 많은 시간이 걸린다.

0개의 댓글