형변환 할 때마다 참 고민이다.
long -> int 형변환은 쉽게 java.lang.Math.toIntExtract(long value)
을 이용하면 된다지만,
그 외의 형변환을 할 때 <지금 내가 사용하는 게 정말 안전한 방법>인지 궁금해졌다.
어떻게 하면 더 안전하게 형변환 할 수 있을지 궁금해서 찾아본 안전하게 형변환하는 방법.
다른 예도 많지만 String에서 double로 형변환 하는 방법을 들어보겠다.
new Double(“1.23”) 와 같이 Double을 새로 만들어서 사용하는 건 Java 9부터 deprecated 되었다. 지양할 것.
자바에서 형변환을 도와주는 메서드는 크게 세 가지로 볼 수 있다. :
그런데 문제는, 이 세 방법 모두 Exception을 뱉어낸다.
NullPointerException
, NumberFormatException
NullPointerException
, NumberFormatException
NullPointerException
, ParseException
Optional과 Guava 라이브러리의 Doubles 사용해서 exception을 회피한다. 참고 출처 에서는 String to int 형변환을 말했지만, 어쨌든 Guava에 Doubles 있으니까 답변을 참고로, double 형변환 메서드를 찾음.
int foo = Optional.ofNullable(myString)
.map(Doubles::tryParse)
.orElse(0);
얘의 단점은 Optional이 비싸다는 것.
그리고 double로 변경할 수 없을 땐 바로 null을 뱉어버린다.(
Guava docs
)
그래서 orElse
로 기본값을 세팅해야 함.
1의 방법도 좋지만 좀 더 null-safe한 다른 방법이 있나 찾아봤더니,
NumberUtils라고 Util용 라이브러리를 사용하는 방법도 있다.
org.apache.commons.lang3.math.NumberUtils
의 메서드를 사용하면 된다.
찾아보니 여러가지 형변환을 도와주는 Util이다!! 엄청난 듯.
오늘의 예제는 String에서 double로 형변환 하는 거니까, 그 용례는 다음과 같다.
NumberUtils.toDouble(null) = 0.0d
NumberUtils.toDouble("") = 0.0d
NumberUtils.toDouble("1.5") = 1.5d
심지어 원하는 형태로 변환이 안되면 기본값 0으로 세팅해서 보내준다.
내가 원하는 기본값으로 세팅하고 싶을 땐?
오버로딩된 메서드(toDouble(String str, double defaultValue)
)를 사용하면 된다.
NumberUtils.toDouble(null, 1.1d) = 1.1d
NumberUtils.toDouble("", 1.1d) = 1.1d
NumberUtils.toDouble("1.5", 0.0d) = 1.5d
출처: apache docs
역시 구글링은 해도해도 끝이 없다..
어딘가 더 좋은 답안이 있을 것 같아서 구글링하는 시간이 줄지 않는다🤣