[JAVA] Cache 그리고 Equals 헷갈리는 Integer와 int에 대하여
반응형
1. Cache
Java의 Integer 클래스는 Integer.valueOf(int i) 메서드를 사용할 때 특정 범위의 값을 캐싱합니다. 이 범위는 기본적으로 -128에서 127까지입니다. 이 범위 내의 값들은 새로운 객체를 생성하지 않고 미리 캐시된 객체를 반환합니다.
public class IntegerCacheExample {
public static void main(String[] args) {
Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
Integer c = Integer.valueOf(128);
Integer d = Integer.valueOf(128);
System.out.println(a == b); // true, because they are cached and refer to the same object
System.out.println(c == d); // false, because they are not cached and refer to different objects
}
}
2. equals 메서드
Integer 클래스의 equals 메서드는 두 객체가 같은 값을 가지는지를 비교합니다. 기본 자료형 int는 == 연산자를 사용하여 값을 직접 비교합니다.
public class IntegerEqualsExample {
public static void main(String[] args) {
Integer a = new Integer(127);
Integer b = new Integer(127);
int x = 127;
int y = 127;
System.out.println(a.equals(b)); // true, because equals() compares values
System.out.println(a == b); // false, because they are different objects
System.out.println(x == y); // true, because they are primitive types and their values are compared
}
}
여기서 내가 겪은 문제!
int는 그냥 '=='으로 비교 가능하고, 자료형이 바뀌었을 때만 equals를 쓴다고 착각했습니다.
int는 기본 자료형(primitive type)이고, Integer는 int의 래퍼 클래스(wrapper class)입니다.
즉, Integer cache로 인해서 -128에서 127 까지는 '=='으로 비교가 가능하지만 그 범위를 넘으면 객체이기 때문에 그 값이 같더라도 다른 객체라 equals로 비교해줘야 했던 것입니다...
하필 예제는 테케가 작아서 상관없었지만, -1414를 비교해야 하는 상황에서 찍어보니 그 값은 같은데 그냥 넘어가서 문제임을 또 깨달아버렸습니다...
알면서도 String 같은 자료형만 equals라고 착각했던 이 잘못된 개념을 언제쯤 맞게 기억할련지...잊지 않으려고 로그남김.
https://coding-log.tistory.com/259
사실 전에도 비슷한 글 남긴적 있음... 그냥 치매인듯.
반응형
'Algorithm' 카테고리의 다른 글
이분탐색(binary search)에 대한 탐구 feat. 시간 복잡도, 정렬 etc (0) | 2024.10.10 |
---|---|
[JAVA] 백준 19951 태상이의 훈련소 생활 (0) | 2024.09.07 |
[JAVA] n진수를 10진수로, 10진수를 n진수로 (십진수 등 변환하는 법) (0) | 2024.06.26 |
[JAVA] 알고리즘 풀 때 HashMap 사용법 정리 (0) | 2023.09.24 |
[JAVA] 프로그래머스 [3차] 방금그곡 (0) | 2023.09.16 |