Object 클래스
📌 Object 클래스
: 모든 자바 클래스의 최상위 클래스.
String toString( ) | 문자열 반환하는 메서드. |
boolean equals( ) | 두 인스턴스의 주소 값을 비교해 값을 반환하는 메서드. |
int hashCode( ) | 인스턴스의 저장 주소를 반환하는 메서드. |
Object clone( ) | 객체의 원본 복제하는데 사용하는 메서드. |
Class getClass( ) | 객체의 Class 클래스 반환하는 메서드. |
void finalize( ) | 가비지 컬렉터에 의해 호출되는 메서드. |
void wait( ) | 멀티스레드 프로그램에서 사용하는 메서드. |
Object 클래스 - 인스턴스 소멸
📌 protected void finalize( ) throws Throwable
: 어떤 참조 변수도 참조하지 않는 인스턴스가 가비지 컬렉션에 의해 소멸되기 전에 자동으로 호출되는 메소드.
📌 public static void gc( )
: 가비지 컬렉션의 수행을 요청.
가지비 컬렉션의 수행을 요청했다고 해서 바로 진행되지는 않으며, 소멸 대상을 그 순간 모두 소멸하지 않음.
시스템의 상황에 따라 일부 인스턴스의 완전한 소멸이 보류될 수 있음.
📌 public static void runFinalization( )
: 소멸이 보류된 인스턴스의 finalize 메소드 호출을 요청.
Object 클래스 - 인스턴스 비교
📌 public boolean equals(Object obj)
: 내용 비교가 이뤄지도록 오버라이딩하라고 존재하는 메소드.
인스턴스 내용을 비교할 때 오버라이딩해서 사용 가능.
(참조 변수의 참조 값을 비교할 때는 == 연산 사용.)
📄 EqualTest.java
package object;
class Student {
int id;
String name;
Student(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) { // obj가 Student인지 확인.
Student s = (Student)obj;
// id 비교.
if(id == s.id) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
@Override
public int hashCode() {
return id;
}
}
public class EqualsTest {
public static void main(String[] args) {
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false : 주소값이 같은지 비교.
System.out.println(str1.equals(str2)); // true : 문자열이 같은지 비교.
/* equals()의 원형은 ==과 같음.
위의 equals()는 재정의 된 것으로 문자열을 비교해 값을 반환함. */
System.out.println(str1.hashCode()); // 99162322
System.out.println(str2.hashCode()); // 99162322
/* 재정의 된 equals()의 값이 true이면, 동일한 hashCode() 반환 값을 가져야 함.
논리적으로 동일함을 위해, hashCodr() 메서드를 재정의해 동일한 값이 반환되도록 함. */
System.out.println(System.identityHashCode(str1)); // 1554547125
System.out.println(System.identityHashCode(str2)); // 617901222
/* System.identityHashCode() : 고유한 hashCode를 반환하는 메소드. */
Student s1 = new Student(1, "jin");
Student s2 = new Student(1, "jin");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
/* equals()를 오버라이딩하여 값을 비교하도록 해야 함. */
System.out.println(s1.hashCode()); // 1
System.out.println(s2.hashCode()); // 1
/* hashCode()를 오버라이딩하여 equals()가 true일 경우 같은 hashCode를 반환하도록 해야 함. */
}
}
Object 클래스 - 인스턴스 복사(복제)
📌 protected Object clone( ) throws CloneNotSupportedException
: 호출된 메소드가 속한 인스턴스의 복사본을 생성하고, 복사복의 참조 값을 반환.
📌 Cloneable 인터페이스를 구현한 클래스의 인스턴스만 clone( ) 호출 가능.
📌 interface Cloneable
: 복사해도 괜찮다고 표시하는 마커 인터페이스(Marker Interface).
📌 메소드 오버라이딩을 통해 접근 범위 넓히기 가능.
: protected → public 가능.
(public → protected 는 불가능.)
📄 CloneTest.java
package object;
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "x = " + x + " y = " + y;
}
}
class Circle implements Cloneable {
Point point;
private int radius;
public Circle(int x, int y, int radius) {
point = new Point(x, y);
this.radius = radius;
}
public String toString() {
return this.point + " r = " + radius;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Circle circle = new Circle(10, 20, 5);
Circle cloneCircle = (Circle)circle.clone();
System.out.println(System.identityHashCode(circle)); // 1159190947
System.out.println(System.identityHashCode(cloneCircle)); // 925858445
System.out.println(circle); // x = 10 y = 20 r = 5
System.out.println(cloneCircle); // x = 10 y = 20 r = 5
}
}
'Java > Java' 카테고리의 다른 글
[Java] BigInteger 클래스와 BigDecimal 클래스 (0) | 2022.10.17 |
---|---|
[Java] 래퍼 클래스(Wrapper 클래스) (0) | 2022.10.17 |
[Java] 자바의 메모리 모델 (0) | 2022.10.17 |
[Java] 인터페이스(interface) (1) | 2022.10.15 |
[Java] 템플릿 메서드 (0) | 2022.10.15 |
댓글