Back-end/Java Language

0. equals()와 hashcode()

prden 2021. 5. 24. 16:31

1. equals()

매개변수로 객체의 참조 변수를 받아서 비교하여 그 결과를 boolean값으로 알려주는 역할을 함.

Object클래스에 정의되어 있는 equals메서드의 내용은 아래와 같다. 

public boolean equals(Object obj){
	return(this==obj);
    }

위 코드에서 알 수 있듯이 두 객체의 같고 다름을 참조 변수의 값으로 판단한다. 따라서 서로 다른 두 객체를 equals메서드로 비교하면 항상 false의 결과가 나온다. 

 

1) 자바의 정석 p451 예제 확인

2) value라는 멤버 변수를 갖는 Value클래스를 정의하고, 두 개의 Value클래스의 인스턴스를 생성한 다음 equals메서드를 이용해서 두 인스턴스를 비교하면 equals 메서드는 주소 값으로 비교를 하기 때문에 두 Value 인스턴스의 멤버 변수 value 값이 10으로 서로 같을지라도 equals메서드로 비교한 결과는 false일 수밖에 없다. 

3) 따라서 value의 값을 비교해서 저장된 내용이 같은지 비교하려면 equals메서드를 오버 라이딩해야 한다. 

4) 그러나, String 클래스, Data, File, Wrapper클래스의 equals메서드는 주소 값이 아닌 내용을 비교하도록 오버 라이딩되어있다. 

*String Buffer클래스는 오버 라이딩되어 있지 않음. 따라서 값 비교시 toString으로 변환후 비교

 

2.equals(동등성 비교)와 ==(동일성 비교)의 차이 

자바에서 일반적인 데이터 타입의 비교는 ==라는 '연산자'를 이용하여 비교, 하지만 String 문자열의 값을 비교할 때는 equals() 메서드를 사용하여 비교함.

 

1) 주소 값 비교(==)와 값 비교(equals)

==연산자는 두 개 대상의 주소 값을 비교, String 클래스의 equals메서드는 두 개 대상의 값 자체를 비교한다. 

 

3. hashcode()

1) 의미 : 이 메서드는 해싱 기법에 사용되는 해시함수를 구현한 것이다. 해싱은 데이터 관리기법 중의 하나로, 다량의 데이터를 저장하고 검색하는 데 유용하다. 해시함수는 찾고자 하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시 코드를 반환한다. 

Object 클래스에 정의된 hashCode메서드는 객체의 주소 값을 이용해서 해시 코드를 만들어 반환하기 때문에 서로 다른 두 객체는 결코 같은 해시 코드를 가질 수 없다. 따라서 인스턴스 변수 값으로 객체의 같고 다름을 판단해야 한다면,  hashCode 또한 equals() 메서드와 마찬가지로 오버 라이딩해야 한다. 

반면, String 클래스는 문자열의 내용이 같으면, 동일한 해시 코드를 반환하도록 hashCode메서드가 오버 라이딩되어 있기 때문에, 문자열의 내용이 같은 인스턴스에 대해 hashCode()를 호출하면 항상 동일한 해시 코드 값을 얻을 수 있다. 

 

2) 쓰임 : HashSet, HashMap, HashTable은 두 객체가 동등한 지 비교할 때 1st. hashCode() 메서드를 실행해서 리턴된 해시 코드 값이 같은지를 확인한다. 만약 해시 코드 값이 다르면 다른 객체로 판단하고, 해시 코드 값이 같으면 2nd equals() 메서드로 다시 비교한다. 이 두 개가 모두 맞아야 동등 객체로 간주되는 것이다.