[Java] 127과 128의 차이 (feat. IntegerCache)

toto9602·2024년 11월 2일

참고 자료

[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 IntegerCache

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는 서로 다른 모습을 볼 수 있었습니다!

이따금 재밌는 질문을 가져와 주시는 동료분께 감사하며ㅎㅎ (_ _)

profile
주니어 백엔드 개발자입니다! 조용한 시간에 읽고 쓰는 것을 좋아합니다 :)

0개의 댓글