✔ Object 클래스
Object 클래스란?
- 모든 자바 클래스의 최상위 클래스
인스턴스 소멸 시 해야 할 일이 있다면?
- Obejct 클래스에 정의되어 있는 finalize 메소드
- 아무도 참조하지 않는 인스턴스가 가비지 컬렉션에 의해 소멸되기 전에 자동으로 호출됨
- 인스턴스 소멸 시 반드시 실행해야 할 코드가 있다면 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());
}
}
'Java-Spring > 열혈 Java 프로그래밍' 카테고리의 다른 글
[Java] 제네릭 (0) | 2023.08.11 |
---|---|
[Java] 자바의 기본 클래스 (0) | 2023.08.10 |
[Java] 예외처리 (0) | 2023.08.08 |
[Java] 인터페이스와 추상 클래스 (0) | 2023.08.07 |
[Java] 클래스의 상속 (0) | 2023.08.05 |