무엇과의 박스형 비교?
사이드 프로젝트를 진행하고 있을 때 수석 개발자에게 Boxed Type(Integer, Long) 비교에 대해 물었습니다.
진행중인 작업에서 == 수업 심지어 원하는 모든 결과 비교(허위 사실)하지만 boxed type이 Object였기 때문에 equals를 사용해야 할 것 같았습니다.
== 비교가 참이 된 이유
boxed type은 객체이므로 == 비교는 주소 값이 같은지 여부를 결정합니다.
그러나 정수 내에서 -128에서 127 사이의 값이 캐시되고 적절한 값이 수신되면 저장된 Integer 객체가 반환됩니다.
그래서 -128에서 127 사이의 값을 사용하면 같은 값에 대해 같은 객체를 얻고 == 비교는 True를 반환합니다.
프로젝트는 100 미만의 값만 사용하는 이 비교를 사용했기 때문에 문제가 없는 것 같습니다.
바로 사용하자
boxed type(integer, long)의 실제 값을 비교하기 위해 ==를 사용하는 것은 권장하지 않습니다.
캐시 범위를 벗어난 값이 발견되면 문제가 발생하기 때문입니다.
다음 코드(Java Integer equals)와 같이 실제 값을 비교하는 equals를 사용하는 것이 좋습니다.
// Java Integer 클래스 내부 equals 코드
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}