[자바] 5. 모든 자바 클래스의 부모 Object 클래스

개발자 춘식이·2023년 7월 22일
0

Java

목록 보기
5/8
post-thumbnail

도서 자바의신, 이것이 자바다를 참고하였습니다.

1. Object

모든 자바 클래스의 부모는 java.lang.Object 클래스입니다. 아무런 상속을 받지 않으면, Object 클래스를 확장합니다.
Object 클래스에 선언되어 있는 메소드는 두 가지로 분류될 수 있습니다.

  • 객체를 처리하기 위한 메소드
  • 쓰레드를 위한 메소드

1) 객체를 처리하기 위한 메소드

  • public boolean equals(Object obj) : 현재 객체와 파라미터로 넘어온 obj 객체가 같은지 확인함.
  • public int hashCode() : 객체에 대한 해시코드값(16진수로 제공되는 객체의 메모리 주소)을 리턴함.
  • public String toString() : 객체를 문자열로 표현한 값 리턴함.
  • public Class<?> getClass() : 현재 객체의 Class 클래스 객체를 리턴함.
  • protected void finalize() : 현재 객체가 더 이상 쓸모없을 때 GC에 의해 호출됨.
  • protected Object clone() : 객체의 복사본을 만들어 리턴함.

2) 쓰레드 처리를 위한 메소드

  • public void notify(): 이 객체의 모니터에 대기하고 있는 단일 쓰레드를 깨움.
  • public void notifyAll(): 이 객체의 모니터에 대기하고 있는 모든 쓰레드를 깨움.
  • public void wait() : 다른 쓰레드가 현재 객체에 대한 notify()나 notifyAll()을 호출할 때 까지 현재 쓰레드가 대기하고 있도록 함.
  • public void wait(long timeout) : wait()와 동일한 기능을 제공하며, timeout만큼 대기함. 즉, timeout을 넘을 경우 현재 쓰레드는 다시 깨어나고, 시간은 밀리세컨드(1/1,000)초 단위임.
  • public void wait(long timeout, int nanos) : 위 메소드보다 더 자세한 밀리초+나노초(1/10억초) 만큼 대기함. nanos값은 0~999,999 사이의 값만 지정 가능함.

2. toString()

toString() 메소드는 System.out.println()과 같은 출력 메소드에 매개 변수로 들어가는 경우 혹은 객체에 더하기 연산을 하는 경우 자동 호출됩니다. 재정의를 해주지 않았을 경우 다음과 같은 결과값을 리턴합니다.
getClass().getName() + '@' + Integer.toHexString(hashCode())

  • getClass().getName() : 현재 클래스의 패키지명과 클래스명을 리턴함.
  • hashCode() : int 타입으로 반환되는 객체 해시코드 값
  • Integer.toHexString() : int값을 16진수로 변환함.

3. equals()

객체의 값을 비교할 때는 == 또는 !=를 사용하는 것은 지양하고, equals() 메소드를 사용하는 것이 좋습니다. ==는 주소값을 비교하기 때문에 기본자료형만 사용 가능합니다.
equals() 메소드를 오버라이딩하지 않으면 hashCode() 값을 비교하기 때문에, equals() 메소드를 오버라이딩할 때 hashCode()도 같이 오버라이딩해 주어야 합니다. 만약 둘 다 함께 재정의하지 않으면 Collection(HashSet, HashMap, HashTable)을 사용할 때 문제가 발생합니다.
equals() 메소드를 오버라이딩할 때 지켜야 할 5가지는 다음과 같습니다. (모두 null이 아니라는 전제 하)

  • 재귀(reflexive) : X 객체의 X.equals(X)는 항상 같아야 함.
  • 대칭(symmetric) : X, Y 객체에서 Y.equals(X)가 true를 리턴하면 X.equals(Y)도 true를 리턴해야 함.
  • 타동적(transitive) : X, Y, Z 객체에서 X.equals(Y)가 true이고, Y.equals(Z)가 true면 X.equals(Z)도 true를 리턴해야 함.
  • 일관(consistent) : X, Y 객체에서 객체가 변경되지 않은 상황에서는 몇 번을 호출하더라도 X.equals(Y)는 항상 true이거나 false여야 함.
  • null과의 비교 : X 객체의 X.equals(null)은 항상 false여야 함.

4. hashCode()

hashCode() 메소드는 기본적으로 객체의 메모리 주소를 16진수로 리턴합니다. 만약, 어떤 2개의 객체가 서로 동일하다면, hashCode()는 무조건 동일해야 합니다.
hashCode()를 오버라이딩시 지켜야 할 조건은 다음과 같습니다.

  • 자바 애플리케이션이 수행되는 동안, 어떤 객체에 대해서 이 메소드가 호출될 때에는 항상 동일한 int값을 리턴해야 합니다. 단, 자바를 실행할 때마다 같은 값일 필요는 없습니다.
  • 어떤 두 객체에 대하여 equals()가 true일 경우, 두 객체의 hashCode()는 동일한 int값을 리턴해야 합니다.
  • 두 객체의 equals()가 false를 리턴했다고 해서, hashCode()값이 무조건 달라야 할 필요는 없지만, 서로 다른 int값을 제공하면 hashtable의 성능 향상에 도움이 됩니다.

지속적으로 수정해나갈 예정입니다.
2023-07-22 v1.0

profile
춘식이를 너무 좋아하는 주니어 백엔드 개발자입니다.

0개의 댓글