자바에서 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에 넣었는데, 위와 같은 부작용이 생겼다.

'Algorithm' 카테고리의 다른 글
| [BOJ/Java] 6064. 카잉 달력 (2) | 2024.05.02 |
|---|---|
| [LCA/java] BOJ 11438. LCA 2 (0) | 2024.01.28 |
| [BOJ/Java] 11725. 트리의 부모 찾기 (0) | 2024.01.25 |
| [플로이드 워셜] 인접 행렬 초기화 할때, Integer.MAX_VALUE 사용하지 않는 이유 (1) | 2024.01.22 |
| [다익스트라] 다익스트라 방문 검사가 필요한 이유 (1) | 2024.01.19 |