Kotlin,Java

Java에서의 == 와 equals() 비교

Danuvibe 2024. 9. 22. 17:17

Java에서 객체나 값을 비교할 때 주로 사용되는 두 가지 방법이 있습니다: == 연산자와 equals() 메소드입니다. 이 두 방법은 비슷해 보이지만 실제로는 매우 다른 동작을 합니다. 이 포스트에서는 이 두 가지 비교 방법의 차이점과 각각의 사용 시기에 대해 자세히 알아보겠습니다.

1. 기본적인 차이

==

  • 기본 데이터 타입의 값을 비교하거나 객체의 참조를 비교합니다.
  • 연산자이므로 오버라이딩할 수 없습니다.

equals()

  • Object 클래스의 메소드로, 객체의 내용을 비교합니다.
  • 개발자가 클래스에 맞게 오버라이딩하여 사용할 수 있습니다.

2. 상세 비교

사용 대상

  • ==: 주로 기본 데이터 타입(int, float, boolean 등)의 값 비교에 사용됩니다. 객체에 사용할 경우 참조 비교를 수행합니다.
  • equals(): 객체의 내용을 비교할 때 사용됩니다.

동작 방식

  • ==: 기본 타입의 경우 값을, 객체의 경우 메모리 주소를 비교합니다.
  • equals(): 기본적으로는 ==와 동일하게 동작하지만, 많은 클래스에서 내용 비교를 위해 오버라이딩됩니다.

null 처리

  • ==: null 값과 안전하게 비교할 수 있습니다.
  • equals(): null 객체에서 호출하면 NullPointerException이 발생합니다.

성능

  • ==: 단순 비교이므로 일반적으로 더 빠릅니다.
  • equals(): 구현에 따라 다르지만, 보통 더 많은 연산이 필요합니다.

3. 예시 코드

기본 데이터 타입 비교

int a = 5;
int b = 5;
System.out.println(a == b);  // true

문자열 비교

String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2);       // true
System.out.println(str1 == str3);       // false
System.out.println(str1.equals(str3));  // true

사용자 정의 클래스

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof Person)) return false;
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }
}

Person p1 = new Person("Alice", 30);
Person p2 = new Person("Alice", 30);

System.out.println(p1 == p2);       // false
System.out.println(p1.equals(p2));  // true

4. 사용 시 주의사항

  1. 문자열 비교 시 항상 equals()를 사용하세요.
  2. 사용자 정의 클래스에서 equals()를 오버라이딩할 때는 hashCode()도 함께 오버라이딩해야 합니다.
  3. null 체크가 필요한 경우 ==를 사용하거나, Objects.equals(obj1, obj2)를 사용하세요.

5. 결론

==equals()는 각각의 용도가 있습니다. 기본 타입 비교나 참조 비교에는 ==를, 객체의 내용 비교에는 equals()를 사용하는 것이 좋습니다. 상황에 맞는 올바른 비교 방법을 선택함으로써 더 안정적이고 의도에 맞는 프로그램을 작성할 수 있습니다.