Integer i=127, Integer j = 127 라고 한다면 i==j는 뭘까요?

khyojun·2024년 2월 16일
2

여러가지궁금증

목록 보기
1/1
post-thumbnail

어느날 보게 된 질문

Integer i=127, Integer j=127 일 때 sout(i==j) 하면 정답이 뭘까요?

라는 질문을 보게 되었습니다. 처음 보게 되었을때는 단순히 이 질문을 하신 이유는 당연히 예외적인 경우니 true이지 않을까? 하고 생각했었습니다.

진짜 True다..

그래서 해당 질문에 대한 답변을 해보고자 한 번 조사해보고 글을 작성해보기로 하였습니다.

우선 오토박싱..

 Integer i = 127;
 Integer j = 127;
 System.out.println(i == j);

우선 해당하는 친구에 대한 빨간약을 먹을 시간입니다.

뭔가 들어봤을법한 오토박싱(Autoboxing)의 개념을 여기서 사용해볼 차례인 거 같습니다.

위 친구에 대하여 컴파일러는 사실 아래와 같이 해석합니다.

 Integer i = Integer.valueOf(127);
 Integer j = Integer.valueOf(127);
 System.out.println(i == j);

그러면 생각이 든 것은 Integer.valueOf를 조사해보면 되겠구나... 라고 생각하였습니다.

그래서 들어가보니..

이런.. 뭔가 작업을 하고 있었습니다. Cache라는 단어를 보고 뭔가 캐싱을 하고 있구나 하고 보니 IntegerCache.low, IntegerCache.high 라는 범위안에 있으면 같은 친구를 내보내는구나 라는 것을 알 수 있었습니다.

그리고 설명에도 친절하게 -128~127 사이의 값은 캐싱이 된다~ 라고 말해주고 있습니다.

그러면 다른 친구들은??

Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes.
출처 : 오라클 자바 문서

이렇게 나와있으면 다른 친구들..??

흠... 다른 친구들도 다 까보겠습니다.

까봤습니다..

타입캐싱 범위
Integer-128~127
Byte-128~127
Long-128~127
Short-128~127
BigDecimal0~10
Character0~127

일단은 해당하는 범위만큼을 캐싱한다고 합니다. 그렇지만 Double, Float 같은 친구들에 대해서는 물론 캐싱을 하면 좋겠지만 숫자 사이들에 있어서 워낙 많은 소수들이 올 수 있으니 되어있지 않다고 말할 수 있을거 같습니다.

Double,Float 은 섭섭하다.

사실 저도 이 내용에 대해서 되게 찾아보면서 글로는 적혀있는 것 같지만 찾아보면 캐싱을 하는 코드는 보이지가 않았습니다. 그래서 위 stackOverFlow와 같은 궁금증이 생겼습니다.

그렇게 찾아본 결과

정수형 범위에서는 대부분 캐싱을 해주지만 실수형 범위기 때문에 너무 범위가 넓어서 캐싱을 지원하지 않는다고 할 수 있을거 같습니다.

저는 아직 이 답변을 보고도 아직 시원하지가 않아 여러분들중 혹시나 답을 알고 계신다면 알려주시면 감사하겠습니다...

결론 : Integer i=127, Integer j = 127 라고 한다면 i==j는 뭘까요?

True입니다.

출처

profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

1개의 댓글

comment-user-thumbnail
2024년 2월 18일

오호....

답글 달기