equals(Object obj) 메서드는 자바에서 객체의 동등성(Equality) 을 비교하는 데 사용됩니다.
자바의 모든 클래스는 Object 클래스를 상속받으며, Object 클래스의 기본 equals 메서드는 두 객체의 메모리 주소(참조 값) 를 비교합니다.
class Sample {}
public class Main {
public static void main(String[] args) {
Sample s1 = new Sample();
Sample s2 = new Sample();
System.out.println(s1.equals(s2)); // false (서로 다른 객체)
System.out.println(s1.equals(s1)); // true (같은 객체)
}
}
🔹 기본 equals 메서드는 == 연산자와 동일하게 참조 비교(Reference Comparison) 를 수행합니다.
일반적으로 equals 메서드는 객체의 필드 값이 같으면 동일한 객체로 간주하도록 오버라이딩(Overriding) 해서 사용합니다.
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // 동일한 객체면 true
if (obj == null || getClass() != obj.getClass()) return false; // null 또는 클래스가 다르면 false
Person person = (Person) obj; // 형 변환
return age == person.age && name.equals(person.name); // 필드 값 비교
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("홍길동", 30);
Person p2 = new Person("홍길동", 30);
System.out.println(p1.equals(p2)); // true (필드 값이 같음)
}
}
🔹 name과 age가 같은 경우 equals가 true를 반환하도록 오버라이딩 했습니다.
자바의 equals를 오버라이딩할 때는 hashCode() 메서드도 함께 오버라이딩하는 것이 권장됩니다.
hashCode()는 HashSet, HashMap과 같은 컬렉션에서 객체를 올바르게 비교하는 데 사용됩니다.import java.util.Objects;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age); // name과 age를 기반으로 hashCode 생성
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("김철수", 25);
Person p2 = new Person("김철수", 25);
System.out.println(p1.equals(p2)); // true
System.out.println(p1.hashCode() == p2.hashCode()); // true (hashCode도 동일해야 함)
}
}
🔹 Objects.hash()를 사용하면 간편하게 hashCode를 구현할 수 있습니다.
🔹 equals와 hashCode를 함께 오버라이딩하면 HashSet, HashMap에서도 동일한 객체로 인식됩니다.
String 클래스는 equals 메서드를 오버라이딩하여 문자열의 내용을 비교합니다.
public class Main {
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // true (문자열 내용 비교)
System.out.println(str1 == str2); // false (참조 비교)
}
}
🔹 ==는 참조 비교(객체의 메모리 주소 비교)
🔹 equals는 문자열의 내용을 비교
| 비교 방법 | 설명 |
|---|---|
== | 객체의 참조값(주소값) 을 비교 |
equals() | 객체의 내용(필드 값) 을 비교 (오버라이딩 필요) |
hashCode() | equals()와 함께 오버라이딩하여 컬렉션에서 정상 동작 보장 |