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까지)은 같은 객체를 참조하지만, 범위를 벗어난 값은 서로 다른 객체를 참조하게 됩니다.
따라서 안정성과 일관성을 위해 Integer 객체를 비교할 때는 항상 a.equals(b)를 사용하는 것을 권장 합니다.