JNI(java native interface)가 한다.protected Object clone() : 객체 자신의 복사본을 반환한다.public boolean equals(Object obj) :객체 자신과 객체 obj가 같은 객체인지 알려준다.protected void finalize() : 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다.public Class getClass() : 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다.public int hashCode() : 객체 자신의 해시코드를 반환한다.public String toString() : 객체 자신의 정보를 문자열로 반환한다.public void notify() : 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다.public void notifyAll() : 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다.public void wait(), wait(long timeout), wait(long timeout, int nanos) class Poketmon implements Cloneable {
String name;
Poketmon(String name) {
this.name = name;
}
@Override
public Object clone() {
Object obj = null;
try {
obj = super.clone(); // clone()은 반드시 예외처리를 해주어야 한다.
} catch(CloneNotSupportedException e) {}
return obj;
}
}
class CloneEx {
public static void main(String[] args){
Poketmon original = new Poketmon(3, 5);
Poketmon copy = (Poketmon)original.clone(); // 복제(clone)해서 새로운 객체를 생성
System.out.println(original);
System.out.println(copy);
}
}
Poketmon{name='메타몽'}
Poketmon{name='메타몽'}
@Override
public Poketmon clone() {
Object obj = null;
try {
obj = super.clone();
} catch(CloneNotSupportedException e) {}
return obj;
}
// Poketmon copy = (Poketmon)original.clone();
Poketmon copy = original.clone();
public final class Class implements ... { ... }
// case1: 생성된 객체로부터 얻는 방법
Class cObj = new Poketmon().getClass();
// case2: 클래스 리터럴(*.class)로 부터 얻는 방법
Class cObj = Poketmon.class;
// case3: 클래스 이름으로 부터 얻는 방법
// 특히 클래스 파일, 예를 들어 데이터베이스 드라이버를 메모리에 올릴 때 주로 사용
Class cObj = Class.forName("Poketmon");
Poketmon p = new Poketmon(); // new 연산자를 이용한 객체 생성
Poketmon p = Poketmon.class.newInstance(); // Class객체를 이용한 객체 생성
목적 : 인스턴스에 대한 정보를 문자열로 제공하기 위해
public String toString() {
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
목적 : 물리적으로 다른 메모리에 위치하는 객체여도 논리적으로 동일함을 구현하기 위해
public boolean equals(Object obj) {
return (this == obj)
}
x.equals(x)는 true여야 한다.y.equals(x)가 true이면, x.equals(y)도 true여야 한다.x.equals(y)가 true이고, y.equals(z)도 true이면, x.equals(z) 또한 true여야 한다.equals 비교에 필요한 정보가 수정되지 않았다면, x.equals(y)를 여러 차례 실행한 결과는 일관성 있게 true만 리턴하거나 false만 리턴해야 한다.x.equals(null)은 false여야 한다. // Date Class
public boolean equals(Object obj) {
return obj instanceof Date && getTime() == ((Date) obj).getTime();
}
// Timestamp class
public boolean equals(Timestamp ts) {
if (super.equals(ts)) { // java.util.Date.equals
if (nanos == ts.nanos) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public boolean equals(java.lang.Object ts) {
if (ts instanceof Timestamp) {
return this.equals((Timestamp)ts);
} else {
return false;
}
}
date.equals(timestamp) : date 기준으로 시간이 같은지만 검사하므로 true가 된다.timestamp.equals(date) : date는 Timestamp의 인스턴스가 아니므로 false가 된다. 인스턴스 검사를 하지 않고 date가 timestamp로 형변환이 가능하다 쳐도, nanos 검사에서 false가 나올 수 밖에 없다.목적: 객체의 동일성을 위해 구현
hashCode 메소드를 호출한 결과는 항상 똑같은 integer 값이어야 한다.equals 메소드가 참고하는 정보가 변경되지 않았다면 hashCode 값은 달라지지 않는다. Fruit f1 = new Fruit("apple", 10);
Fruit f2 = new Fruit("apple", 10);
boolean b = f1.equals(f2);
int hashCode1 = f1.hashCode();
int hashCode2 = f2.hashCode();
hashCode 값이 반드시 달라야 하는 것은 아니다.hashCode 값을 가지면 좋다.https://atoz-develop.tistory.com/
https://yoonemong.tistory.com/193
https://github.com/castello/javajungsuk3
https://docs.oracle.com/en/java/javase/11/docs/api/index.html