객체 간 논리적 동등 비교해보기

띠로리·2022년 8월 24일

코딩을 하다보면 객체 간 동등 비교는 참조하는 주소값이 다르기 때문에 항상 false로 나온다. 그러나 상황에 따라 두 객체 간에 구성 요소가 같을 때 논리적으로 동일하게 판단되면 좋은 상황이 있다.
자바의 최상위 부모 클래스 Object의 equals(), hashCode() 메서드를 오버라이딩해 객체 간 논리 동등 비교를 해보자.


Object 클래스의 equals(), hashCode() 메서드를 오버라이딩 하기에 앞서 두 메서드가 어떤 역할을 하고있는지 알아보자.

equals()

Object 클래스의 equals() 메서드는 객체의 주소를 비교한다. 같은 값을 가졌다고 해도 객체가 생성된 주소가 다르면 False를 리턴한다.

String 클래스의 equals() 메서드는 이 Object의 equals() 메서드를 오버라이딩한 것이다. 주소가 달라도 문자열만 같으면 True 값을 리턴한다.

hashCode()

int hashCode() 로 정의된 이 메서드는 런타임 객체의 유일한 Integer 값을 반환한다.
객체의 메모리 주소를 이용해 해쉬코드를 만들기 때문에 객체마다 다른 값을 가지게 된다.

이제 두 메서드가 어떤 역할을 하는 지 알았으니 객체 간 논리 동등 비교를 위해 두 메서드를 오버라이딩 해보자.

먼저 다음과 같은 클래스가 있다.

public class Member {
	private String name;
    private int age;
    
    public Member(String name, int age) {
    	this.name = name;
        this.age = age;
    }
    
    public String getName() {
    	return name;
    }
    
    public int getAge() {
    	return age;
    }
}

위와 같은 Member class 가 있을 때 오버라이딩 작업 시 코드는 다음과 같다.

public class Member {
	private String name;
    private int age;
    
    public Member(String name, int age) {
    	this.name = name;
        this.age = age;
    }
    
    public String getName() {
    	return name;
    }
    
    public int getAge() {
    	return age;
    }
    
    @Override
    public boolean equals(Object object) {
    	if (object instanceof Member) {
        	Member member = (Member) object;
            
            return (age == member.age) && (name.equals(member.name));
        } else {
        	return false;
        }
    }
    
    @Override
    public int hashCode() {
    	return age + name.hashCode();
    }
}

위와 같이 정의해주면 객체간의 주소값이 다르더라도 값이 같다면 동등 객체로 평가받을 수 있다.

profile
꼼퓨타

0개의 댓글