개발_웹/Java

Java | equals(), hashCode() 오버라이딩을 통한 객체 비교

zuyo 2019. 5. 10. 22:05
반응형

equals() 재정의

String 같은 클래스는 equals() 메소드를 사용하여 문자열을 비교할 수 있다. equals()는 String에 대해 서로 다른 객체일지라도 리터럴이 같다면 같은 객체로 인정한다. 

그러나 이는 String 클래스에 equals()가 이미 재정의 되어있기 때문이고, 원래 equals() 메소드는 같은 객체에 대해서만 true를 반환한다. 내용이 같더라도 new로 새로 생성하거나 깊은 복사를 통해 만들어진 객체는 주소값이 다르기 때문에 다른 객체로 인식한다.

프로그래머가 만든 객체를 String처럼 내용만 비교하여 같은 객체로 판단하게 하려면 equals() 메소드를 재정의(오버라이딩) 해야한다.

@Override
public boolean equals(Object obj) {
	if (super.equals(obj)) { 
		return true; // 기존 equals() 메소드. 완전히 동일한 객체인 경우 true 반환
	} else {
		if(obj == null) { 
			return false; // 비교 대상이 null인 경우 false 반환
		}
		if (this.getClass() != obj.getClass()) { 
			return false; // 참조하는 클래스가 다른 경우 false 반환. instanceof를 사용해도 됨.
		}
		Character ch2 = (Character)obj;
		if (Objects.equals(name, ch2.getName())
				&& Objects.equals(job, ch2.getJob())
				&& level == ch2.getLevel()) {
			return true;
		}
	}
	return false;
}
반응형