Java
Long, Integer Type 변수의 "=="(equal) 비교 사용시 주의점
nathon
2023. 5. 17. 15:25
java 에서는 premitive type, reference type이 존재한다.
- premitive type = int, boolean, long , double 등 실제 데이터를 저장하는 타입을 말하고 ,
- reference type 은 primitive type 이외에 reference (참조 주소)를 갖고 있는 것을 말한다.
대표적으로 Long, Integer 등 wrapper class와 같이 class 와 array, enum 등 주소값을 저장하고 참조하는 타입을 말한다.
배포 되어 운영되던 서비스 운영중에 이상한 일이 발생하였다.
테이블의 key값을 Long 타입으로 저장하여 구현된 소스였는데 그 값이 다른 키 값과 동일한지 체크를 할때 "=="(a==b) 로 할때 127번까 지는 문제가 없었는데 128 이상 부터는 값이 같지 않다는 것이다.
Long a = 13L;
Long b = 13L;
일 경우 a==b → true 이지만 이 값이 128이 넘어가면 false가 되는 것이다.
원인을 찾아보니 아래와 같았다.
이 이유는 JAVA에서 -128 ~ 127 범위의 정수 객체를 캐싱해놓기 때문이다.
(이 값들은 빈번하게 사용되기 때문에)
/** * Returns an {@code Integer} instance representing the specified
* {@code int} value. If a new {@code Integer} instance is not
* required, this method should generally be used in preference to
* the constructor {@link #Integer(int)}, as this method is likely
* to yield significantly better space and time performance by
* caching frequently requested values. *
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range. *
정리해보면 127까지는 미리 캐싱을 해두어서 == 으로 체크를 해도 메모리 주소가 동일하였기에 문제가 없었으나
128을 넘어가면서 새로운 주소에 데이터가 저장되면서 일치하지 않는 상황인 것이다.
** 해결법 : reference type의 wrapper class의 경우 '==' 이 아닌 .equals을 사용하여 값을 동일여부를 체크하도록 구현하면 이슈는 해결된다. ex) a.equals(b)로 해야한다.