멘토님께서 Long 타입은 == 비교를 하면 안되고 equals 비교를 해야 한다고 말씀하셨던 적이 있다.
왜 그런지 궁금해서 찾아보았다.
@Test
public void 숫자비교() {
Long num1 = 127L;
Long num2 = 127L;
Long num3 = 128L;
Long num4 = 128L;
assertThat(num1 == num2).isTrue();
assertThat(num3 == num4).isFalse();
}
Long 타입의 동일성 비교가 왜 128부터는 안되는지 궁금해 Long의 구현부를 들어가봤다.
내부적으로 -128 부터 127의 상수 값을 캐시해 동일성 비교를 하고, 상수 풀이 넘거나 적은 값이 들어왔을땐 새 객체를 만들어낸다.
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);
}
그렇기에 128 이상인 숫자들은 서로 다른 주소 값을 가져 동일성 비교에 실패하게 됨을 확인할 수 있었다.
127의 주소 값 - 캐시된 값이기 때문에 같은 주소 값을 가지고 있다.
128의 주소 값 - 새 객체를 생성하기 때문에 다른 주소 값을 할당받는다.
결론
-128 ~ 127의 동일성 비교는 할 수 있으나 실제로 이정도 범위의 숫자만 다루지 않기 때문에 웬만해선 equals로 동등성 비교를 하는 것이 좋다.
'언어 & 라이브러리 > 자바' 카테고리의 다른 글
[자바] 자바를 사용하는 이유 (0) | 2022.09.23 |
---|---|
[자바] 상속보다 합성을 사용해야 하는 이유 (0) | 2022.09.13 |
[자바] 병렬 처리 컬렉션 (0) | 2022.04.05 |
[자바] Double Brace Initialization (0) | 2022.04.05 |
자바 Optional이란 (1) | 2022.02.19 |
댓글