..
Java 객체의 삼총사: equals, hashCode, toString
1. 모든 객체의 조상, Object 클래스
자바에서 모든 클래스는 명시적으로 상속받지 않더라도 최상위 클래스인 Object 클래스를 자동으로 상속받습니다. Object 클래스가 제공하는 equals, hashCode, toString 메소드들은 객체의 상태와 정체성을 다루는 데 매우 중요한 역할을 합니다.
2. equals(): “우리는 논리적으로 같은가?”
두 객체가 논리적으로 동등한지 비교할 때 사용합니다.
- 기본 동작:
Object클래스의 기본 구현은==연산자와 동일한 참조 비교(주소값 비교)를 수행합니다. - 재정의의 필요성: 실무에서는 주소값이 달라도 내용(필드값)이 같으면 같은 객체로 간주해야 하는 경우가 많습니다. (예: 이름과 주민번호가 같은 두 Person 객체)
3. hashCode(): “네 해시 버킷 주소는 어디니?”
객체의 지문과 같은 정수 값을 반환합니다. 주로 HashMap, HashSet 같은 해시 기반 컬렉션에서 객체를 저장하고 찾을 때 사용됩니다.
- 중요한 계약 (Contract):
equals()를 재정의하여 두 객체가 동등하다고 판단했다면, 반드시hashCode()도 동일한 값을 반환하도록 재정의해야 합니다. - 재정의하지 않을 경우:
equals()는 같은데hashCode()가 다르면, 해시 컬렉션에서 엉뚱한 위치를 뒤지게 되어get()이나contains()가 정상적으로 동작하지 않는 대참사가 발생합니다.
4. toString(): “너를 어떻게 읽으면 좋을까?”
객체의 문자열 표현을 반환합니다.
- 기본 동작:
클래스이름@해시코드형태의 사람이 읽기 힘든 문자열을 반환합니다. - 재정의의 효과: 디버깅이나 로깅 시 객체의 내부 필드 값을 바로 확인할 수 있도록 유의미한 정보를 담아 재정의하는 것이 관례입니다.
@Override
public String toString() {
return String.format("User(id=%s, name=%s)", id, name);
}
equals는 같은 사람인지 확인하는 신분증 검사, hashCode는 그 사람을 빠르게 찾기 위한 인덱스 정보, toString은 그 사람이 자기소개를 하는 명함이라고 이해하면 명확합니다.