[개인공부] Object 클래스와 equals(), hashCode(),toString()

Walter Mitty·2022년 12월 24일
0

개인공부

목록 보기
23/40
post-thumbnail

Object 클래스

  • 모든 클래스의 최고 조상이다.
  • 오직 11개의 메서드만을 갖고 있다.
    • notify(), wait() 등은 쓰레드와 관련된 메서드다.
    • 제어자가 protected로 되어있는건 오버라이딩을 하고 public으로 변경한 후 사용 가능하다.
    • 대표메서드들
      • clone(): 객체 자신의 복사본을 반환
      • equals(): 객체 비교할 때 씀. 같으면 true 반환
      • toString(): 객체 정보를 문자열로 반환
      • getClass(): 객체의 클래스 정보, 즉 설계도 정보를 반환.
        따라서 객체를 생성할 수 있고, 객체에 대한 정보도 얻을 수 있다.

equals(Object obj)

  • 객체 자신(this)과 주어진 객체(obj)를 비교한다.
    • 같으면 true, 다르면 false를 반환하는 boolean 타입.
      public boolean equals(Object obj) {
      	return (this==obj); // 주소 비교
      }
      주소가 같을 때만 true 다!
      new로 새로운 객체를 만들어주고 같은 값을 넣어줘도 주소값이 다르므로 equals()는 false다.

      만약 안에 들어있는 값을 비교하고 싶다면 주소비교가 아닌 .value를 통해 비교를 해야한다.(서로 다른 객체를 equals로 비교하면 항상 false가 나오므로)
      그런데 이때, obj.value()는 에러가 나므로 Value로 형변환을 해줘야 한다.
      이때 참조변수의 형변환 전에는 반드시 instanceof로 확인해야한다. 따라서 최종 버전은 아래와 같다.
      Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교

  • 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩 해야한다.

hashCode()

  • 객체의 해시코드(hash code)를 반환하는 메서드
    • 해싱이라는 알고리즘에서 사용하는 정수값이다.
  • Object 클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환한다.
  • equals()를 오버라이딩하면, hashCode()도 같이 오버라이딩 해야 한다.
    • 객체의 주소를 가지고 작업을 한다는 공통점이 있는데, 주소를 iv를 가지고 작업하게 오버라이딩을 해준다.
      • equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문!
    String str1 = new String("abc");
    String str2 = new String("abc");
    System.out.println(str1.equals(str2)); //true
    System.out.println(str1.hashCode());   //96354
    System.out.println(str2.hashCode());   //96354

equals()가 true면 hashCode()값도 같아야 한다.


toString()

  • toString(): 객체를 문자열(String)으로 변환하기 위한 메서드
    여기서 오버라이딩을 해주면 아래처럼 나온다.

오버라이딩을 해주는 이유는
객체 == iv 의 집합 이므로 객체를 문자열로 변환한다는 것은 iv의 값을 문자열로 변환한다는 것과 같다.


만약 equals()도 오버라이딩을 해준다면?
kind는 String이니까 this.kind == c.kind가 아니라 this.kind.equals(c.kind)로 해준다.
그런데 equals()를 오버라이딩 해주면, hashCode()도 오버라이딩을 해줘야한다.
참고로 Objects.hash() 안에 인자는 1개여도 되고 여러개여도 된다.

0개의 댓글