반응형
이번 글에서는 Object 클래스의 equals() 메서드를 재정의하여,
두 객체가 동등한지 판단하는 기준을 직접 설정하는 방법을 배웁니다.
기본 equals()는 참조값(주소값) 비교이지만,
우리가 원하는 대로 내부 값이 같으면 같은 객체로 간주하도록 만들 수 있습니다.
📌 예제 코드
public class Member {
public String id;
public Member(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Member target)
if (id.equals(target.id)) // 문자열 id 값이 같으면 true
return true;
return false;
}
}
public class EqualsExample {
public static void main(String[] args) {
Member obj1 = new Member("blue");
Member obj2 = new Member("blue");
Member obj3 = new Member("red");
if (obj1.equals(obj2))
System.out.println("obj1과 obj2는 동등합니다.");
else
System.out.println("obj1과 obj2는 동등하지 않습니다.");
if (obj1.equals(obj3))
System.out.println("obj1과 obj3는 동등합니다.");
else
System.out.println("obj1과 obj3는 동등하지 않습니다.");
}
}
💻 실행 결과
obj1과 obj2는 동등합니다.
obj1과 obj3는 동등하지 않습니다.
💬 코드 설명
- equals() 메서드는 기본적으로 두 객체의 참조값이 같은지를 비교합니다.
- 하지만 Member 클래스에서는 equals()를 오버라이드하여, id 값이 같으면 true를 반환하도록 변경했습니다.
- instanceof 조건문에서는 패턴 매칭을 사용하여, Member 타입으로 안전하게 캐스팅까지 한 번에 처리합니다.
- "blue"라는 동일한 id를 가진 obj1과 obj2는 동등하다고 판단되어 첫 번째 비교는 true.
- "red"를 가진 obj3은 obj1과 다르기 때문에 두 번째 비교는 false입니다.
💡 포인트 정리
- equals()는 객체의 논리적 동등성을 정의할 때 오버라이딩해서 사용합니다.
- 문자열과 같이 내용 기반으로 비교해야 할 경우, equals()를 재정의하면 유용합니다.
- Java 16 이후부터는 instanceof 조건문에서 패턴 매칭 문법을 사용해 캐스팅을 간결하게 처리할 수 있습니다.
- equals()를 재정의할 때는 null 체크와 클래스 타입 비교를 함께 고려하는 것이 좋습니다.
📌 정리하자면, 객체 비교는 단순히 주소가 같은지 확인하는 것이 아니라, 원하는 기준에 따라 동등함을 정의할 수 있습니다.
equals() 메서드를 재정의하면, 내부 데이터가 같은 두 객체를 같은 것으로 간주할 수 있어 비즈니스 로직에서 유연한 비교가 가능합니다.
'Java > 자바 정리' 카테고리의 다른 글
103. 객체를 문자열처럼 출력하려면? – toString() 메서드 재정의 (1) | 2025.05.14 |
---|---|
102. HashSet이 중복을 막는 진짜 원리 – equals()와 hashCode() 실전 확인 (0) | 2025.05.13 |
101. hashCode()와 equals()는 짝꿍이다 – 동등 객체 비교의 원칙 (0) | 2025.05.13 |
99. 예외를 직접 던져보자 – 잔고 부족 예외 처리 만들기 (0) | 2025.05.13 |
98. 예외를 던진다? throws로 책임을 미루는 방법 (0) | 2025.05.13 |
97. 예외가 여러 개여도 하나로 처리하자 – 멀티 캐치(Multi-Catch) (0) | 2025.05.13 |