Integer i=127, Integer j=127 일 때 sout(i==j) 하면 정답이 뭘까요?
라는 질문을 보게 되었습니다. 처음 보게 되었을때는 단순히 이 질문을 하신 이유는 당연히 예외적인 경우니 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 |
BigDecimal | 0~10 |
Character | 0~127 |
일단은 해당하는 범위만큼을 캐싱한다고 합니다. 그렇지만 Double, Float 같은 친구들에 대해서는 물론 캐싱을 하면 좋겠지만 숫자 사이들에 있어서 워낙 많은 소수들이 올 수 있으니 되어있지 않다고 말할 수 있을거 같습니다.
사실 저도 이 내용에 대해서 되게 찾아보면서 글로는 적혀있는 것 같지만 찾아보면 캐싱을 하는 코드는 보이지가 않았습니다. 그래서 위 stackOverFlow와 같은 궁금증이 생겼습니다.
그렇게 찾아본 결과
정수형 범위에서는 대부분 캐싱을 해주지만 실수형 범위기 때문에 너무 범위가 넓어서 캐싱을 지원하지 않는다고 할 수 있을거 같습니다.
저는 아직 이 답변을 보고도 아직 시원하지가 않아 여러분들중 혹시나 답을 알고 계신다면 알려주시면 감사하겠습니다...
오호....