1. Object 클래스
Object 클래스는 모든 클래스의 최고 조상이기 때문에 Object 클래스의 멤버들은 모든 클래스에서 바로 사용 가능하다.
Object 클래스의 메서드 | 설 명 |
protected Object clone() | 객체 자신의 복사본을 반환한다. |
public boolean equals(Object obj) | 객체 자신과 객체 obj가 같은 객체인지 알려준다. (같으면 true) |
protected void finalize() | 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다. 이 때 수행되어야하는 코드가 있을 때 오버라이딩한다. (거의 사용안함) |
public Class getClass() | 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다. |
public int hashCode() | 객체 자신의 해쉬코드를 반환한다. |
public String toString() | 객체 자신의 정보를 문자열로 반환한다. |
public void notify() | 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다. |
public void notifiyAll() | 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다. |
public void wait() public void wait(long timeout) public void wait(long timeout, int nanos) |
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간 (timeout,nanos) 동안 기다리게 한다. (timeout은 천분의 1초, nanos는 10^9분의 1초) |
Object 클래스는 멤버변수는 없고 오직 11개의 메서드만 가지고 있다.
2. Object - equals()
매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean 값으로 알려주는 역할을 한다.
public boolean equals(Object obj){
return(this == obj);
}
두 객체의 같고 다름은 참조 변수의 값으로 판단한다. 그렇기 때문에 서로 다른 두 객체를 Equals 메서드로 비교하면 항상 false를
결과로 얻게 될 수 밖에 없다.
- false 된 모습
두 value의 값이 10으로 서로 같을지라도 equals 메서드로 비교한 결과는 false 일 수 밖에 없다.
Object클래스로 부터 상속받은 equals()메서드는 결국 두개의 참조변수가 같은 객체를 참조하고 있는지 밖에 판단할 수 없다.
equals() 메서드로 Valuee 인스턴스가 가지고 있는 value 값을 비교하도록 할 수는 없을까?
Value 클래스에서 equals 메서드를 오버라이딩하여 주소가 아닌 객체에 저장된 내용을 비교하도록 변경하면 된다.
equals 메서드가 Person 인스턴스의 주소값이 아닌 멤버변수 id 값을 비교하기 위해 오버라이딩 하였다. 이렇게 함으로써
다른 인스턴스일지라도 같은 id를 가지고 있다면 equals 메서드로 비교했을 때 true 결과로 얻게 할 수 있다.
3. Object - hashCode()
이 메서드는 해싱(hashing) 기법에 사용되는 '해시함수(hash function)'를 구현한 것이다. 해싱은 데이터관리기법 중의
하나인데 다량의 데이터를 저장하고 검색하는데 유용하다. 해시함수는 찾고자 하는 값을 입력하면, 그 값이
저장된 위치를 알려주는 해시코드(hashcode)를 반환한다.
일반적으로 해시코드 같은 두 객체가 존재하는 것은 가능하지만, Object클래스에 정의된 hashCode메서드는
객체 주소값을 이용해서 해시코드를 만들어 반환하기 때문에 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다.
단, 64 bit JVM 에서는 주소가 64 bit 이므로 주소를 해시코드(32 bit)로 변환하면 중복된 값이 나올 수도 있다.
앞서 살펴본 것과 같이 클래스의 인스턴스 변수 값으로 객체의 같고 다름을 판단해야하는 경우라면 equals 메서드 뿐만 아니라
hashCode메서드도 적절히 오버라이딩해야 한다. 같은 객체라면 hashCode메서드를 호출했을 때의 결과 값인 해시코드도 같아야 하기
때문이다. 만일 hashCode 메서드를 오버라이딩하지 않는다면 Object 클래스에 정의된 대로 모든 객체가 서로 다른 해시코드 값을
가질 것이다.
String 클래스는 문자열의 내용이 같으면, 동일한 해시코드를 반환하도록 hashCode 메서드가 오버라이딩 되어 있기 때문에,
문자열의 내용이 같은 str1과 str2에 대해 hashCode()를 호출하면 항상 동일한 해시코드 값을 얻는다.
반면에 System.identityHashCode(Object x)는 Object클래스의 hashCode 메서드처럼 객체의 주소값으로 해시코드를
생성하기 때문에 모든 객체에 대해 항상 다른 해시코드 값을 반환할 것을 보장한다. 그래서 str1과 str2의 해시코드는 같지만
서로 다른 객체라는 것을 알 수 있다.
3. Object - toString()
이 메서드는 인스턴스에 대한 정보를 문자열(String)으로 제공할 목적으로 정의된 것이다. 인스턴스의 정보를 제공한다는 것은
대부분의 경우 인스턴스 변수에 저장된 값들을 문자열로 표현한다는 뜻이다.
Object 클래스에 정의된 toString()은 아래와 같다.
public String toString(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
인스턴스를 두 개 생성한 후 toString()을 호출했지만 오버라이딩 하지 않았기 때문에 해시코드가 출력되었다.
서로 다른 인스턴스에 대해서 toString()을 호출하였으므로 클래스의 이름은 같아도 해시코드값이 다르다는 것을 확인할 수 있다.
4. String - toString()
String 클래스의 toString()은 String 인스턴스가 갖고 있는 문자열을 반환하도록 오버라이딩 되어 있고,
Date클래스의 경우, Date인스턴스가 갖고 있는 날짜와 시간을 문자열로 변환하여 반환하도록 오버라이딩 되어 있다.
이처럼 toString()은 일반적으로 인스턴스나 클래스에 대한 정보 또는 인스턴스 변수들의 값을 문자열로 변환하여 반환하도록
오버라이딩 되는 것이 보통이다.
Object 클래스에 정의된 toString()의 접근 제어자가 public이므로 Card2클래스의 toString()의 접근 제어자도 public으로
했다는 것을 눈여겨볼 필요가 있다. 조상의 정의된 메서드를 자손에서 오버라이딩 할 때 접근 범위가 보다 같거나 넓어야 하기 때문이다.
Object클래스에서 toString()의 접근 제어자가 public 이므로 , 이를 오버라이딩 하는 Card2클래스에서는 toString()의 접근 제어자를
public으로 해야한다.
'JAVA의 정석' 카테고리의 다른 글
String 클래스(2) - join()과 StringJoiner (0) | 2024.02.22 |
---|---|
String 클래스 (0) | 2024.02.22 |
예외 처리(4) - 사용자 정의 예외 만들기, 연결된 예외 (0) | 2024.01.29 |
예외 처리(3) - 예외 발생시키기, 예외 떠넘기기 (0) | 2024.01.29 |
예외 처리(2) - try-catch의 흐름, 멀티 catch블럭 (1) | 2024.01.28 |