본문 바로가기

카테고리 없음

"Java 객체 비교: == 연산자와 equals() 메서드의 차이점과 사용자 정의 클래스에서의 구현 방법"

 

Java에서 == 연산자와 equals() 메서드는 객체 비교 시 다르게 작동하며, 문자열 비교와 사용자 정의 클래스의 동작 방식에 대해서도 말씀하신 내용이 옳습니다. 좀 더 구체적으로 설명드리면:

 

== 연산자

  • 원시 타입(Primitive Type): == 연산자는 원시 타입의 값 자체를 비교합니다. 예를 들어, int, char, float 등과 같은 기본 데이터 타입은 실제 값을 비교합니다.
int a = 5;
int b = 5;
System.out.println(a == b); // true

 

  • 참조 타입(Reference Type): 객체에 대한 참조(메모리 주소)를 비교합니다. 따라서 두 객체가 동일한 메모리 주소를 가리킬 때만 true를 반환합니다.
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false (서로 다른 객체를 참조)

 

equals() 메서드

  • 기본 Object 클래스: 기본적으로 Object 클래스에서 제공하는 equals() 메서드는 == 연산자와 동일하게 작동하여 두 객체의 참조(주소)를 비교합니다.
  • 오버라이딩된 equals(): String 클래스와 같이, equals() 메서드를 오버라이드하여 객체의 논리적 동등성(즉, 객체의 내용이나 상태)을 비교할 수 있습니다. String 클래스의 equals() 메서드는 문자열의 내용을 비교하도록 오버라이드되어 있습니다.
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // true (문자열 내용이 동일)

 

사용자 정의 클래스에서의 equals()와 hashCode()

  • 사용자 정의 클래스: 객체의 논리적 동등성을 비교하려면 equals() 메서드를 오버라이드해야 합니다. 이는 객체의 특정 필드나 속성을 기준으로 동등성을 정의하게 해줍니다.
  • hashCode() 메서드 오버라이딩: equals() 메서드를 오버라이드하는 경우, 해시 기반 컬렉션(e.g., HashSet, HashMap)에서의 일관된 동작을 위해 hashCode() 메서드도 함께 오버라이드해야 합니다.
package com.example.querytest;

import java.util.Objects;

public class BBB {
    public static void main(String[] args) {
        MyClass obj1 = new MyClass(10, 40, "chan");
        MyClass obj2 = new MyClass(10, 40, "chan");

        String name = "chan";

        if (obj1.equals(obj2)) {
            System.out.println("Objects are equal");
        } else {
            System.out.println("Objects are not equal");
        }

        if(name.equals(obj1)) {
            System.out.println("Objects are equal");
        } else {
            System.out.println("Objects are not equal");
        }
    }
}

class MyClass {
    int value;

    int age;

    String name;

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyClass myClass = (MyClass) o;
        return value == myClass.value && age == myClass.age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(value, age);
    }
}

결론

  • == 연산자: 참조 타입에서는 메모리 주소를, 원시 타입에서는 값을 비교합니다.
  • equals() 메서드: 기본적으로 주소를 비교하지만, 오버라이드할 경우 객체의 내용을 비교할 수 있습니다. String 클래스에서는 이미 오버라이드되어 내용 비교를 수행합니다.
  • 사용자 정의 클래스: 객체의 내용을 비교하려면 equals() 메서드를 오버라이드해야 하며, 일관성을 위해 hashCode() 메서드도 함께 오버라이드해야 합니다.