인스턴스 소멸 시 반드시 실행해야 할 코드가 있다면 finalize 메소드의 오버라이딩을 고려
Object와 같이 자바에서 제공하는 클래스의 메소드라면 오버라이딩 된 메소드를 호출하는 것이 안전
class Person {
String name;
public Person(String name) {
this.name = name;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("destroyed: " + name);
}
}
인스턴스의 비교
Obejct 클래스에 정의되어 있는 equals 메소드
== 연산자는 참조변수의 참조 값을 비교하므로 서로 다른 두 인스턴스의 내용을 비교하려면 이를 사용
클래스 내에 선언된 인스턴스 변수의 내용을 비교하여 그 결과에 따라 true 또는 false를 반환하도록 오버라이딩
두 인스턴스의 내용 비교 결과인 true, false의 반환 조건은 해당 클래스를 정의하는 프로그래머가 결정
class INum {
private int num;
public INum(int num) {
this.num = num;
}
@Override
public boolean equals(Object obj) {
if(this.num == ((INum)obj).num)
return true;
else
return false;
}
}
원래의 Object 클래스의 equals 메소드 == 연산자와 마찬가지로 참조변수의 값을 비교하도록 정의되어 있음
그런데 == 연산을 통해 이미 참조 값 비교는 가능하므로 equals 메소드는 내용 비교가 이뤄지도록 오버라이딩 하라고 존재하는 메소드
자바에서 제공하는 표준 클래스의 경우 equals 메소드가 내용 비교를 하도록 이미 오버라이딩 되어 있는 경우가 많음
예) String 클래스
인스턴스의 복사
Obejct 클래스에 정의되어 있는 clone 메소드
호출된 메소드가 속한 인스턴스의 복사본이 생성되고, 이렇게 만들어진 복사본의 참조 값이 반환됨
단, 마커 인터페이스인 Cloneable 인터페이스를 구현한 인스턴스를 대상으로 메소드를 호출할 수 있으므로 클래스를 정의하는 과정에서 인스턴스 복사의 허용 여부를 결정하여 인터페이스를 구현
class Point implements Cloneable {
private int xPos;
private int yPos;
public Point(int x, int y) {
xPos = x;
yPos = y;
}
@Override
public Object clone() throw CloneNotSupportedException {
return super.clone();
}
}
인스턴스 변수의 깊은 복사
복사할 인스턴스의 멤버가 참조변수로 이뤄져 있을 때는, 복사 과정에서 참조변수가 지니는 참조 값이 그대로 새 인스턴스에 복사되는 얕은 복사를 하게 됨
깊은복사가 이뤄지도록 하려면 다음과 같은 형식으로 오버라이딩 해야 함
class Point implements Cloneable {
private int xPos;
private int yPos;
public Point(int x, int y) {
xPos = x;
yPos = y;
}
@Override
public Object clone() throw CloneNotSupportedException {
return super.clone();
}
}
class Rectangle implements Cloneable {
private Point upperLeft;
private Point lowerRight;
public Rectangle(int x1, int y1, int x2, int y2) {
upperLeft = new Point(x1, y1);
lowerRight = new Point(x2, y2);
}
@Override
public Object clone() throw CloneNotSupportedException {
Rectangle copy = (Rectangle)super.clone();
copy.upperLeft = (Point)upperLeft.clone();
copy.lowerRight = (Point)lowerRight.clone();
return copy;
}
}
// 얕은 복사 : orign = [1, 1] [9, 9] -> copy -> orign change [2, 2] [7, 7] -> copy = [2, 2], [7, 7]
// 깊은 복사 : orign = [1, 1] [9, 9] -> copy -> orign change [2, 2] [7, 7] -> copy = [1, 1], [9, 9]
clone 메소드의 반환형 수정
clone 메소드는 반환형이 Object이므로 clone 메소드를 호출하면서 동시에 형 변환도 진행해야 함
자바 5 이후부터는 오버라이딩 과정에서 반환형이 클래스의 이름과 같을 때 반환형의 수정을 허용하게 됨
그러므로 형 변환 없는 clone 메소드의 호출이 가능함
class Point implements Cloneable {
private int xPos;
private int yPos;
public Point(int x, int y) {
xPos = x;
yPos = y;
}
@Override
public Point clone() throw CloneNotSupportedException {
return (Point)(super.clone());
}
}