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 notifyAll() | 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다. |
public void wait() public void wait(long timeout) public void wait(long timeout, int nanos) |
다들 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout nanos)동안 기다리게 한다. (timeout은 천 분의 1초, nonos는 10^9분의 1초) |
- Object클래스는 멤버변수가 없고 오직 11개의 메서드만 가지고 있다. (11개는 모든 인스턴스가 가져야 할 기본적인 것들)
ObjectClassMethod - equals()
매개변수로 객체의 참조변수를 받아서 비교(주소값 비교)하여 그 결과를 boolean값으로 알려준다.
객체를 생성할 때, 메모리의 비어있는 공간을 찾아 생성한다.
- 서로 다른 두 개의 객체가 같은 주소를 갖는 일은 있을 수 없다.
- 두 개 이상의 참조변수가 같은 주소값을 갖는 것(한 객체를 참조)은 가능하다.
equals()- 오버라이딩
public class Study {
public static void main(String[] args) {
Person p1 = new Person(1);
Person p2 = new Person(1);
if (p1.equals(p2)) {
System.out.println("true");
}
else
System.out.println("false");
}
}
class Person {
long id;
@Override
public boolean equals(Object obj) { // 나만의 기준으로 비교
if (obj instanceof Person) return id == ((Person)obj).id;
//obj가 Object타입이라서 Person의 id값을 참조하기 위해서는 형변환 해줘야 된다.
else return false;
}
Person(long id) {
this.id = id;
}
}
- equals메서드가 Person인스턴스의 주소값이 아닌 멤버변수 id의 값을 비교하도록 나만의 기준으로 오버라이딩
ObjectClassMethod -hashCode()
해싱(hashing)기법에 사용되는 ‘해쉬함수(hash function)’을 구현한 것이다.
해싱 → 데이터관리기법 중 하나 (다량의 데이터를 저장하고 검색하는데 유용하다.)
- 찾고자 하는 값을 입력하면 그 값이 저장된 위치를 알려주는 해시코드(hashcode)를 반환
일반적으로 해시코드가 같은 두 객체가 존재하는 것이 가능하지만 Object클래스에 정의된 hashCode메서드는 객체의 주소값을 이용해서 해시코드를 만들어 반환하기 때문에 서로 다른 두 객체는 결고 같은 해시코드를 가질 수없다.
- 단 64bit JVM에서는 주소가 64bit이므로 주소를 해시코드(32 bit)로 변환하면 중복된 값이 나올 수도 있다.
클래스의 인스턴스변수 값으로 객체를 같고 다름을 판단해야하는 경우라면 equal메서드 뿐 만아니라 hashCode메서드도 적절히 오버라이딩 해야된다.
- 같은 객체라면 hashCode메서드를 호출했을 때의 결과값인 해시코드도 같아야 하기 때문
- hashCode메서드를 오버라이딩 하지않으면 Object클래스에 정의된 대로 모든 객체가 서로 다른 해시코드값을 가질 것이다.
String클래스는 조금 다르다. -> 참고글
public static void main(String[] args) {
String test1 = new String("hi");
String test2 = new String("hi");
System.out.println(test1.equals(test2));
System.out.println(test1.hashCode());
System.out.println(test2.hashCode());
System.out.println(System.identityHashCode(test1));
System.out.println(System.identityHashCode(test2));
}
/* 출력
true
3329
3329
453211571
796684896
*/
- String클래스는 문자열의 내용이 같으면, 동일한 해시코드를 반환하도록 hashCode메서드가 오버라이딩 되어있다.
- System.*identityHashCode*(Object x) 는 Object클래스의 hashCode메서드처럼 객체의 주소값으로 해시코드를 생성하기 때문에 모든 객체에 대해 항상 다른 해시코드값을 반환할 것을 보장한다. (test1,test2는 해시코드가 같지만 서로다른 객체라는 것을 알 수 있다.
- String test2 = test1; test1의 객체의 주소값을 참조하는 test2일경우 주소값이 같아서 동일함
- String test2 = test1; 서로 같은 객체라서 해시코드도 동일하다.
ObjectClassMethod -toString()
인스턴스에 대한 정보를 문자열(String)로 제공할 목적으로 정의한 것
- 인스턴스의 정보를 제공한다는 것은 대부분의 경우 인스턴스 변수에 저장된 값들을 문자열로 표현을 의미
Object클래스에 정의된 toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
클래스를 작성할 때 toString()을 오버라이딩하지 않으면 위의 내용이 그대로 사용된다.
- toString()을 호출하면 클래스이름과 16진수의 해시코드를 얻게 된다.
toString() -오버라이딩
String클래스의 toString() → String인스턴스가 갖고 있는 문자열을 반환하도록 오버라이딩 되어있다.
Date클래스의 toString() → Date인스턴스가 갖고 있는 날짜와 시간을 문자열로 반환하도록 오버라이딩 되어있다.
toString()은 일반적으로 인스턴스나 클래스에 대한 정보 또는 인스턴스 변수들의 값을 문자열로 변환하여 반환하도록 오버라딩되는 것이 보통이다.
public static void main(String[] args) {
Person p1 = new Person(1);
System.out.println(p1.toString()); //Person@2f7c7260
System.out.println(p1.hashCode()); //796684896
}
@Override
public String toString() {
return "id : " + id;
}
/* 출력
오버라이딩 전 -> Person@2f7c7260 클래스@해시코드(16진수)
오버라이딩 후 -> id : 1
해시코드 -> 16진수 2F7C7260 -> 10진수 796684896
*/
Object클래스에 정의된 toString()의 접근제어자가 public이므로 Person클래스의 toString()의 접근제어자도 public으로 했다는 것을 볼 수 있다.
- 부모에 정의된 메서드를 자손에서 오버라이딩할 때는 부모에 정의된 접근범위보다 같거나 더 넓어야 하기 때문이다.
참고
[java] String 클래스와 StringBuffer
(클래스로더 공부해서 좀 더 추가하기) C언어에서는 문자열을 char형의 배열로 다루었으나 Java에서는 문자열을 위한 String클래스를 제공한다. String클래스는 문자열을 저장하고 이를 다루는데 필
uhanuu.tistory.com
[java] 오버로딩 오버라이딩
오버로딩 메서드도 변수와 마찬가지로 클래스 내에서 구별가능해야 한다. Java에서는 같은 이름으로 여러개의 메서드를 정의할 수 있는데 이를 메서드 오버로딩 또는 간단히 오버로딩이라고 한
uhanuu.tistory.com
'책 > Java의 정석' 카테고리의 다른 글
Optional<T> (0) | 2023.03.24 |
---|---|
[java] 래퍼(wrapper)클래스 && Number클래스 (0) | 2023.02.10 |
[java] String 클래스와 StringBuffer (0) | 2023.02.09 |
[java] 예외처리(3) (0) | 2023.02.07 |
[java] 예외처리(2) (0) | 2023.02.07 |