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() 메서드도 함께 오버라이드해야 합니다.