[Java] Wrapper 클래스를 비교 연산자 '=='로 비교하면 안 되는 이유
by eelseungmin배경
코드를 작성하던 중 SonarLint가 노란 줄을 표시했다.
String이나 Boxed type(Wrapper 클래스)의 경우 equals() 메서드로 비교하라는 조언이다.
비교 연산자의 경우 원시 타입은 값을 비교하지만, 객체는 참조 주소를 비교해서 같은 객체인지 확인한다.
String은 equals()를 이용해 비교하고 있음에도 불구하고 Long이나 Integer 같은 숫자형 Wrapper 클래스는 조금 다르게 생각하고 있었던 것 같다.
이유
날 혼란스럽게 만든 것은 다음과 같은 예시이다.
Long val1 = 127L;
Long val2 = 127L;
System.out.println(val1 == val2); // true
Long val3 = 128L;
Long val4 = 128L;
System.out.println(val1 == val2); // false
위에서 전자와 같은 케이스 때문에 "숫자형 Wrapper 클래스의 경우 비교 연산자로 비교해도 되지 않을까?" 생각할 수 있다.
Oracle의 공식 문서에 따르면 내부적으로 오토박싱이 이루어질 때 r1, r2가 -128 ~ 127에 해당하는 값이라면 둘 사이의 값 자체를 비교한 것과 같은 결과(r1 == r2)인 true와 false를 출력한다고 한다.
그렇다면 후자의 경우 그 범위를 벗어나는 값이기 때문에 객체끼리 비교하는 경우와 동일하게 동작한 것이라고 생각할 수 있다.
이제부턴 Long과 Integer를 포함한 Wrapper 클래스도 equals() 메서드로 비교하는 습관을 들여야겠다.
참조
https://www.baeldung.com/java-compare-long-values
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7
블로그의 정보
eel.log
eelseungmin