본문 바로가기

프로그래밍/JAVA

JAVA에서 NULL 체크 어떻게 하고 계시나요?

다들 널 체크 어떻게 하고 계시나요?

param ==null || 뒤에

두번째 조건문에서 param.equals("") 를 쓰시거나 param.length()==0 를 쓰시거나 param.isEmpty() 를 쓰시곤 하실텐데요.

 

 

String.length() 메소드

-----------------------------------------

 public int length()

 {

     return count;

 }

-----------------------------------------

 

String.equals() 메소드

--------------------------------------------

    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;

    }

-----------------------------------------

 

 

요즘 컴퓨터 성능이 너무 좋아서 시간이 많이 차이나진 않지만 과연 어떤게 좀 더 효율적인 코드인지 벤치마킹 해보았습니다.

 

 

public class BenchmarkNullCheck {

 public static void main(String[] args) {
  
  String checkText = "";
  
        int loopCount = 99999999;
       
        long startTime, endTime, elapsedTime1, elapsedTime2 , elapsedTime3;
       
        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
         if (checkText == null || checkText.equals(""))
         {
         }
        }
        endTime = System.nanoTime();
        elapsedTime1 = endTime - startTime;
        System.out.println(".equals(\"\") 경과시간\t" +": " + elapsedTime1);

        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
         if (checkText == null || checkText.isEmpty())
         {
         }
        }
        endTime = System.nanoTime();
        elapsedTime2 = endTime - startTime;
        System.out.println(".isEmpty() 경과시간\t"+": " + elapsedTime2);

       
        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
         if (checkText == null || checkText.length()==0)
         {
         }
        }
       
        endTime = System.nanoTime();
        elapsedTime3 = endTime - startTime;
        System.out.println(".length() 경과시간\t"+": " + elapsedTime3);

       
 }
}

 

 

간혹 아래와 같이 isEmpty()가  length() 보다 빠를때도 있었지만

출력 경과시간

.equals("") 경과시간 : 5955514
.isEmpty() 경과시간 : 3170202
.length() 경과시간 : 3177900

 

대체로 출력 경과시간은 아래와 같이

.equals("") 경과시간 : 4461290
.isEmpty() 경과시간 : 2891371
.length() 경과시간 : 2574479


 

length()가 1순위 그다음에 isEmpty()가 2순위 equals 3순위로 결과가 나왔습니다.

 

isEmpty() 메소드는 Java 6+ 환경에서만 가능하고 속도도 length()가 빠르니

 

따라서 널 체크는 다음과 같이 하는게 어떨까요 ?

 

if (param == null || param.length() == 0) {

    //빈 값

} else { 

    // 값 존재

}