[Java] IntegerCache: Integer 객체에서 캐싱을 제공한다고?
자바 Integer 비교시 알아야 할 것
Java Integer Cache
객체의 주소값 비교 메소드 System.identityHashCode Object.hashCode
어느 날엔가, 옆자리에 계신 회사 동료분께 신기한 질문을 들은 적이 있었습니다!
"아래 두 코드 결과값이 어떻게 나올 것 같으신가요?"
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
Integer a = 128;
Integer b = 128;
System.out.println(a == b);
질문을 들었을 당시에는, '숫자 빼고 다른 게 없는데..?' 싶었고
질문의 의도를 파악하지 못해서..ㅎㅎ
"저렇게 비교하면 주소값 비교라 둘 다 false가 나오지 않나요..?"라고 대답을 했었는데..
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true
Integer a = 128;
Integer b = 128;
System.out.println(a == b); // false
→ 이렇게 127은 true가, 128은 false가 나온다고..!
Java는 Integer 객체에 대해 Integer Cache 기능을 제공한다!
→ 정수 리터럴을 변수에 배정할 때, 기존에 만든 Int 객체 중 동일한 값이 있다면 미리 만들어 둔 객체를 참조하는 것!
하지만, 테스트해 본 것처럼 모든 정수값에 대해 제공되는 기능이 아님!
Implemenation 코드를 보면, -128 ~ 127까지 범위의 숫자에 대해 제공됩니다!
그래서, 앞의 코드에서 각 객체의 identityHashCode를 찍어 보면..
Integer a = 127;
Integer b = 127;
System.out.println(System.identityHashCode(a)); // 2075495587
System.out.println(System.identityHashCode(b)); // 2075495587
Integer a = 128;
Integer b = 128;
System.out.println(System.identityHashCode(c)); // 436546048
System.out.println(System.identityHashCode(d)); // 1627428162
a와 b는 같지만, c와 d는 서로 다른 모습을 볼 수 있었습니다!
이따금 재밌는 질문을 가져와 주시는 동료분께 감사하며ㅎㅎ (_ _)