영호

[Java] ==, equals() 차이 본문

Language/JAVA

[Java] ==, equals() 차이

0h0 2022. 6. 8. 11:57

==연산

 Java에서 ==연산은 primitive type에 대해 실제 값을 비교해주는 연산입니다.

public static void main(String[] args) {
        int a = 10;
        int b = 10;
        int c = 20;

        System.out.println(a == b); // 10 == 10 -> true
        System.out.println(b == c); // 10 == 20 -> false
    }

 

그리고 reference type에 대해서는 객체의 주소 값을 비교해주기 때문에, 내부 값이 같다고 하더라고 객체의 주소가 다르다면 false를 리턴해줍니다.

public static void main(String[] args) {
        String a = "test";
        String b = "test";
        String c = new String("test");
        
        System.out.println(a == b); //test == test -> true
        System.out.println(b == c); //test == not test -> false
    }

여기서 첫 번째 a == b가 true가 나온 이유는 Heap의 String contant pool영역으로 인해 객체의 주소가 같기 때문에 true가 반환됐습니다.

String Contant Pool

 

그에 반면 c는 new연산을 이용해 String 객체를 생성했기 때문에 String contant pool영역이 아닌 Heap 영역을 차지합니다. 이로 인해 c는 a, b 객체의 주소와는 다른 주소를 가지게 되면서 b == c에서 false가 반환됐습니다.

 

이처럼 ==연산은 primitive에 대해서는 값을 비교해주고, reference type에 대해서는 객체의 참조 주소 값을 비교해 true, false를 반환해줍니다. 그래서 객체의 값을 비교하기 위해서는 equals()를 사용해야 합니다.

 

equals()

위에서 간단하게 언급했듯이 equals() 메서드는 객체의 주소 값이 아닌 실제 내부 속성의 값을 비교해줍니다. equals()는 Java의 최상위 클래스인 Object의 메서드이기 때문에 오버 라이딩이 가능합니다.

public static void main(String[] args) {
        String a = "test";
        String b = "test";
        String c = new String("test");

        System.out.println(a.equals(b)); //true
        System.out.println(b.equals(c)); //true
    }

객체의 내부 속성을 비교하기 때문에 전부 true가 나오게 됩니다.

Comments