Long 타입 값 비교를 하다 보면 true를 제대로 반환할 때도 있고 false를 반환하는 경우도 만난다.
이유
Java는 -128 ~ 127 범위의 Long , Integer 객체는 내부적으로 캐싱하여 동일한 객체로 취급 하기 때문에 == 비교를 해도 true가 나온다.
// -128 ~ 127 은 == 로 비교가능
Long a = 127L;
Long b = 127L;
Long _a = -128L;
Long _b = -128L;
boolean resultA = a == b;
boolean resultB = _a == _b;
System.out.println("a == b = " + resultA); // a == b = true
System.out.println("_a == _b = " + resultB); // _a == _b = true
주의할점
범위를 벗어난 Wrapper Type 값을 == 비교를 한다면 false 가 나온다. 당연하게도 값이 같지만 다른 주소값을 참조하고 있는 객체이기 때문이다.
// -128 ~ 127 를 벗어난 수 == 비교
Long c = 128L;
Long d = 128L;
Long _c = -129L;
Long _d = -129L;
boolean resultC = c == d;
boolean resultD = _c == _d;
System.out.println("c == d = " + resultC); // c == d = false
System.out.println("_c == _d = " + resultD); // _c == _d = false
결론
Wrapper Type 의 값은 equals()를 사용해 비교하면 오류를 방지할 수 있다.
// -128 ~ 127 이 아닌 수는 .equals()를 사용하자
Long c = 128L;
Long d = 128L;
Long _c = -129L;
Long _d = -129L;
boolean resultE = c.equals(d);
boolean resultF = _c.equals(_d);
System.out.println("c.equals(d) = " + resultE); // c.equals(d) = true
System.out.println("_c.equals(_d) = " + resultF); // _c.equals(_d) = true
추가
eqauls() 비교를 값을 직접 넣어 할 때 뒤에 L을 빠뜨리지 않도록 주의
Long a = 200L;
boolean resultA = a.equals(200);
boolean resultB = a.equals(200L);
System.out.println("a.equals(200) = " + resultA); // a.equals(200) = false
System.out.println("a.equals(200L) = " + resultB); // a.equals(200) = true