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. 사용 시 주의사항
- 문자열 비교 시 항상
equals()를 사용하세요. - 사용자 정의 클래스에서
equals()를 오버라이딩할 때는hashCode()도 함께 오버라이딩해야 합니다. null체크가 필요한 경우==를 사용하거나,Objects.equals(obj1, obj2)를 사용하세요.
5. 결론
==와 equals()는 각각의 용도가 있습니다. 기본 타입 비교나 참조 비교에는 ==를, 객체의 내용 비교에는 equals()를 사용하는 것이 좋습니다. 상황에 맞는 올바른 비교 방법을 선택함으로써 더 안정적이고 의도에 맞는 프로그램을 작성할 수 있습니다.