equals(object obj) : boolean

satic·2025년 3월 25일

equals(Object obj) : boolean

equals(Object obj) 메서드는 자바에서 객체의 동등성(Equality) 을 비교하는 데 사용됩니다.

1. 기본 동작 (Object 클래스의 기본 equals)

자바의 모든 클래스는 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) 를 수행합니다.


2. equals 메서드 오버라이딩 (객체 값 비교)

일반적으로 equals 메서드는 객체의 필드 값이 같으면 동일한 객체로 간주하도록 오버라이딩(Overriding) 해서 사용합니다.

예제: equals 메서드 오버라이딩

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 (필드 값이 같음)
    }
}

🔹 nameage가 같은 경우 equalstrue를 반환하도록 오버라이딩 했습니다.


3. equals와 hashCode 함께 오버라이딩하기

자바의 equals를 오버라이딩할 때는 hashCode() 메서드도 함께 오버라이딩하는 것이 권장됩니다.

  • hashCode()는 HashSet, HashMap과 같은 컬렉션에서 객체를 올바르게 비교하는 데 사용됩니다.

equals & hashCode 오버라이딩 예제

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를 구현할 수 있습니다.
🔹 equalshashCode를 함께 오버라이딩하면 HashSet, HashMap에서도 동일한 객체로 인식됩니다.


4. String 클래스의 equals()

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()와 함께 오버라이딩하여 컬렉션에서 정상 동작 보장

profile
95.06.09

0개의 댓글