[Java] Integer Caching과 '=='

haazz·2025년 1월 10일

Integer Caching이란?

Java에서 Integer 클래스는 기본형 int를 감싸는 wrapper 클래스입니다. 성능을 최적화하기 위해 Java는 -128부터 127 범위의 값을 미리 캐싱합니다. 이 범위 내의 값에 대해 Integer.valueOf() 메서드나 오토박싱(autoboxing)을 통해 객체를 생성할 때, 새로운 객체를 생성하지 않고 이미 캐싱된 객체를 재사용합니다.

예상치 못한 상황

개인적으로 알고리즘 문제를 풀면서 Integer 객체를 비교할 때 == 연산자를 사용했다가 혼란스러운 결과를 경험한 적이 있습니다. 테스트 케이스에 따라 올바른 결과와 잘못된 결과가 번갈아 나왔는데, 그 원인은 바로 Integer Caching에 있었습니다. 아래 코드를 통해 이를 확인할 수 있습니다.


public class Main {
    public static void main(String[] args) {
        Integer a = 128;
        Integer b = 128;
        System.out.println(a == b); // false

        a = 127;
        b = 127;
        System.out.println(a == b); // true
    }
}

Integer는 기본형 int와 달리 객체입니다. 따라서 == 연산자를 사용하면 값이 아닌 객체의 참조(reference)를 비교하게 됩니다. 이로 인해 범위 내의 값(-128부터 127까지)은 같은 객체를 참조하지만, 범위를 벗어난 값은 서로 다른 객체를 참조하게 됩니다.

  • 범위(-128 ~ 127) 내: a == b는 true (같은 객체 참조)
  • 범위 외: a == b는 false (서로 다른 객체 참조)

결론

따라서 안정성과 일관성을 위해 Integer 객체를 비교할 때는 항상 a.equals(b)를 사용하는 것을 권장 합니다.

profile
Developers who create benefit social values

0개의 댓글