본문 바로가기

개발공부

[ Java ] Boxed Type 비교

Boxed Type 비교는 무엇으로?

사이드 프로젝트할 때 Boxed Type(Integer, Long) 비교에 대해 선배 개발자 분에게 질문을 했다. 현재 작업에서 ==equals 비교 모두  내가 원하는 결과값(True, False)을 주고 있는 상황이었지만 Boxed Type은 Object였기에 equals을 사용해야할 것 같았기 때문이다.

== 비교가 True가 나왔던 이유

Boxed Type의 경우 Object이기에 == 비교는 주소값의 동일 유무를 따진다. 하지만 Integer 내부에서는 -128 ~ 127의 값은 Cache를 해뒀다가 해당 값이 들어올 경우 저장해둔 Integer 객체를 반환해준다. 그러기에 -128 ~ 127 사이의 값을 사용할 경우 같의 값의 경우 같은 객체를 가져 == 비교는 True가 나오게 된다. 프로젝트에서 저 비교가 100이하에 값들만 사용되는 곳에 쓰였기 때문에 문제가 없어보였던 것이다.

equals을 사용하자

Boxed Type(Integer, Long)의 실제 값의 비교를 위해서는  == 를 사용하는 것은 좋지 않다. Cache 범위 밖의 값을 만날 경우 문제가 생기기 때문이다. 아래 코드(Java Integer equals)와 같이 실제 값을 비교해주는 equals를 사용하는 것이 좋다. 

 

// Java Integer 클래스 내부 equals 코드
public boolean equals(Object obj) {
   if (obj instanceof Integer) {    
       return value == ((Integer)obj).intValue();
    }
    return false;
}