본문 바로가기

Develop/JAVA & Spring

Java - Null Check 및 String 비교

============================ Java Programming Tip ① ==============================

객체의 메소드를 사용할 때 반드시 객체가 null 인지 여부를 먼저 체크해야 합니다.

// 1. bad
if (param.equals("cust_id")) {}

// 2. good
if (param != null && param.equals("cust_id")) {}

// 3. good, too
if ("cust_id".equals(param)) {}

1번의 경우 param 이 null 이면 NullPointException이 발생합니다.
NullPointException을 handling하지 않은경우 WAS에서 제대로 처리하지 못해
메모리 누수 및 WAS 장애의 원인(!)이 됩니다.
물론 param이 null이라면,
2번의 경우가 "cust_id"라는 스트링을 생성하지 않으므로 가장 좋다고 할 수 있습니다.
3번의 경우는 2번 대신 코딩 편의를 위해서 쓴다고 할 수 있죠.

자바에서 가장 흔하게 사용되는 객체인 String을 예로 들었습니다만,
다른 객체들도 마찬가지입니다.
NullPointException을 없애고, 불필요한 객체 생성을 줄이면
WAS의 메모리 사용량과 메모리 누수를 상당부분 줄일 수 있습니다.

============================ Java Programming Tip ② ==============================

java에서 String에 값이 들어있는지를 체크하기 위해
다음과 같이 체크하는 경우가 있습니다.

if (param != null && param.equals("")) {
// 값이 있는 경우 처리
} else {
// 값이 없는 경우 처리
}

이 경우 다음과 같이 사용하는 것이 좋습니다.
if (param != null && param.length() != 0) {
// 값이 있는 경우 처리
} else {
// 값이 없는 경우 처리
}
또는
if (param == null || param.length() == 0) {
// 값이 없는 경우 처리
} else {
// 값이 있는 경우 처리
}

equals("")를 사용하면 불필요하게 새로운 스트링인 ""를 생성하게 되고
함수 내부에서 몇 번의 비교후에 다른 스트링으로 형변환 및 치환도 합니다.
반면 length() 함수는 내장객체인 int 변수 하나만 리턴하면 되므로 빠릅니다.
아래 String.equals() 함수와 String.length() 함수 소스를 확인해보세요.
-----------------------------------------
public int length()
{
return count;
}
-----------------------------------------
public boolean equals(O bject obj)
{
if(this == obj)
return true;
if(obj instanceof String)
{
String s = (String)obj;
int i = count;
if(i == s.count)
{
char ac[] = value;
char ac1[] = s.value;
int j = offset;
int k = s.offset;
while(i-- != 0)
if(ac[j++] != ac1[k++])
return false;
return true;
}
}
return false;
}
-----------------------------------------