[Java] Object Class
★Object클래스는 모든 클래스의 최상위 클래스이다. 명시적으로 상속하지 않아도 이미 상속이 되어 있다.
★Object클래스의 기본 메소드 1 : toString() : 클래스명@식별번호가 기본적으로 출력되며 변경가능. 출력할 때 toString을 쓰지 않아도 자동으로 toString해줌
@Override
public String toString() {
return super.toString() + ", " + hashCode() + ", 이름 : " + name + ",
나이 : " + age + ", 생년월일 : " + format.format(birthday.getTime());
}
★Object클래스의 기본 메소드 2 : clone() : 객체를 복제하며 Object를 반환하므로 다운 캐스팅해서 사용한다. 기본적으로 사용은 가능한 함수이지만 Cloneable인터페이스를 구현한 클래스만 복제할 수 있다. 이 인터페이스는 빈 인터페이스이며 자바에게 복제가능한 클래스란걸 알려주기위한 구분 인터페이스이다.
★Object클래스의 기본 메소드 3 : equals() : 비교할때 사용, 비교방법을 달리 하려면 여기서 오버라이드
★객체의 3가지 비교법
- ”==”연산은 피연산자가 기본자료형인 경우는 값이 같은지를 비교, 그 외의 객체라면 주소값이 같은지를 비교한다.
- Object.equals()함수는 디폴트로 “==” 연산을 실행하도록 되어있으므로 주소값이 다르면 false를 반환하지만 개발자의 의도에 따라 자유롭게 설정할 수 있다. 함수의 주소값이 아니더라도 내용이 같다면 같은 객체로 할수 있으며 이걸 ‘equality(동등성) 비교’라고 한다.
- hashCode를 이용 : hashCode는 두 객체가 동일한 객체인지를 판단한다. ‘identity(동일성) 비교’.
equals를 재정의 할 때는 hashCode를 함께 재정의 해줘야 부작용이 없다.
equals만 정의해서 두 객체가 같다고 판단 되었는데 두 객체가 hashCode가 다른경우
중복을 자동으로 없애주는 Set, HashTable, HashMap과 같은 Collection객체에 넣었을 때 중복되어 저장되어버리는 경우가 생긴다.
이런 Collection객체들은 hashCode()를 이용해서 객체의 중복성을 검사한다.
즉, equals()가 true인 두 객체의 hashCode는 같아야 한다.
또한 equals에서 비교하는데 사용한 파라메터들은 hashCode()에서도 빠짐없이 사용해줘야 한다.
[equals]를 재정의할 때는 일반 규약을 따르자
equals 메서드는 재정의하기 쉬워 보이지만 실수할 여지가 많다.
만약 재정의 하지 않는다면 그 경우에는 자기 자신하고만 같다. 만약 아래 조건이 부합한다면 그래도 된다.
- 각각의 객체가 고유하다.
- 클래스에 논리적 동일성 검사 방법이 있건 없건 상관 없다.
- 상위 클래스에서 재정의한 equals가 하위 클래스에서 사용하기에도 적합하다.
- 클래스가 private 또는 packing-private선언 되고 equals메서드를 호출할 일이 없다.
equals 메서드는 동치 관계를 구현한다.
- 반사성 : null이 아닌 참조 x가 있을때 x.equals(x)는 true를 반환한다.
- 대칭성 : null이 아닌 참조 x와 y가 있을 때 x.equals(y)는 y.equals(x) 가 true일때만 true를 반환한다.
- 추이성 : null이 아닌 참조 x,y,z가 있을 때 x.equals(y)가 true이고 x.equals(z)가 true면 x.equals(z)도 true이다.
- 일관성 : null이 아닌 참조 x,y가 있을 때 equals 통해 비교되는 정보에 아무 변화가 없다면 호출 결과는 횟수에 상관 없이 항상 같아야 된
- null 아닌 참조 x에 대하여 x.equals(null)은 항상 false이다.
@Override
public boolean equals(Object obj) {
SomeClass sc = (SomeClass)obj;
if (name.equals(sc.getName()) && age == sc.getAge()) {
return true;
}
return false;
}
★Object클래스의 기본 메소드 4 : hashCode() : 메모리에서 가진 hash주소 값을 반환해준다. 기본적으로 hash는 서로 다른 객체가 같은 값을 갖는 경우도 있다. 하지만 hash함수를 쓰는 Collection객체 등이 있으므로 함께 사용하는것. hashCode() 와 관련된 규약
- equals() 로 비교시 두개의 오브젝트가 같다면, hashCode() 값도 같아야 한다.
- equals() 로 비교시 false 라면, hashCode() 값은 다를수도, 같을수도 있다. 그러나 성능을 위해서는 hashCode() 값이 다른것이 낫다. 그래야 해싱 알고리즘으로 Set 에 해당 오브젝트가 존재하는지 아닌지 빠르게 검색할 수 있다.
- hashCode() 값이 같다고 해서, equals()가 true 를 리턴하는 것은 아니다. 해싱 알고리즘 자체의 문제로, 같은 해시값이 나올 수 있다.
★Object클래스의 기본 메소드 5 : finalize() : 객체가 소멸될 때 호출된다. 커스텀 안하기를 권유되고있음 }