Long 동일성 비교

Long 동일성 비교

Wrapper동일성 비교(==)가 된다?

 

지인이 Long 끼리 == 연산을 했더니 이상한 결과가 나오더라는 경험담을 전했다

하지만 나는 평소에 Wrapper로 == 연산을 해볼 생각 자체를 안했었다. 당연히 안될 줄 알아서.

그래서 그 이야기를 듣고 호기심이 생겨서 직접 파봤다

 

Long num1 = 127;
Long num2 = 127;

System.out.println(num1 == num2); // true

Long num3 = 128;
Long num4 = 128;

System.out.println(num3 == num4); // false

 

놀랍게도 Object끼리 == 연산이 된다는 것도 신기한데 128부터 안된다는 게 더 신기했다

바로 Long 구현부를 뜯어보니 Long 클래스는 내부적으로 -128~127의 상수 값을 캐시 하여

이 값으로 == 비교를 수행하고, 이 상수풀을 넘어가는 값이 들어올 경우

valueOf()를 호출해 새로운 Object를 만들어냄을 확인했다.

 

public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
    }
    return new Long(l);	
}

 

따라서 이 상수풀을 넘어가는 Long 타입의 값을 비교하려면 다른 방법을 사용해야 한다

  • 정석대로 Object끼리의 값 비교인 equlas()를 사용한다

  • Wrapper`를 언박싱하여 처리하고 다시 박싱한다

  • Java5 이후로 가능해진 오토박싱, 오토언박싱`을 사용한다

 


© 2022. All rights reserved.