Backend/JAVA

[JAVA] Null/NaN/공백/문자열 처리

keepbang 2021. 5. 6. 22:44

다른 외부업체와 프로젝트를 하다 보면 외부업체로부터 받아오는 데이터가 null값인지 아닌지 알 수 없을 때가 있다. 물론 조율을 통해 해당 데이터는 값이 필수로 들어있다거나 null값이면 0이나 다른 문자로 대체해서 받아 올 수도 있지만 예상치 못하는 상황이 발생해서 에러가 발생할 수도 있기 때문에 항상 개발자는 null처리를 생각하고 개발을 해야 한다.

null은 공백도 아니고 0도 아닌 정의되지 않은 값이라고 할 수 있다.


1. null 및 공백 처리

먼저 매개변수로 들어오는 String 데이터가 null인지 비어있는 변수인지를 확인할 때에는 org.apache.commons.lang3.StringUtils 클래스를 사용한다.

StringUtils에는 대부분의 문자열 처리를 수행할 수 있는 매소드들이 존재한다.

그중에서 우리가 사용할 매소드는

isBlank, isEmpty, isNotBlank, isNotEmpty 이렇게 4개이다.

매소드들의 사용방법은 해당 매소드 설명을 보면 자세히 알 수 있다.

 

왼쪽 : isBlank/ 오른쪽 : isEmpty

 

 

두 개를 비교해보면 blank는 공백을 true, 즉 값이 없다고 판단하는 반면

empty는 공백을 false로 처리한다.

만약 공백도 null과 똑같이 처리하고 싶다면 blank를 사용하면 된다.

 

아래는 위 매소드와 반대인 매소드 설명이다.

왼쪽 : isNotBlank / 오른쪽 : isNotEmpty

상황에 따라서 매소드를 사용하면 된다.

 


2. 특정 값 비교

특정 값을 비교할 때는 아래처럼 하면 NullPointException을 예방할 수 있다.

if("A".equals(code)){
     .....
}else if("B".equals(code)){
     .....
}else{
     .....
}

3. HashMap으로 들어온 데이터

데이터를 받을 때 json으로 데이터를 받으면 java에서 HashMap으로 바꿔서 사용을 했었다.

이때 String으로 들어온 데이터는 String으로 형 변환해서 사용하면 된다.

 

여기까지는 문제가 없지만 이번 프로젝트를 하면서 String으로 들어온 데이터(lon, lat)를 Double로 받아야 할 때가 있었다.

 

이때 NaN이라는 문자열이 들어오면 Double로 형변환할 때 에러도 안나고 그대로 지나가서 연산을 할때 NaN으로 나오는 문제가 있었다.

 

그래서 아래와 같이 isNaN이라는 매소드를 사용해서 NaN일 때는 그냥 넘어가게 처리를 했다.

...
Double lon = Double.parseDouble(data.get("longitude").toString());
Double lat = Double.parseDouble(data.get("latitude").toString());

if(lon.isNaN() || lat.isNaN()) {
     continue;
}
...

isNaN매소드는 Double(대문자 주의) 클래스의 매소드이므로 형 변환을 할 때 Double로 해줘야 한다.

 


찾아보니까 JAVA 8에 Optional을 사용하여 Null 처리하는 방법을 많이 사용하는 것 같다.

지금 회사에서는 처음부터 StringUtils를 많이 사용해서 익숙해졌는데

나중에 시간이 된다면 JAVA 8의 Optional도 사용해보고 싶다!!