CS

CS 스터디 (Java) 9 - IntegerCache 에 대해 설명해주세요.

gentle-tiger 2025. 5. 15. 16:43

IntegerCache는 Java에서 java.lang.Integer 클래스 내부에서 사용하는 캐시 메커니즘으로, 자주 사용되는 int 값들을 미리 래핑한 Integer 객체로 캐싱하여 불필요한 객체 생성을 방지하고 성능을 최적화할 수 있습니다. 

IntegerCache 오토박싱(Autoboxing) 및 Integer.valueOf(int) 메서드 호출 시 동등한 Integer 객체를 재사용하는 데 사용됩니다. 

 

1. 캐시의 동작 방식 

- Java는 기본형(int)과 참조형(Integer) 간의 변환을 자동으로 처리할 수 있습니다. 

- 이 과정에서 int를 Integer로 변환하는 경우, new Integer(int)를 사용하지 않고, Integer.valueOf(int) 메서드가 호출됩니다. 

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true

Integer c = 1000;
Integer d = 1000;
System.out.println(c == d); // false

- 위의 예시에서 a == b 는 true를 반환하지만, c == d는 false를 반환합니다. 

- 그 이유는 100은 캐시 범위에 포함되지만, 1000은 캐시 범위를 벗어나 새로운 객체가 생성되기 때문입니다. 

 

 

2. 캐시 범위 

- Java는 -128부터 127까지의 정수값을 캐싱합니다. 

- 이는 JVM 내부의 IntegerCache 클래스에 다음과 같이 정의되어 있기 때문입니다. 

 

3. Integer.valueOf(int) 구현 

- 이 메서드는 주어진 정수가 캐시 범위 안에 있다면, 캐시된 객체를 반환하고, 그렇지 않으면 새롭게 Integer 객체를 생성합니다. 

 

 

 

4. 캐시 범위는 왜 -128부터 127인가? 

- 자바 언어 명세(JLS 5.1.7)는 -128 ~ 127 범위의 정수는 반드시 캐시되어야 함을 정의하고 있습니다. 

- 이는 byte 타입과 동일한 범위이며, 자주 사용되는 값이기 때문에 JVM은 이 범위의 객체를 미리 생성해 두는 것입니다. 

 

 

 

 

5. 오토박싱 시 객체 비교의 주의점

- IntegerCache는 값이 같다고 해서 항상 같은 객체를 반환하는 것이 아닙니다. 

- 캐시 범위를 벗어난 정수는 새롭게 객체로 생성되므로, == 비교는 신뢰할 수 없습니다.

- 따라서 값 비교에는 항상 .equals()를 사용해야 합니다. 

Integer x = 100;
Integer y = 100;
System.out.println(x == y);       // true (캐시된 객체)

Integer a = 1000;
Integer b = 1000;
System.out.println(a == b);       // false (새로운 객체)
System.out.println(a.equals(b));  // true  (값은 같음)

 

 

 

결론 

IntegerCache는 자주 사용하는 int 값을 캐싱해 Integer.valueOf() 호출 시 같은 객체를 재사용하여 성능을 최적화하는 구조입니다.