Object Class

Java의 최상위 클래스

  • 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
  • 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
    • toString(), equals(Object obj), hashCode(),…

toString()

  • 객체의 문자 정보를 리턴한다.
    • 객체 문자 정보 : 객체를 문자열로 표현한 값
    • 기본적으로 Object 클래스의 toString() 메서드는 “클래스명@16진수해시코드” 로 구성된 문자 정보를 리턴
    • Object의 하위 클래스는 toString() 메서드를 오버라이딩 하여 간결하고 유익한 정보를 리턴하도록 되어 있다.
    • System.out.println() 메서드의 매개변수로 참조타입을 넘겨주면 객체의 toString() 메서드를 호출하여 리턴값을 받아서 출력하도록 되어 있다.

equals(Object obj)

  • 객체를 비교하여 참 거짓을 리턴한다.
    • 객체의 주소를 비교
  • 객체의 인스턴스 변수의 값을 비교하고자 한다면 오버라이딩 해야한다.

hashCode()

  • 실행중에 객체의 유일한 integer값을 반환한다.
  • Object클래스에서는 heap에 저장된 객체의 메모리 주소를 반환하도록 되어있다.
  • public native int hashCode();
  • native란?
    • OS가 가지고 있는 메서드(C언어로 작성되어있는 경우가 많음)
    • JNI
      • OS가 가진 메서드를 java 메서드와 연결해준다.
        • java메서드를 호출할 시 , C나 C++로 작성된 함수가 실행됨
  • OS가 가지고 있는 메서드가 객체의 주소를 int 값으로 반환해준다! 자바에서는 그걸 사용할 뿐!
  • 그러므로 객체의 지문이라고함
    • 객체마다 다른 값을 가지기 때문
  • equals()를 오버라이딩 하면, hashCode()도 오버라이딩 해야한다.
    • 두 함수의 공통점은 객체의 주소를 가지고 작업을 한다는 것이다.
    • equals는 보통 주소가 아니라 객체의 멤버변수를 가지고 작업하도록 오버라이딩 한다.
      • 그렇게 되면 hashCode()도 멤버변수를 가지고 작업하도록 오버라이딩 해야한다.
        • equals() 결과가 true 이면 두 객체의 해시코드는 같아야한다.

왜 그럴까?

hash 값을 사용하는 Collection(HashSet, HashMap, HashTable)을 사용할 때 문제가 발생한다.

hash값을 사용하는 Collection은 객체가 논리적으로 같은지 비교할 때 위의 과정을 거친다.

  • hashCode 메서드의 리턴값이 우선 일치하고 equals 메서드의 리턴 값이 true여야 논리적으로 같은 객체라고 판단함.

그렇다면 무조건 같이 재정의 해줘야할까?

  • hash 값을 사용하는 Collection을 사용하지 않는다면 equals와 hashCode를 같이 재정의 하지 않아도 된다라고 생각할 수 있지만
  • 요구사항은 항상 변하고,협업환경에서 무조건(hashSet, HashMap, HashTable 사용안할거야!!!)이라는건 없다.
  • 굳이 위험한 코드를 안고 가지말고 항상 같이 재정의 해줘야 한다고 생각한다.

'Computer science > JAVA' 카테고리의 다른 글

Thread  (1) 2023.01.02
Casting  (0) 2023.01.01
String Class  (0) 2023.01.01
Serialization(직렬화)  (0) 2022.12.25
오토 박싱 & 오토 언박싱  (0) 2022.12.25

+ Recent posts