자바(SE)

Integer 사용 시 주의점

  • -

Integer 사용 시 주의 점

JDK 1.5 버전부터 추가된 Wrapper 클래스에 대한 autobox과 unbox 기능은 프로그래밍에서 아주 유용하게 사용된다.

그러다 어느 시점이 되면 둘을 똑같이 받아들이고 사용하는 경향이 발생하는데 여기서 주의해야 할 점을 정리해둔다.

 

Wrapper는 객체다!!

흔한 상식으로 기본형의 동등 비교에는 ==을 사용하고 객체형의 비교에는 equals를 사용한다는 내용은 잘 아는 내용이다. 그런데 기본형의 wrapper를 사용하다 보면 이런 상식을 까먹고 하고싶은 대로 하는 경우가 왕왕 발생한다. 

아래 예를 살펴보자.

public class WrapperCareful {
    public static void main(String[] args) {
        for(int i=125; i<130; i++) {
            Integer i1 = i; // 기본형 --> Wrapper로 자동 형변황(autoboxing)
            Integer i2 = Integer.valueOf(i);
            System.out.println(i+" :" +(i1==i2) +" : "+i1.equals(i2));
        }
    }
}

125~130 사이의 범위에서 i 값을 Wrapper로 변경해서 ==, equals를 이용해서 동등 비교를 해보는 코드이다. 뻔하게 true가 나올 것 같지만.. 결과는 예상 밖이다.

125 :true : true
126 :true : true
127 :true : true
128 :false : true
129 :false : true

127까지는 true로 잘 떨어지지만 그 이상이 되면 == 연산의 결과는 동일하지 않다는 판단이 내려진다.

Integer 클래스의 소스를 살펴보면 IntegerCache라는 inner class가 존재하는데 거기에 보면 이유가 밝혀져 있다.

    /**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */

즉 -128~127까지는 cache를 이용해서 비교해준다고 한다. 그래서 128 부터는 == 은 동작하지 않았던 것이다.

다시 한번 기본으로 돌아가자!! 기본형 비교는 ==, 객체형 비교는 equals.. Wrapper 타입은 기본형이 아니다. 객체형이다.

더 많은 캐싱을 위해서는

더 많은 범위에서 캐싱을 하고 싶다면 위 주석대로 AutoBoxCacheMax의 값을 VM 옵션에 주면 된다.

 

 

'자바(SE)' 카테고리의 다른 글

Comparator의 default method chaining  (0) 2020.08.13
List에서의 자료 삭제  (0) 2020.08.11
[자료구조]Queue - add vs offer  (0) 2019.12.22
자바 trim() 메서드 버그?  (0) 2019.08.13
ObjectInputStream 생성 시 주의점  (0) 2019.08.07
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.