https://youtu.be/niA2j_6CFIY?si=2soTkdFWvQ5ny1dY
이 영상을 보면서 깨달은것
public class Main {
public static void main(String[] args) {
//TIP Press <shortcut actionId="ShowIntentionActions"/> with your caret at the highlighted text
// to see how IntelliJ IDEA suggests fixing it.
Integer a = Integer.valueOf(128);
Integer b = Integer.valueOf(128);
System.out.println(a.equals(b));
System.out.println(a ==b);
System.out.println(System.identityHashCode(b));
System.out.println(System.identityHashCode(a));
}
}
Java Integer 비교에서 == 와 equals()의 차이를 알게 된 순간
최근 Java의 Integer 타입과 관련된 영상을 접하면서 흥미로운 사실을 알게 되었습니다.
그동안 자연스럽게 사용해왔던 == 연산자가 의도와 다른 결과를 줄 수 있다는 점인데요.
이번 글에서는 Integer 객체를 비교할 때 발생할 수 있는 캐싱 이슈와 올바른 비교 방법에 대해 정리해보겠습니다.
✅ == 으로 비교했을 때의 결과
Integer a = 127; Integer b = 127; System.out.println(a == b); // true
위 코드는 true를 출력합니다. 그런데 값만 1 올려서 아래처럼 바꾸면 결과가 달라집니다.
Integer a = 128; Integer b = 128; System.out.println(a == b); // false
단순히 숫자만 바꿨는데 왜 결과가 달라졌을까요?
🔍 원인: Integer의 캐싱(Caching) 메커니즘
Java에서는 Integer.valueOf(int) 메서드를 사용할 때, 자주 사용되는 범위의 값을 캐싱합니다.
📌 캐싱 범위: -128 ~ 127
해당 범위의 값은 JVM이 미리 객체로 생성해두고, 동일한 값을 다시 요청하면 기존 객체를 재사용합니다.
하지만 이 범위를 벗어나는 경우, 새로운 객체가 생성됩니다.
📄 공식 문서 (Java 17):
This method will always cache values in the range -128 to 127, inclusive, and may cache other values outside of this range.
– Integer.valueOf(int) 문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Integer.html#valueOf(int)
⚠️ ==는 객체의 "참조(주소)"를 비교합니다
==는 두 객체가 같은 주소(참조)를 가리키는지를 판단합니다.
값이 같더라도 서로 다른 객체이면 false가 됩니다.
✅ equals()는 "값 자체"를 비교합니다
equals()는 객체 내부의 값을 비교하기 때문에, 값만 같다면 true가 반환됩니다.
따라서 Integer 값 비교 시에는 equals()를 사용하는 것이 안전합니다.
🧠 정리
== | 참조(주소) | true 가능 | false 가능 |
equals() | 값 | 항상 true | 항상 true |
📝 결론
- Integer는 -128 ~ 127 범위의 값을 캐싱하여 동일 객체로 관리합니다.
- 범위를 초과하면 새로운 객체가 생성되므로 == 비교는 예기치 않은 결과를 줄 수 있습니다.
- 객체의 값을 비교할 때는 항상 equals()를 사용하는 것이 좋습니다.
📚 참고 자료
- Java SE 17 Integer.valueOf 공식 문서
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Integer.html#valueOf(int)
'개발 공부 > Java-Spring' 카테고리의 다른 글
프로젝트#3 (0) | 2025.07.04 |
---|---|
개인프로젝트#2 (0) | 2025.07.01 |
개인 프로젝트 #1 (0) | 2025.06.30 |
SOLID객체지향 5가지 원칙 (0) | 2025.06.27 |
record type (0) | 2025.06.11 |