JAVA Integer 128 == 128 false??

리본24·2024년 9월 21일
post-thumbnail

- 들어가면서

어떻게보면 조금은 재밌는 주제로 가져와봤다. 😉
왜 첫번째 결과는 true인데 2번째 결과는 false 일까?

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

Integer x = 128;
Integer y = 128;
System.out.println(x==y); // false

- 왜? 원인은?

Integer의 Java caches범위가 -128~127이고 Java는 메모리 사용을 최적화 하기위해서 같은 값은 같은 공간에 담고 재사용한다.
실제로 메모리주소를 알수는 없지만. idhashcode를 확인할 수 있다.
다음과 같이 동일한 것을 볼 수 있다.

Integer a = 1;
Integer b = 1;

System.out.println(System.identityHashCode(a)); //1711574013
System.out.println(System.identityHashCode(b)); //1711574013

그렇다. 리터럴값이 -128 ~ 127에 속한다면 같은 메모리 공간에 위치시켜서 동일한 곳을 참조하게 된다.
반면에 범위를 넘는 경우에는 2개의 변수는 다른 공간의 메모리에 위치하게 된다.

Integer x = 128;
Integer y = 128;

System.out.println(System.identityHashCode(x)); //1631862159
System.out.println(System.identityHashCode(y)); //1146848448

- 그러면 어떻게 비교해야될까?

Integer 객체의 값을 비교하려고 한다면 .equals()를 사용하면 된다.

Integer x = 128;
Integer y = 128;

System.out.println(x==y); // false
System.out.println(x.equals(y)); // true

- 그 외

int와 같은 기본형(primitive type)은 ==을 통해서 값을 비교하는 게 가능하지만
그 외의 참조형(Reference type)들은 .equals를 통해서 값을 비교하는 것이 바람직하다.

간단하게 설명하면!

  • 기본형은 계산을 위해 실제 값을 저장하고 null을 가질 수 없다.
  • 참조형은 객체의 주소를 저장한다. null을 가질 수 있고 객체의 주소를 가진다.

실제로 integer는 출력하려고하면 NPE관련 경고가 뜨지만 int는 그렇지 않다.

public class difftest {
    public static void main(String[] args) {

        int i1 = 128;
        int i2 = 128;
        System.out.println("i1 == i2: " + (i1 == i2)); // true

        // Integer 객체 비교 (캐싱 범위 내)
        Integer x = 1;
        Integer y = 1;
        System.out.println("x == y: " + (x == y));  // true
        System.out.println("x equals y: " + (x.equals(y))); // true

        // Integer 객체 비교 (캐싱 범위 밖)
        Integer a = 128;
        Integer b = 128;
        System.out.println("a == b: " + (a == b));  // false
        System.out.println("a equals b: " + (a.equals(b)));  // true
        
        String t1 = new String("same text");
        String t2 = new String("same text");
        String t3 = "same text";
        String t4 = "same text";

        System.out.println(t1==t2); //false
        System.out.println(t3==t4); //true
        System.out.println(t1==t3); //false
        System.out.println(t1.equals(t2)); // true
        System.out.println(t1.equals(t3)); // true
    }
}
profile
기록하고 소화해보자! 소화가 안되거나 까먹으면 다시 꺼내서 보자! 오늘의 나는 어제의 나보다 강하다!

0개의 댓글