본문 바로가기
언어 & 라이브러리/자바

[자바] Long 타입 비교를 equals로 해야만 하는 이유

by illlilillil 2022. 9. 13.

멘토님께서 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로 동등성 비교를 하는 것이 좋다.

댓글