개발 공부/Java-Spring

객체끼리 비교할 때 무조건 equals메서드 사용할 것

cookiboii 2025. 6. 12. 11:14

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 객체를 비교할 때 발생할 수 있는 캐싱 이슈올바른 비교 방법에 대해 정리해보겠습니다.


✅ == 으로 비교했을 때의 결과

java
 
Integer a = 127; Integer b = 127; System.out.println(a == b); // true

위 코드는 true를 출력합니다. 그런데 값만 1 올려서 아래처럼 바꾸면 결과가 달라집니다.

java
 
 
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)

 

⚠️ ==는 객체의 "참조(주소)"를 비교합니다

java
복사편집
Integer a = 128; Integer b = 128; System.out.println(a == b); // false

==는 두 객체가 같은 주소(참조)를 가리키는지를 판단합니다.
값이 같더라도 서로 다른 객체이면 false가 됩니다.

 

✅ equals()는 "값 자체"를 비교합니다

java
복사편집
Integer a = 128; Integer b = 128; System.out.println(a.equals(b)); // true

equals()는 객체 내부의 값을 비교하기 때문에, 값만 같다면 true가 반환됩니다.
따라서 Integer 값 비교 시에는 equals()를 사용하는 것이 안전합니다.


🧠 정리

비교 방식비교 대상-128 ~ 127 범위128 이상
== 참조(주소) true 가능 false 가능
equals() 항상 true 항상 true
 

📝 결론

  • Integer는 -128 ~ 127 범위의 값을 캐싱하여 동일 객체로 관리합니다.
  • 범위를 초과하면 새로운 객체가 생성되므로 == 비교는 예기치 않은 결과를 줄 수 있습니다.
  • 객체의 값을 비교할 때는 항상 equals()를 사용하는 것이 좋습니다.

📚 참고 자료

'개발 공부 > 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