경주란 빨리 달리는 사람들의 것이 아니라
       계속 뛰어가는 사람들의 것이다.
LinkTree🌲

Algorithm

[Java] Integer caching, == 연산

컴공희 2024. 10. 1. 02:37

자바에서 Integer는 자료형 중에서 참조형으로 객체의 주소를 저장한다.

 

고로, 같은 값이 이라도 주소값이 다르니 다른 객체라고 기대할 수 있다.

따라서, 참조형 객체에서 해당 이 같은지 확인하기 위해서는 == 이 아닌 Eqauls로 확인해야한다.

 

 

 

문제

그렇다면 아래 값은 어떤 결과 나올까?

Integer a = 1;
Integer b = 1;

System.out.println(a == b);

다른 값 주소값으로 메모리에 저장되어 있을 테니 다른 객체라고 생각할 수 있을 것이다. 

정답은 True 이다. 

 

 

 

Integer Caching

이 부분을 간과해서 알고리즘 문제에서 오랜시간을 낭비했는데, 

 

 

 

In Java 5, a new feature was introduced to save the memory and improve performance for Integer type objects handling. Integer objects are cached internally and reused via the same referenced objects. - This is applicable for Integer values in the range between –128 to +127. - This Integer caching works only on auto-boxing. - Integer objects will not be cached when they are built using the constructor.



Java 5부터, 메모리를 효율적으로 관리하기 위해서 -128 ~ 127 범위에 정수 값은  Caching해서 사용한다고 한다.

 

String도 이와 같은 Caching 기능이 제공된다.

 

Integer도 적용되는 지 몰랐다..

Integer a = 10000;
Integer b = 10000;

System.out.println(a == b);

따라서, 위에 값은 False 이다.

 

그래서, 객체를 비교할 때는 Eqauls를 사용해서 부작용 최대한 막는 것이 안전한 코드라고 할 수 있겠다.

 

 

 

ETC.

사건 발단

op[i]--;
Integer oper = i;
selectOp.add(oper);
dfs(depth + 1);
selectOp.remove(oper); 
op[i]++;

백트래킹으로 선택된 것 그대로 삭제하려고 일부로 Integer로 박싱해서 List에 넣었는데, 위와 같은 부작용이 생겼다.

happy ending