본문 바로가기
Java Study

동일성(Identity)과 동등성(Equality)

by xogns93 2024. 7. 16.

자바에서 동일성(Identity)과 동등성(Equality)은 객체를 비교할 때 중요한 두 가지 개념입니다. 이 두 개념은 서로 다르며, 올바르게 이해하고 사용하는 것이 중요합니다.

 

동일성 (Identity)

동일성은 두 객체가 동일한 메모리 위치를 참조하고 있는지를 의미합니다. 즉, 동일한 객체인지 여부를 확인합니다. 자바에서 동일성 비교는 == 연산자를 사용합니다. ( 참조 동일성(Reference Equality) )

public class IdentityExample {
    public static void main(String[] args) {
        // 두 객체 생성
        String str1 = new String("hello");
        String str2 = new String("hello");
        
        // 동일성 비교
        boolean result = (str1 == str2); // false 반환
        System.out.println("str1 == str2: " + result);
        
        // 동일한 객체 참조
        String str3 = str1;
        result = (str1 == str3); // true 반환
        System.out.println("str1 == str3: " + result);
    }
}

위 예제에서 str1과 str2는 내용이 같지만 서로 다른 객체이므로 str1 == str2는 false를 반환합니다. 반면에 str1과 str3는 동일한 객체를 참조하므로 str1 == str3는 true를 반환합니다.

 

 

동등성 (Equality)

동등성은 두 객체가 동일한 값을 가지고 있는지를 의미합니다. 즉, 두 객체의 상태가 같은지를 비교합니다. 자바에서 동등성 비교는 equals() 메소드를 사용합니다. 객체가 동등성을 정의하려면 equals() 메소드를 오버라이드해야 합니다. 

값 동일성(Value Equality)

public class EqualityExample {
    public static void main(String[] args) {
        // 두 객체 생성
        String str1 = new String("hello");
        String str2 = new String("hello");
        
        // 동등성 비교
        boolean result = str1.equals(str2); // true 반환
        System.out.println("str1.equals(str2): " + result);
    }
}

위 예제에서 str1과 str2는 서로 다른 객체이지만, 내용이 동일하므로 str1.equals(str2)는 true를 반환합니다.

 

 

사용자 정의 클래스에서의 동등성

사용자 정의 클래스에서 동등성을 제대로 비교하려면 equals() 메소드를 오버라이드해야 합니다. 또한, equals() 메소드와 함께 hashCode() 메소드도 오버라이드하는 것이 권장됩니다. 이는 HashSet, HashMap 같은 컬렉션에서 올바르게 동작하기 위해 필요합니다.

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);
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + '}';
    }
}

public class CustomEqualityExample {
    public static void main(String[] args) {
        Person person1 = new Person("John", 25);
        Person person2 = new Person("John", 25);

        // 동등성 비교
        boolean result = person1.equals(person2); // true 반환
        System.out.println("person1.equals(person2): " + result);

        // 동일성 비교
        result = (person1 == person2); // false 반환
        System.out.println("person1 == person2: " + result);
    }
}

위 예제에서 Person 클래스는 equals() 메소드와 hashCode() 메소드를 오버라이드하여 두 Person 객체가 동일한 이름과 나이를 가질 때 동등하다고 정의합니다. person1과 person2는 서로 다른 객체이지만, 동일한 데이터를 가지므로 equals() 메소드로 비교하면 true를 반환합니다. 반면, == 연산자로 비교하면 false를 반환합니다.

 

 

요약

  • 동일성 (Identity): 두 객체가 동일한 메모리 위치를 참조하는지를 비교 (== 연산자 사용).
  • 동등성 (Equality): 두 객체의 상태(값)가 동일한지를 비교 (equals() 메소드 사용).

동일성과 동등성을 올바르게 이해하고 사용하는 것은 자바 프로그래밍에서 매우 중요합니다. 특히, 컬렉션을 사용할 때 equals()와 hashCode() 메소드를 적절히 오버라이드하여 객체를 비교하고 관리하는 것이 중요합니다.