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