자바의 신 12장 - 모든 부모 클래스는 Object에요

so2·2021년 6월 21일
0
post-custom-banner

java.lang.Object

  • 자바는 아무런 상속을 받지 않으면, java.lang.Object 클래스를 확장 → Object 클래스에 있는 메소드들을 통해서 클래스의 기본적인 행동을 정의할 수 있기 때문.

Object 클래스

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

객체 처리를 위한 메소드

필자가 경험상 많이 사용하는 6가지 메소드

public String toString()

  • 해당 클래스가 어떤 객체인지 나타낸다.
  • 출력값 : 클래스의 패키지 이름과 클래스 이름 + @ + 객체의 해시 코드 값
  • getClass().getName() + '@ + Integer.toHexString(hashCode())
  • 자동으로 호출되는 경우
    • System.out.println()
    • 객체에 대하여 더하기 연산을 하는 경우
  • Strng을 제외한 참조 자료형에 더하기 연산을 수행하면, 자동으로 toString() 메소드가 호출되어 객체의 위치에는 String 값이 들어간다.

public boolean equals(Object obj)

  • 참조 자료형에서는 "값"을 비교하는게 아니라 "주소값"을 비교한다.

  • 두 객체는 각각의 생성자를 사용하여 만들었기 떄문에 속성 값이 같더라도 주소 값이 다르다.

  • equals()메소드를 비교할 클래스에 Overriding하지 않으면 equals()메소드에서는 hashCode()값(주소값)을 비교한다.

  • equals() 메소드를 Overriding할 떄에는 hashCode()메소드도 같이 Overriding해야만 한다. 왜냐하면 equals()메소드를 Overriding해서 객체가 서로 같다고 이야기할 수는 있겠지만 그 값이 같다고 해서 그 객체의 주소 값이 같지는 않기 때문이다. 따라서, 같은 hashCode() 메소드 결과를 갖도록 하려면 hashCode() 메소드도 Object 클래스에서 제공하는 그대로 사용하면 안된다.

  • equals()메소드를 반드시 Overriding할 필요는 없다. 필요할 때만 Overriding한다.

    equals() 메소드를 overriding할 때 지켜야 할 조건
    1) 재귀 : null이 아닌 x라는 객체의 x.equals(x)결과는 항상 true여야 한다.
    2) 대칭 : null이 아닌 x,y객체가 있을 때 x.equals(y)가 true를 리턴했다면,
    y.equals(x)도 true를 리턴해야만 한다.
    3) 타동적 : null이 아닌 x,y,z가 있을 때, x.equals(y)가 true를 리턴하고,
    y.equals(z)가 true를 리턴하면, x.equals(z)는 반드시 true를 리턴해야한다.
    4) 일관 : null이 아닌 x,y가 있을 때 객체가 변경되지 않은 상황에서는 몇번을 호출하더라도
    x.equals(y)의 결과는 항상 true거나 항상 false여야만 한다.
    5) null과의 비교 : null이 아닌 x라는 객체의 x.equals(null) 결과는 항상 false여야만 한다.

public int hashCode()

  • 객체의 메모리 주소를 16진수로 리턴한다.
  • 자바 애플리케이션이 수행되는 동안에 어떤 객체에 대해서 이 메소드가 호출될 떄에는 항상 동일한 int 값을 리턴해 주어야 한다. 하지만, 자바를 실행할 때마다 같은 값이어야 할 필요는 없다.
  • equals()메소드를 override하면, hashCode()메소드도 override해서 동일한 결과가 나오도록 만들어야한다.
  • 어떤 두개의 객체에 대하여 equals()메소드를 사용하여 비교한 결과가 true일 경우에, 두 객체의 hashCode()메소드를 호출하면 동일한 int값을 리턴해야만 한다.
  • 두 객체를 equals()메소드를 사용하여 비교한 결과 false를 리턴했다고 해서, hashCode()메소드를 호출한 int값이 무조건 달라야 할 필요는 없다. 하지만, 이 경우에 서로 다른 int 값을 제공하면 hashtable의 성능을 향상시키는 데 도움이 된다.
  • equals()메소드나 hashCode()메소드를 작성하는 것은 별로 권장하지 않는다. 요즘 개발 툴에서는 이 메소드들을 자동으로 생성해주는 기능을 제공하고 있으므로, 그 기능을 사용할 것을 권장한다.

public Class<?> getClass()

  • 현재 객체의 Class 클래스의 객체를 리턴

protected Object clone()

  • 객체의 복사본을 만들어 리턴

protected void finalize()

  • 현재 객체가 쓸모 없어졌을 때 가비지 컬렉터에 의해 이 메소드가 호출된다.
post-custom-banner

0개의 댓글