본문 바로가기

Java

Object 클래스의 메서드 - equals(), hashCode()

반응형

equals() 메서드 

매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 알려 주는 역할을 한다. 객체를 생성할 때, 메모리의 비어있는 공간을 찾아 생성하므로 서로 다른 두 개의 객체가 같은 주소를 갖는 일은 있을 수 없다. 

 

아래 코드는 멤버변수 10을 받고 있다. 멤버 변수가 같더라도 객체의 주소는 다르기 때문에 v1과 v2는 다르다는 결과가 나온다. 

public class Ex9_1 {
	public static void main(String[] args) {
		Value v1 = new Value(10);
		Value v2 = new Value(10);
		
		if (v1.equals(v2))
			System.out.println("v1과 v2는 같습니다.");
		else 
			System.out.println("v1과 v2는 다릅니다.");
	}
}

class Value {
	int value;
	
	Value(int Value) {
		this.value = value;
	}
}

결과

hashCode()

이 메서드는 해싱(hashing) 기법에 사용되는 해시함수를 구현한 것이다. 해싱은 데이터관리기법 중의 하나로 다량의 데이터를 저장하고 검색하는 데 유용하다. 일반적으로 해시코드가 같은 두 객체가 존재할 수 있지만, Object클래스에 정의된 hashCode메서드는 객체의 주소값을 이용해서 해시코드를 만들어 반환하기 때문에 서로 다른 두 객체는 같은 해시코드를 가질 수 없다. 

 

public class Ex9_3 {
	public static void main(String[] args) {
		String s1 = new String("abc");
		String s2 = new String("abc");
		
		System.out.println(s1.equals(s2));		//true
		System.out.println(s1.hashCode());		//equals가 true면 hashCode값이 같아야함. 
		System.out.println(s2.hashCode());
		System.out.println(System.identityHashCode(s1));
		System.out.println(System.identityHashCode(s2));		
	}
}

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

 

반응형