자바의 정석 9장 (24일차) - Object 클래스(equals, toString, hashCode)

728x90

Object 클래스

모든 클래스의 최고 조상 - 오직 11개의 메서드만 가지고 있음

 

1. equals()

객체 자신(this)과 주어진 객체의 주소를 비교, 따라서 아래의 코드는 false가 출력된다

	public static void main(String[] args) {
		test t = new test(0);
		test t2 = new test(0);
		System.out.println(t.equals(t2));
//		this t 를 object t2랑 비교하는 것이기 때문에 객체의 주소가 다르므로 false
	}
}
class test{
	int i;
	public test(int i) {
		this.i = i;
	}
}

 

위의 값을 true로 바꾸기 위하여 overriding을 해줘야하는데 아래와 같이 실행할 수 있다.

 

  • equals 메서드를 새로 오버라이딩하여 객체의 값을 비교하도록 만든다.
  • 이 때 object (String) 클래스를 비교하도록 매개변수를 Object로 두고 이 클래스를 test 클래스로 형변환하여 test 값의 i 멤버변수를 사용할 수 있도록 만든다.
  • 그 후 서로의 값만 비교할 수 있도록 오버라이딩을 하면 객체의 주소가 다르더라도 값이 같다면 true를 반환한다.

 

*형변환을 할 때 object클래스에 어떤 객체가 들어올지 모르므로 꼭 instanceof를 넣어 형변환이 가능한지 확인한다.

*만약 형변환이 안되는 객체라면 비교할 수 조차 없으므로 false를 반환한다.

class test{
	int i;
	public test(int i ) {
		this.i = i;
	}
    
	public boolean equals(Object obj) {
//		어떤 객체가 들어올지 모르기때문에 꼭 instanceof로 형변환이 가능한 객체인지 확인해야한다.
		if(obj instanceof test) {
			test t = (test)obj;
			return this.i == t.i;
		}
		else {
			return false;
//			타입이 test값이 아니라면 비교할 필요도 없음
		}

 

2. hashcode()

객체의 주소를 int값으로 변환

  • equals를 오버라이딩하여 객체의 값을 비교할 때 hashcode(객체의 주소)도 동일하게 오버라이딩을 해주어야 한다.
  • 객체의 값이 같다면 객체의 주소값도 같아야하기 때문
  • 두 메서드 전부 객체의 주소를 가지고 작업하지만, iv(지역변수, 멤버변수)를 가지고 작업하게 둘다 오버라이딩
  • hashCode를 오버라이딩 할 때 사용하는 메서드는 Objects.hash()를 사용하면 된다

*System.identityHashCode(Object obj) - 혹시 본인의 기존 hashcode를 사용하고 싶다면 이 함수를 사용

*hashCode 오버라이딩의 반환값은 정수값, 즉 int값이며 return값은 논리적으로 값이 같은 것을 보여줄만한 멤버변수 1개를 골라 return한다.

 

아래 출력문을 보면 hashCode가 동일한 것을 확인할 수 있고 identityHashCode로 인해 본래의 hashCode 값을 출력

출력문:

1581543
1581543

1365202186

	public static void main(String[] args) {
		System.out.println(t.hashCode());
		System.out.println(t2.hashCode()); 
		System.out.println(System.identityHashCode(t));

	public int hashCode() {
		return Objects.hash(age, name, getTime(),getMoney());
	}
//	hash는 가변인자이기 때문에 매개변수의 숫자는 상관하지 않는다

 

 

 

3. toString

객체 주소의 iv값을 원하는 형식의 String값으로 변환하여 출력해줌

주소, 즉 hashCod값을 String으로 변환하여 출력

	public String toString() {
		return "이름: " + Name + ", 핸드폰 번호: " + PhoneN + ", 주소: " + address + ", 나이:  "  + age;
	}
    // 객체의 hashCode값을 String값으로 변환
728x90