[java] equals

업데이트:

[Java] equals()와 hashcode() 재정의

  • equals() - 두 객체를 비교하여 서로 같은 객체인지 판단하는 함수

  • hashcode() - 객체의 주소값을 변환하여 생성한 객체의 고유한 정수값을 만들어주는 함수

equals()

  • 재정의(override) 하는 이유
    • equals는 기본적으로 주소 값을 이용해서 같은지 판단

    • 논리적으로 같은 객체라고 판단하기 위해서는 재정의가 필요

      • ex) Car car1 = new Car(“소나타”), car2 = new Car(“소나타”)의 경우 같은 “소나타”이지만 재정의를 하지 않으면 다른다고 판단
  • equals 메서드 규약
    • 반사성(reflexivity) - x.equals(x)는 true

    • 대칭성(symmetry) - x.equals(y)가 true이면 y.equals(x)도 true

    • 추이성(transitivity) - x.equals(y)가 true이고 y.equals(z)도 true이면 x.equals(z)도 true

    • 일관성(consistency) - x.equals(y)를 몇번해도 항상 true 또는 false를 반환

    • x.equals(null)는 false

hashCode()

  • 재정의(override)가 필요한 이유
    • 같은 값을 가진 객체가 서로 다른 해시 값을 갖게 되기 때문에

    • HashSet or HashMap에 객체를 넣을 때 필요

      • 재정의를 안할 경우 NullPointerException 발생

equals()와 hashCode() 둘 다 재정의를 해야 하는 이유

  • equals()만 하면 논리적으로 같은 객체도 해시 값이 다르기 때문에 다르다고 판단

  • hashCode()만 하면 해시 값은 같아도 논리적으로 같은 객체인지 알 수가 없다고 판단(null 리턴)

예제 코드

class Point{
	int y;
	int x;
	Point(int y, int x){
		this.y=y;
		this.x=x;
	}
	@Override
	public boolean equals(Object o){
		//자신과 같은 객체
		if(this == o){
			return true;
		}
		// 같은 타입의 객체인지 판단
		if(!(o instanceof Point)){
			return false;
		}
		Point point =(Point) o;
		// 논리적으로 같은 값인지 판단
		if(this.y==point.y && this.x==point.x){
			return true;
		}else{
			return false;
		}
	}
	@Override
	public int hashCode(){
		return Objects.hash(this.y, this.x);
	}
}