Long 동일성 비교
in BackEnd / Java
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
이후로 가능해진
오토박싱,
오토언박싱`을 사용한다