[Java] Why - Integer 캐싱 동작 원리

하쮸·2024년 8월 26일

Error, Why, What, How

목록 보기
3/65

Integer

public static void main(String[] args) {
	Integer i = 100;
    Integer i2 = 100;

    System.out.println("i == i2 ? " + (i == i2));
}

해당 출력 결과는 당연히 false가 나올 줄 알았다.

왜냐하면 '==' 연산자는 객체의 값을 비교하는 것이 아니라 메모리 주소(참조)를 비교하니깐.

근데 true가 나왔음.

또 신기한 점은

public static void main(String[] args) {
	Integer i = 1000;
    Integer i2 = 1000;

    System.out.println("i == i2 ? " + (i == i2));
}

이렇게 하면 false가 나온 다는 점.
(ㅇㅅㅇ)....??

뭐지...? 싶어서 찾아보니깐
Integer 캐싱 때문이라고 함.


Integer 캐싱 동작 원리

  • Java에서는 -128에서 127 사이의 int 값을 Integer 객체로 변환할 때, 새로운 객체를 생성하지 않고 미리 캐싱된 객체를 반환한다.
  • 따라서 이 범위 내의 Integer 객체는 같은 객체를 참조하게 됨.
Integer i = 100;
Integer i2 = 100;

System.out.println("i == i2 ? " + (i == i2)); // true 출력
  • i와 i2는 모두 100이라는 값을 가지는데 이 값이 -128에서 127 사이에 있으므로 두 변수가 동일한 Integer 객체를 참조하게 된다.
  • 그래서 == 연산을 할 때 두 객체의 참조가 동일하므로 true가 출력되는 거임.
    • -128에서 127 범위를 벗어나는 경우에는 새로운 Integer 객체가 생성되므로
      '==' 연산의 결과가 false가 될 수 있음.
Integer i3 = 128;
Integer i4 = 128;

System.out.println("i3 == i4 ? " + (i3 == i4)); // false 출력
  • 이 경우 i3와 i4는 각각 다른 객체를 참조하게 되어 == 연산 결과가 false가 된다.

당연한 말이지만 값을 비교하려면 equals() 메서드를 사용하는 것이 더 안전.

profile
Every cloud has a silver lining.ㅤㅤㅤㅤㅤㅤㅤㅤㅤhttps://www.instagram.com/ha_jju

0개의 댓글