도서 자바의신, 이것이 자바다를 참고하였습니다.
모든 자바 클래스의 부모는 java.lang.Object
클래스입니다. 아무런 상속을 받지 않으면, Object 클래스를 확장합니다.
Object 클래스에 선언되어 있는 메소드는 두 가지로 분류될 수 있습니다.
public boolean equals(Object obj)
: 현재 객체와 파라미터로 넘어온 obj 객체가 같은지 확인함.public int hashCode()
: 객체에 대한 해시코드값(16진수로 제공되는 객체의 메모리 주소)을 리턴함.public String toString()
: 객체를 문자열로 표현한 값 리턴함.public Class<?> getClass()
: 현재 객체의 Class 클래스 객체를 리턴함.protected void finalize()
: 현재 객체가 더 이상 쓸모없을 때 GC에 의해 호출됨.protected Object clone()
: 객체의 복사본을 만들어 리턴함.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 사이의 값만 지정 가능함.toString()
메소드는 System.out.println()과 같은 출력 메소드에 매개 변수로 들어가는 경우 혹은 객체에 더하기 연산을 하는 경우 자동 호출됩니다. 재정의를 해주지 않았을 경우 다음과 같은 결과값을 리턴합니다.
getClass().getName() + '@' + Integer.toHexString(hashCode())
객체의 값을 비교할 때는 ==
또는 !=
를 사용하는 것은 지양하고, equals() 메소드를 사용하는 것이 좋습니다. ==
는 주소값을 비교하기 때문에 기본자료형만 사용 가능합니다.
equals() 메소드를 오버라이딩하지 않으면 hashCode() 값을 비교하기 때문에, equals() 메소드를 오버라이딩할 때 hashCode()도 같이 오버라이딩해 주어야 합니다. 만약 둘 다 함께 재정의하지 않으면 Collection(HashSet, HashMap, HashTable)을 사용할 때 문제가 발생합니다.
equals() 메소드를 오버라이딩할 때 지켜야 할 5가지는 다음과 같습니다. (모두 null이 아니라는 전제 하)
hashCode() 메소드는 기본적으로 객체의 메모리 주소를 16진수로 리턴합니다. 만약, 어떤 2개의 객체가 서로 동일하다면, hashCode()는 무조건 동일해야 합니다.
hashCode()를 오버라이딩시 지켜야 할 조건은 다음과 같습니다.
지속적으로 수정해나갈 예정입니다.
2023-07-22 v1.0