회사 프로젝트에서 DB 정보를 담는 모델에서 정수형 타입을 long, int가 아닌 Long, Integer로 쓴다.
그 이유는 메모리를 좀더 많이 먹긴하지만 null check가 가능하므로 좀 더 디버깅이 수월하고 관리가 용이하기 때문이 아닌가 생각한다.
이 wrapper class를 이용하여 비교연산시 잘되다가 어느 순간 (코드의 변경이 없었다) 이슈가 발생했다.
예를 들어 두개의 모델 Test1, Test2가 있으면 두개의 모델의 srl(시퀀스 넘버)를 비교하는 코드를
if (test1.getSrl() == test2.getSrl()) {
...
}
이런 식으로 했는데 원래는 Long, Integer가 원시타입이 아니기 때문에 저런식 ( ==, !=) 의 연산이 불가능하지만
작동이 되었었다.
하지만 어느 순간 작동이 제대로 안되었고 코드도 변경이 없었는데 왜 갑자기 안되지 라고 의문이 들었는데
원인은 int형 wrapper class의 경우 -128 ~ 127 의 숫자에 한해서는 자동으로 ==, != 등의 원시타입에서만 가능한 연산을 정상 수행해준다.
하지만 숫자가 128이 넘어가 버리면 .equals()로 비교하거나 .longValue(), . intValue()등의 메서드를 이용해서 원시타입으로 변경해서 연산을 수행해야 정상적으로 동작한다.
다음은 Long 클래스의 valueOf 메서드 내용이다.
public static Long valueOf(long paramLong)
{
if ((paramLong >= -128L) && (paramLong <= 127L)) {
return LongCache.cache[((int)paramLong + 128)];
}
return new Long(paramLong);
}
코드를 보면 -128 ~ 127 범위의 정수값은 LongCache에서 값을 원시타입으로 가져오고 그 이외에는 Long 객체 타입으로 가져온다.